GOOD signed by the product owner and the auditor · 25-09-2026
Conclusion. Easy Accounts is a monthly questionnaire that turns into financial statements. Once a month, an owner types about 50 figures for their business into one form: sales, purchases, expenses, cash, debts and assets. The site then shows them an income statement, a balance sheet, a break-even figure, a one-line cash flow and ten ratios, all computed from that month's figures. A second tab shows a presumptive-tax estimate and a guide to registering a business. There is no daily bookkeeping, no ledger, no sharing with an institution and no multi-person business in use (B-W2, B-C20, B-S7). In practice, one person = one set of books: figures are kept per login. The code has businesses and advisers, but no one in Uganda ever created one (B-W2, B-W17). The administrator configures everything through editors: the questionnaire, the statement lines, the formulas, the tax bands, the texts and translations, and who sees which tab. Several calculations carry known defects, marked legacy defect below.
What it is for. It explains the tool and lets a person register or sign in.
What the person sees (capture landing-legacy.png):
Signing in and signing up happen on Keycloak, not in Easy Accounts (B-C31, B-S3):
finance.What it produces. A signed-in session. (Which page opens first was not walked.)
Numbers today. 430 accounts exist. 333 people ever opened the app, and 169 typed a non-zero figure (B-W1).
What it is for. A picture of the business over time.
What the person sees. Four charts, titled "Cash in hand and bank (Cashflow)", "Operating expenses", "Your monthly profit (Net income)" and "What customers owe you". A year and month picker (B-C16). No capture of the legacy dashboard exists (B-U3), so its layout is not described here.
Rules.
What it is for. The one place the owner types figures. Everything else is computed from it.
What the person does, step by step (capture transactions-legacy.png):
Beside the questionnaire name are three buttons: a blue settings button (not walked), print and CSV (captures).
The form, section by section (live site, 24-09-2026):
| Section | Lines the owner types | Computed lines |
|---|---|---|
| SALES | Cash sales · Credit sales | Sales of the month |
| COST OF GOODS SOLD (PURCHASES) | Opening Inventory (stock) · Cash purchases · Credit purchases | Closing Inventory (stock) · Cost of goods sold |
| OPERATING EXPENSES | Salaries · Travel costs · Rent · Insurance · Repairs and maintenance · Office supplies · Advertising and marketing · Electricity · Water · Phone and Internet · Fuel · Municipal fees · Depreciation · Staff Welfare · Bad debt written off · Professional fees · Subscription fees · Other Operating Expenses | Total Operating Expenses |
| FINANCIAL EXPENSES | Interest expense | — |
| CASH AND BANKS | Cash at hand · Cash at banks | Total Cash |
| RECEIVABLES | Payment from debtors · Other Receivables | Credit Sales from Customers · Total Accounts Receivable |
| INVENTORY | Inventory of goods | — |
| LIABILITIES | Bank Loans < 12 months · With interest · Interest free (e.g., loans from friends and family) · Payments to Suppliers · Commissions due · Taxes and fees due · Pension Funds due · Accrued Expenses · Bank Loans > 12 months · Non-Bank Loans > 12 months | Non-Bank Loans < 12 months · Total Loans Payable < 12 months · Credit Purchases from Suppliers · Total Trade Payables · Total Current Payables · Total Loans > 12 months |
| FIXED ASSETS | Furniture · Machinery · Equipment · Vehicles · Land · Building · Intangible Assets | Total Fixed Assets |
| TAXES | Tax expenses | — |
The live site differs from the export of 22-07-2026. The export has 13 operating expenses and 6 fixed assets. The live site has five more expense lines and "Intangible Assets", and relabels "Interest Paid" and "Total Accounts Payable" (B-S1). Closing Inventory (stock) was a typed line in the export but is computed on the live site, and its live formula is not in the export. Any carry-over needs a fresh export.
Rules, with the invented January example. Ada Example Bakery types cash sales 941,000 and credit sales 628,400.
/budgets/ because the code calls a questionnaire a "budget set". The screen has no plan-versus-actual switch (capture): the owner types one figure per line, which the screen calls "real" (mapping F8; 06 Q5 is answered there).Paymenttoproviders, that exists nowhere. So the total leaves out trade payables, and it also leaves out accrued expenses (B-N7).What it produces. The month's typed figures. Every screen below reads them.
Sharing. Each month has an on/off "share" flag for an institution. No one ever switched it on, and no institution is configured (B-S7, B-C23).
What it is for. Reading the month's result and position without accounting knowledge.
What the person does. Opens Financial statements, picks the month and year, and reads. Every line has a lightbulb (its formula) and an (i) (help). Nothing is typed here (capture financial-statements-legacy.png).
What they see, top to bottom (active set, 74 lines; B-C6):
| Block | Lines | How it is computed |
|---|---|---|
| Income Statement – summary | Revenue1 · (−) Expenses · (=) Net income | Revenue1 = sales of the month. Expenses = cost of goods sold + the export's 13 operating expense lines, named one by one + interest + tax expenses (export formula; whether it picks up the 5 lines added live is not in the export). Net income = Revenue1 − Expenses (after tax). |
| Balance Sheet – summary | Current Assets · Fixed Assets · Total Assets · Current Liability · Long Term Liability · Equity · Total Liability and Equity | Current assets = cash + banks + credit sales + other receivables + inventory − payment from debtors. Equity is the balancing figure (total assets − liabilities), so this summary always balances. Its Current Liability leaves out trade payables and accrued expenses (D1). |
| Break-even | Break-Even | Operating expenses ÷ (1 − cost of goods sold ÷ sales). Financial expenses are left out (B-W11). A non-finite result shows 0. |
| Cash flow | Cash Flow (one line) | Net income + interest + Paymenttoproviders (always 0) − receivables. Legacy defect: this is not a cash movement and reads no cash line (B-W9). |
| Income Statement – detailed | (+) Sales · (−) Cost of goods sold · (=) Gross Profit · (−) Operating expenses and Financial Expenses · (=) Profit before tax · (−) Tax Expenses · Net Income | Top to bottom, as labelled. |
| Balance Sheet – detailed | Current assets (cash, receivables, inventory) · Fixed term assets ("Furniture, Machinery and Equipment"; vehicles; "Land and Building"; total) · Current liabilities (loans < 12 months, commissions, trade payables, taxes and fees, accrued expenses, pension funds) · Non-current liabilities · Equity (owner's equity, net income) · Totals | Owner's equity = total assets − total liabilities − net income after tax. Total equity = owner's equity + a pre-tax net income. (D12) "Furniture, Machinery and Equipment" shows the furniture line only, and "Land and Building" the land line only; machinery, equipment and building count only in the total, so the lines do not add up to it. |
| Financial Analysis – ratios (10, in 5 groups) | Activity: inventory turnover, receivables turnover · Liquidity: current ratio, acid test · Debt: debt on assets, debt-equity · Profitability: ROA %, ROE % · Others: working capital, net profit margin % | Each is a formula on the lines above (B-C7). With no liabilities, the current ratio shows 0 (B-C10). |
Legacy defects on this page:
What it produces. A read-only set of statements for the month. The same three buttons as on Transactions sit beside the questionnaire name: settings, print (PDF, with page breaks set per line by the administrator; 06 §1.2) and CSV. Getting data out: print and CSV; what the CSV holds was not walked.
What it is for. Estimating the presumptive income tax, and learning how to formalise and where to find finance. The page is at /taxes, and one page shows all five entries (B-W24).
What the person sees and does.
Rules.
What it produces. Two tax estimates per year and reference content. Nothing is stored.
There is no profile page in Uganda's configuration (B-C30; the captured /profile/ answered "not found", B-U1). The name and email come from Keycloak. The name menu's contents were not walked; signing out ends the Keycloak session. The language choice lives in the browser, not on the person (B-C33).
The administrator is a Keycloak account with the admin role (06 R3). Today there are 10 admins in the app, 5 with the Keycloak sysadmin role, 11 people in all (B-N4). They see the same tabs as an owner, plus the admin menus. Every change they make is journaled with its before and after (B-C28).
| Area | What the administrator does | Rules |
|---|---|---|
Questionnaire and statements editor (the template editor, capture template-editor-legacy.png) |
Sees the questionnaire (left) and the statement lines (right) as trees of sections and lines, with their order numbers. Adds, edits, reorders or removes a line. Edits one line in a dialog (capture edit-question-modal-legacy.png): title per language (Luganda / English tabs), type (input, formula, percentage, group; statement lines: linked, formula, group), math prefix ((+), (−), (=), display only), bold style, total period type (sum / last / average), print page break, key, show decimals, format as percentage, and a formula built by searching lines and operators. Each term can read another month through a "Period(s)" offset (capture; 06 R9); the active questionnaire uses none (B-W7). Can copy a whole questionnaire (B-C25). |
Legacy defect (D10): the key joins a line to its stored figures and to every formula. Renaming a key breaks formulas silently (06 R11); keys are generated from the name and are not checked by the server. Formulas are checked only by a trial run that must not be "not a number" (06 R9). Several live keys are Spanish (sueldos, alquileres…) and hold most of the data (B-N23). |
| Chart of accounts | One instance-wide chart, admin-only, of 71 accounts in four levels (B-C29). Owners never see it (B-C36). | Only 16 accounts are linked to the questionnaire, 4 of them deleted; 34 of 59 lines have no account (B-C29). The chart plays no part in the statements. |
| Taxes | Defines each tax: its base formula, its bands (lower and upper limit, both inclusive) and one formula per band, and its period (annual, quarterly, monthly). The three content pages of §6 are also "taxes", with text and no formula (09 F6). | The engine takes the first band that matches (06 R12). The "without records" rule stores duplicate band rows (B-C11). |
| Site texts | Homepage (title, sentence, list, buttons, tiles, top notice), footer (disclaimer, email, phone, show/hide), footer logos, instance name and logo, Google Analytics tag (B-C15, B-C17, B-N18, B-N21). | Every text is a translation row per language (06 R16). A top notice exists and is switched off (B-N18). |
| Languages and translations | Turns languages on and off. Edits any label in any language. | English is the default. Luganda is on, with 10 non-empty strings (B-W5). French, Spanish and an unnamed "Arabic" row are off (B-C18). |
| Help | Edits the two tutorial sets and binds a tutorial to a screen or line (B-C19). | — |
| Dashboard charts | Picks which charts show and which figure each plots (B-C16, B-N16). | — |
Who sees what (/manage/user-permissions) |
Turns feature switches on or off per person: 16 switches, such as taxes, accounting and registrations (B-W15). | Switches narrow screens; they are not evidence of use (B-N20). |
Not used in Uganda, although the code has them (B-C20, B-W13): daily accounting ("writings"), contacts, registrations held, benefits, the wallet, businesses with several people, and advisers. All hold 0 rows.
| # | Defect | Where | Source |
|---|---|---|---|
| D1 | A key named in a formula but defined nowhere counts as 0, silently. "Total Accounts Payable" and the summary balance sheet's "Current Liability" leave out trade payables and accrued expenses; the detailed balance sheet includes both, so the two current-liability figures differ | §4, §5 | B-N7; export formulas |
| D2 | The detailed balance sheet balances only when tax expenses are 0 | §5 | B-N12, N13 |
| D3 | The one-line cash flow is not a cash movement; the "Cash in hand and bank" chart plots it | §3, §5 | B-W9, W10 |
| D4 | Opening a month pre-fills 0 everywhere; a 0 cannot be told from "not answered" | §4 | B-W16, N9 |
| D5 | Year totals sum month-end balances | §4 | B-W6 |
| D6 | Receivables and payables do not carry over from month to month | §4, §5 | B-C4, N14 |
| D7 | Four key-less input lines sit in the definition with no section; they never show and never hold a value | §4 | B-N6 |
| D8 | Any formula error shows 0, never a warning | §4, §5 | B-C37 |
| D9 | Text typos: "URBS", "Uganda Revenue Agency" | §6 | B-C13 |
| D10 | Renaming a key breaks every formula that uses it, silently | §8 | 06 R11 |
| D11 | Above 150,000,000 of annual sales, the presumptive estimate shows 0 instead of saying the standard income tax applies | §6 | 06 R12 |
| D12 | Detailed balance sheet: "Furniture, Machinery and Equipment" = furniture only; "Land and Building" = land only; the lines do not add up to Total Fixed Assets | §5 | export formulas |
Not walked for this document: the dashboard (no capture), the PDF and CSV output, the blue settings button, which admin menu (Settings or System) holds each editor, and the [ ] switch.
spec-lean/01-easy-accounts-today.md