UK self-employed (sole trader) tax rules for this invoicing app - income tax bands, personal allowance taper, Class 2/4 NIC, cash basis, payments on account, more than one trade, trading allowance, Making Tax Digital, invoice content. Use before changing anything under src/utils/taxCalculator.ts, the Dashboard or Accounting pages, expense handling, or PDF invoice content, and when writing or reviewing tax tests.
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
The app's owner is a UK sole trader in England with two separate trades
(AI research consulting for an overseas client, and ceramics teaching for a
UK studio). See README.md for the full use case. All rules below are for
England (Scotland has different income tax bands).
references/rates-2026-27.md with its gov.uk source. If a rule you need is
not there, say so in the PR and leave a TODO(tax-source) comment; do not
guess.evals/compliance/
with the source URL and a hand-worked example in a comment.| Topic | Rule | Where it bites in this app |
|---|---|---|
| Income tax bands | Bands apply to income after allowances: 20% on the first £37,700, 40% up to £125,140, 45% above. | calculateUKSelfEmployedTax uses gross-profit thresholds (£50,270), which only works when the full allowance applies. |
| Allowance taper | Personal allowance falls £1 for every £2 of income over £100,000; zero at £125,140. | The taper is applied but the bands are not re-based, so tax is understated above £100k. |
| Class 4 NIC | 6% on profits £12,570-£50,270, 2% above. Charged on total profits across all trades. | Correct today. |
| Class 2 NIC | Not payable if profits are £7,105 or more (treated as paid). Below that, voluntary at £3.65/week to protect the State Pension record. | Code says "abolished". The ceramics-only years can fall below £7,105, so the app should mention the voluntary option. |
| Cash basis | Standard for sole traders: income counts when received, expenses when paid. Traditional (accruals) accounting is an opt-out. | Paid income is grouped by invoice date; must be grouped by paid date. |
| Taxable profit | Profit = income received minus allowable business expenses. Only the business part of mixed-use costs is allowable. | The Dashboard projects tax on income alone, ignoring recorded business expenses. |
| Payments on account | Two payments, 31 Jan and 31 Jul, each half the previous year's bill. Not needed if last year's bill was under £1,000, or more than 80% was collected at source. Balancing payment: 31 Jan after the tax year ends. | Dates for a year are mislabelled, and payments on account are always shown, even when the £1,000 rule means none are due. |
| More than one trade | A separate self-employment page per trade. Losses in one trade cannot be set against another trade's profits for Class 4; they carry forward against the same trade. | All invoices are pooled; nothing records which trade an invoice, expense or loss belongs to. |
| Trading allowance | £1,000 against gross trading income from one or more trades, instead of expenses (not both). Cannot create a loss. | Not modelled. Relevant for a small-turnover ceramics year. |
| Making Tax Digital | Required if qualifying income is over £50,000 (2024-25, from Apr 2026), £30,000 (2025-26, from Apr 2027), £20,000 (2026-27, from Apr 2028). | Not modelled; a warning when projected income crosses a threshold would help. |
| Other income | Employment (PAYE) income in the same year uses the personal allowance and bands first. | The projection assumes self-employment is the only income. At minimum, warn. |
| Invoice content | A non-VAT-registered invoice must show: unique number; your name, any business name, address and contact details; customer name and address; description; supply date; invoice date; amounts and total. | Check PDF components (src/pdf/) against this list. |
references/rates-2026-27.md.evals/compliance/ first, with source and worked
example.src/utils/.npm run check (regression gate) and npm run eval:compliance.tests/ so it
becomes a regression guard.mmtsfasman/adulting-invoicing-app-demo
44d2daf
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.