Engineering

We built the accounting system we needed

Why we built it

We were spending about $7,000 a year to get our tax work done, and we still did not know what we owed until year end. Before anyone could prepare the return we had to collect receipts, close invoices, and reconcile data spread across Stripe, Square, our banks, credit cards, and payroll.

We needed one system that could:

  • keep the receipt required for every GST/HST input tax credit;
  • close invoices when the matching payment arrived;
  • split Stripe and Square payouts into sales, taxes, tips, and fees;
  • connect every bank and credit-card account;
  • track tax paid through purchases and payroll;
  • track HST collected, input tax credits, and HST remittances; and
  • show the amount owing throughout the year.

We looked at building on QuickBooks first. API access requires an application and approval, and once you have it there is no reconciliation endpoint. You can read and write transactions but you cannot reconcile an account through the API, and reconciliation is the step that proves the books against a bank statement. That was the part we most needed to automate.

We also wanted the books to be transparent: every number traceable to the record behind it, and every change attributable to whoever made it.

A Square deposit is not revenue. It can include sales, HST, and tips, less processing fees. Equated records those parts separately and tracks the HST until it is remitted. Stripe payouts are handled the same way. Once that data was in one ledger we could see revenue recognition clearly and give accounting agents access through MCP.

Agents prepare the work and people approve changes to the books. We learned why the hard way: an agent matching three months of Shopify Ads receipts to card charges went one slot off on the first match and stayed off for ninety of them, and QuickBooks accepted every one. In Equated a person or an agent can propose a match, but nothing posts until someone confirms it. If there is no reliable match, the receipt stays unmatched.

What a ledger entry records

Equated uses a standard double-entry ledger. Each posting records an account, the original currency and amount, the company's base-currency amount, and the exchange rate between them. Account balances are calculated from those postings instead of being stored separately.

The database checks that the original amount, exchange rate, and base amount agree to within one cent. Journal entries must balance to zero in the base currency.

Entries are draft, posted, or void. Drafts can be edited. Confirmation posts an entry. Posted entries are never rewritten; they can only be voided or corrected with another entry.

Chase
Bank transaction detected
Chase •• 4451 · bt_7201 · -$342.17
received
Receipt matched
aws-invoice-2026-02.pdf → bt_7201 · confidence 0.96
prepared
Operator
Match confirmed: journal entry created
5200 Cloud Services Dr $342.17 / 1010 Chase Cr $342.17
confirmed
What sits behind one posting. Every posting links to its source, such as a bank transaction, receipt, invoice, or payroll run.

Corrections do not overwrite history

Posted entries cannot be edited in place. A correction creates a new entry, which keeps the original record intact.

To change a posted entry, a user first unposts it. Equated creates a draft correction linked to the original. If the user makes a change, Equated posts only the difference. The correction keeps the original entry's date, so reports update in the correct period.

The current value is the original entry plus all posted corrections. The database allows only one open draft correction for an entry at a time.

Original · posted
JE 4412
Software & SaaS DR 42.18
Chase 4451 CR 42.18
Correction · posted
JE 4478 → corrects 4412
Software & SaaS CR 42.18
Marketing DR 42.18
Effective · derived
4412 + 4478
Marketing DR 42.18
Chase 4451 CR 42.18
One charge, recategorized. The original and the correction both remain available, so a person or an agent can see what the books said before, what changed, and who approved the change.

Review before posting

Agents connect through MCP. They can read the books and prepare work such as categorizing a charge, attaching a receipt, closing an invoice, or voiding an entry. They cannot post directly to the ledger.

Each proposed change shows the accounts, amounts, and exchange rate that will be used. A person confirms it before it posts. Equated keeps the request, the preview, the result, and the identity of the person who approved it.

Each preview includes the version of the records used to prepare it. If any record changes before confirmation, the preview is rejected as stale. Unused previews expire after one day.

Confirmed actions are also idempotent. Retrying the same action returns the first result instead of posting it twice. This makes normal agent retries safe.

No. 0042 10:42 · Today
Agent
Categorize $42.18 from Vercel as Software & SaaS. Last 3 charges from this vendor were categorized the same way.
Journal entry Preview
Dr 💻 6100 Software & SaaS $42.18
Cr 🏦 1010 Stripe Operating Account $42.18
Activity
10:42 AM · You · Categorized $42.18 Vercel
10:18 AM · You · Matched receipt to Linear
The loop: an agent prepares, a person confirms, the ledger records both.

Import the data without guessing

Each integration has a cutover date. Stripe, Square, payroll, and other sources import records from that date forward because older activity is already included in the opening balances.

Bank feeds import all available history and apply the cutover when the data is read. That lets us move the cutover date without creating a gap in bank history.

For banks that aggregators do not support, Equated connects through a read-only API token or a browser sign-in. Both methods return the same account and transaction format. Browser profiles are isolated by company and login, so changing the login creates a new profile instead of reusing the previous person's session. Browser-based syncs sign in again on every run, and credentials are stored encrypted and decrypted in memory only for the sign-in step.

Browser sign-inAPI token
What it signs in withThe customer's password, plus an emailed codeA read-only token the customer creates and pastes in
How it readsA real browser on a residential addressThe bank's own API
How often it runsOnce every twelve hoursEvery thirty minutes
A bad credentialFails mid-run, and asks the organization to reconnectRejected in the connect dialog, before a connection is saved
Two arms, one output. Whichever way a bank is read, the sync produces the same account and transaction format.

Some banks send every amount as positive and put the direction in a separate transaction type. We map every supported type explicitly. If the direction is unknown we stop the import rather than guess whether money came in or went out.

Declined, cancelled, and failed transactions are not imported. If a provider later removes a transaction, Equated deletes draft entries, voids posted entries, and leaves reconciled entries unchanged. The connection screen only lists institutions we can support.

Reconciliation closes the period

A reconciliation covers one account through a statement date. It records the previous verified balance, activity since then, the new statement balance, and any difference. Reconciliations must be completed in order.

While it is open, Equated recalculates those amounts whenever the reconciliation is viewed. Late transactions are included automatically. The final values are saved when the reconciliation is completed.

Completion requires a statement balance, no unconfirmed transactions, and a zero difference. A user can explicitly accept a non-zero difference, and Equated records it as a discrepancy rather than a match.

Once an account is reconciled, earlier entries stay closed. No entry dated on or before the statement date can post to that account unless the reconciliation is reopened. Agent previews are checked against the same lock before a person confirms them.

This lock currently covers accounts backed by bank feeds. It is not yet a company-wide closed-period lock.

Connect the books to the tax return

Each account is mapped to a line on the corporate tax return. Canadian companies can map accounts to more than 400 GIFI codes. US companies use Form 1120 line numbers. The API and reference documentation use the same catalog.

The same ledger also makes revenue recognition visible. Revenue, deferred revenue, invoices, and payments stay separate, so a cash deposit does not have to stand in for earned revenue.

Your chart Every line of the Form 1120
  • 💵 Equipment sales 1,412,600 Gross receipts or sales 1a
  • 🏢 Office rent 36,900 Rents 16
  • 🧑‍💼 Contractor fees 74,200 Other deductions 26
  • 📣 Ads and sponsorships 28,400 Advertising 22
  • 🍽️ Client meals 6,300 Other deductions 26 You confirmed

All 74 categories carry a line. The handful that needed a decision were decided during the year, not in April.

PDF Form 1120 · 2025 Assembled, ready for CPA review
The chart is the mapping.

A confirmed mapping takes priority over a default or a name-based suggestion. Built-in accounts start with confirmed mappings. An unmapped account can inherit from its parent category; if it still cannot be mapped, Equated asks the user.

Tax adjustments are applied in the return. Half of a meal expense is added back on Schedule 1, and fines are not deductible. The ledger also determines which tax questions are relevant, and questions that are not triggered stay available but are collapsed by default.

Form 1120
Department of the Treasury
Internal Revenue Service
U.S. Corporation Income Tax Return
For calendar year 2025
2025
Proof of concept, not for filing
All 62 computed amounts verified against source records
Name
Northwind Supply, Inc.
Number, street, city or town, state, and ZIP code
812 Harbor Way, Unit 5, Oakland, CA 94607
B Employer identification number
88-1234567
C Date incorporated
Jun 8, 2018
4 Dividends and inclusions (Schedule C, line 23)
6 Gross rents
7 Gross royalties
8 Capital gain net income (attach Schedule D)
Click any line to see the record behind it.
Form 1120 · line 1a

Gross receipts or sales

1,847,300 From the ledger
Accounts
4000 Equipment sales 1,412,600
4100 Installation and service 434,700
Sum of the account balances
Journal entries
Feb 3 Meridian Dental 12,500.00
INV-2026-0119.pdf
Feb 11 Lakeshore Veterinary 3,300.00
INV-2026-0121.pdf
Feb 18 Fairview Family Practice 8,750.00
INV-2026-0124.pdf

Showing 3 of 284 entries in this account.

The return, and one line opened. The Canadian return computes from the books today. The American one ships as the form, the line catalog, and the questions, with nothing routing a ledger onto its lines yet.

A return will not build if an account is unmapped, a required question is unanswered, a carry-forward balance is unused, or the totals do not reconcile to the ledger. Filing saves a fixed snapshot. Amendments are stored as new revisions instead of changing the filed return. Our tests rebuild a real 2024 return from its books, compare every line with the filed return, and verify that known accounting errors are rejected.

The current forms are marked "proof of concept, not for filing." Filing opens with FY2026 returns, spring 2027. Equated is accounting software, not an accounting firm. The optional filing service is reviewed by licensed CPAs.

We use it for our own books

Equated currently runs alongside QuickBooks for Hyperspeed's books. QuickBooks stays in place until a full parallel year matches entry for entry.