Reference
JSON file format
The app reads one ledger JSON file. It is a single object holding arrays of wallets, invoices, tax payments, withdrawals and totals. Send every collection you have — anything missing is simply treated as empty.
Go to the ledger file page to importComplete example
Copy and replace the valuesledger.json
{
"exported_at": "2026-11-01T09:00:00.000Z",
"Wallet": [
{
"id": "wal_001",
"user_email": "jane.doe@example.gov.uk",
"user_name": "Jane Doe",
"sort_code": "04-00-04",
"account_number": "12345678",
"roll_number": null,
"currency": "GBP",
"balance": 1250.4,
"digital_cash_balance": 300,
"available_credit_balance": 4800
}
],
"MembershipInvoice": [
{
"id": "inv_001",
"user_name": "Jane Doe",
"user_email": "jane.doe@example.gov.uk",
"plan_name": "Standard membership",
"billing_month": "2026-10",
"amount": 25,
"currency": "GBP",
"due_date": "2026-10-31T00:00:00.000Z",
"status": "paid",
"paid_at": "2026-10-28T14:12:00.000Z"
}
],
"HMRCPayment": [
{
"id": "tax_001",
"user_name": "Jane Doe",
"user_email": "jane.doe@example.gov.uk",
"amount": 120,
"note": "Self assessment",
"transaction_id": "tx_8842019",
"created_date": "2026-10-30T10:00:00.000Z"
}
],
"Withdrawal": [
{
"id": "wd_001",
"user_name": "Jane Doe",
"user_email": "jane.doe@example.gov.uk",
"amount": 150,
"withdrawn_to": "Barclays ••4471",
"note": "Monthly cash out",
"reference": "LSP-WD-7KQ2M1",
"created_date": "2026-10-31T16:40:00.000Z"
}
],
"LedgerValueSnapshot": [
{
"snapshot_date": "2026-11-01T00:00:00.000Z",
"total_credit": 98000,
"total_debit": 41250,
"tax_paid": 7600
}
],
"Contact": [
{
"email": "jane.doe@example.gov.uk",
"name": "Jane Doe"
}
]
}Rules
- Money is always a plain number — no currency symbols, spaces or thousands separators. 1250.40, not £1,250.40.
- Dates are ISO 8601 strings in UTC, e.g. 2026-11-01T09:00:00.000Z. Plain dates like 2026-10-31 are accepted too.
- Every collection is an array. A missing collection is simply treated as empty, so you can send only what you have.
- A file is accepted as a ledger when it contains at least one of Wallet, MembershipInvoice, Transaction, HMRCPayment or Withdrawal.
- Net position is worked out from your invoices and settlements, not from the snapshot: invoiced total minus settled non-tax payments, never below zero.
- Encrypted exports are the one exception — that file is the app's own envelope and is unlocked with its passphrase instead.
Wallet
One entry per account. These become the accounts on the Pay page, with their balances.
| Field | Type | Notes |
|---|---|---|
| id | string | Unique id for the account. Keep it stable across exports. |
| user_email* | string | Required. Links the account to its invoices and tax payments. |
| user_name | string | Display name. Falls back to the Contact collection, then the email. |
| sort_code | string | Shown with the account on the Pay page. |
| account_number | string | Shown with the account on the Pay page. |
| roll_number | string | Optional building society reference. |
| currency | string | Defaults to GBP. |
| balance | number | Cash balance held in the ledger. |
| digital_cash_balance | number | Digital cash available to withdraw. |
| available_credit_balance | number | Credit available against the account. |
MembershipInvoice
One entry per invoice line. Paid and unpaid lines appear on the Pay page; paid lines also add a payment to your history.
| Field | Type | Notes |
|---|---|---|
| id | string | Unique id for the invoice line. |
| user_email* | string | Required. Matches the invoice to an account. |
| user_name | string | Display name for the payer. |
| plan_name | string | Becomes the invoice title, e.g. Standard membership. |
| billing_month | string | Billing period, e.g. 2026-10. Used in the payment reference. |
| amount* | number | Required. Amount invoiced, as a plain number. |
| currency | string | Defaults to GBP. |
| due_date | date | ISO 8601 date. Drives the overdue marker. |
| status | string | paid marks the line settled; free lines are skipped; anything else is treated as outstanding. |
| paid_at | date | ISO 8601 date the line was settled. |
HMRCPayment
Tax settlements. Each one becomes a completed digital cash payment in your history.
| Field | Type | Notes |
|---|---|---|
| id | string | Unique id for the tax payment. |
| user_email | string | Payer email, matched to an account. |
| user_name | string | Payer display name. |
| amount | number | Amount paid, as a plain number. |
| note | string | Description shown on the payment. |
| transaction_id | string | First 12 characters become the payment reference. |
| created_date | date | ISO 8601 date the payment was made. |
Withdrawal
Digital cash leaving a wallet. Each entry becomes a completed money-out record in your payment history, and every withdrawal made here is written back into this collection when you download the ledger file.
| Field | Type | Notes |
|---|---|---|
| id | string | Unique id for the withdrawal. |
| user_name | string | Who the withdrawal is recorded against. |
| user_email | string | Payer email, matched to an account when present. |
| amount* | number | Required. Amount withdrawn, as a plain number. |
| withdrawn_to | string | Destination: bank account, wallet or name. |
| note | string | Free-text reference kept with the withdrawal. |
| reference | string | Reference shown in your payment history, e.g. LSP-WD-7KQ2M1. |
| created_date | date | ISO 8601 date the withdrawal was made. |
LedgerValueSnapshot
Totals for the ledger file. Only the most recent snapshot is read, by snapshot_date.
| Field | Type | Notes |
|---|---|---|
| snapshot_date | date | ISO 8601 date. The latest snapshot wins. |
| total_credit | number | Shown as Total credit on the Ledger file page. |
| total_debit | number | Shown as Total debit on the Ledger file page. |
| tax_paid | number | Shown as Tax paid on the Ledger file page. |
Contact (optional)
Used only to resolve display names when a user_name is missing.
| Field | Type | Notes |
|---|---|---|
| string | Matches the user_email on wallets and invoices. | |
| name | string | Display name to use for that email. |
Fields marked * are required. Unknown fields are ignored, so you can keep extra columns in your own data.