AggregateDocs
Use it

Known limits: what Aggregate doesn't do yet, and what happens instead

Short answer: Aggregate is early. This page lists what it doesn't do, or does imperfectly, today. For each one it says what happens instead, so nothing is quietly wrong, and what's coming where something is planned. For how each number is counted, see Definitions.

Crypto

Today: Coinbase connects read-only on a self-hosted server, with a Coinbase Developer Platform API key that has only the View permission (a key that can trade or move money is refused). The hosted app doesn't offer Coinbase yet: it needs Coinbase sign-in, which Coinbase gives to approved partners. Other exchanges and wallet addresses don't connect. A crypto account that a bank connection reports shows up as a crypto account.

What happens instead:

Coming: Coinbase sign-in on the hosted app, once Coinbase approves Aggregate's OAuth client.

Banks outside the US

Today: bank connections through Plaid are for US banks and brokerages. Outside the US, Wise is the one account you can connect directly.

What happens instead: upload statements. Aggregate imports CSV (comma decimals and day-first dates included; when the date order is ambiguous it asks instead of guessing), OFX, QFX, QBO and ISO 20022 (camt.053 and camt.052) files from any bank.

Coming: no date yet for a direct non-US bank connection.

Cash sales in Square

Today: Square payments taken in cash, or with an "other" tender such as a check, are imported into a Square cash drawer account for each location (cash on hand). They count as sales when they're rung up, and a refund paid back in cash comes out of the drawer and lowers sales.

When you deposit the cash: the bank deposit is matched to the drawer's sales it adds up to, oldest first, and less any cash refunds. You confirm the match in Review, and the drawer goes back to zero.

Still a limit: the drawer only knows what went through Square. Cash taken without ringing it up, change kept in the drawer, or a deposit that mixes takings from several days in a different order may need a word in Review.

PDF bank statements

Today: PDF statements import automatically for 11 statement layouts:

A PDF is imported only if its rows add up exactly to its opening and closing balances.

What happens instead: any other PDF is saved as a document and nothing is imported from it. That covers another bank's layout, a scan, a statement whose rows don't add up, or a file over 60 pages. Your AI can read it and add what it finds, or you can upload the bank's CSV. Password-protected PDFs are refused.

Coming: more layouts.

CSV statement uploads

Today: a bank's CSV export doesn't include the card or account number. Two cards from the same bank uploaded as CSV (for example two Chase cards) go into one account.

What happens instead: OFX, QFX and QBO downloads include the number, so they stay separate. Upload those, or choose the account when Aggregate asks "Which account is this statement for?".

Cap tables

Today: cap tables import from Pulley's cap-table workbook, Carta's and Mantle's OCX export (.xlsx), CSV ledgers and Open Cap Table Format (OCF) JSON. Old .xls and password-protected files aren't read. There's no live connection to Pulley or Carta.

What happens instead: an OCX file, or a workbook with only a summary tab, is a snapshot. It imports each holder's holdings on one date, with no issue prices, vesting or grant history, and its options come in as NSOs. The import says so. A snapshot is never stacked on holdings that are already there, so nothing is counted twice. See Moving off Pulley? Bring your cap table.

Coming: no date yet for a direct Carta connection.

Two places where money is counted differently

Today: two exceptions in Definitions:

What happens instead: connect the processor or the card, and both are counted the normal way.

Money a processor holds

Today: cash counts a processor's whole balance, including funds still pending. On Stripe it also counts funds reserved for connected accounts. So part of it may not be spendable yet. list_accounts shows each account's available amount next to its balance.

What happens instead:

A sale in both a processor and your accounting books

Today: if a customer's payment shows in Stripe and also in QuickBooks, Xero or FreshBooks, it counts in both until you say they're the same.

What happens instead: when the amount and customer name agree, Aggregate asks in Review. Once you confirm, it counts once. If the names differ, it doesn't ask, so the sale stays counted twice. The revenue check against your accounting books won't catch this.

Loan payments

Today: Aggregate doesn't split a loan payment into principal and interest. What happens depends on what your lender sends:

A loan's balance isn't checked against its rows, because interest raises it with no row behind it.

Several companies added together

Today: reports (profit and loss, balance sheet, cash flow) are per company; there is no combined report for a group. Figures asked for several companies at once (cash, burn, revenue) add the companies up. Money moved between your companies is booked as owed between them once matched (Aggregate suggests the match in Review when it sees both sides), not as sales or spending, so combined cash and net burn come out right. But an invoice or bill between two of your own companies counts as revenue in one and spending in the other, so combined revenue and gross burn include it twice (net burn is unaffected: the two cancel).

What happens instead: read revenue and gross burn per company, or leave invoices between your own companies out of the connected books.

Currencies

Today: each company keeps its books in one currency, which you choose when you create it. It can't be changed once the company has accounts. Other currencies are converted at the European Central Bank's daily reference rates (through Frankfurter), on the date of each figure. On days without a rate, the most recent one from the 7 days before is used.

What happens instead:

Coming: no date yet for currencies outside the ECB's list.

How stale data is shown

Today: a source that hasn't synced in over a day is called stale. Every figure is as of the oldest successful sync among the sources behind it.

What happens instead: stale data is never quietly mixed in.

Self-hosting on SQLite

Today: hosted Aggregate runs on Postgres with row-level security. Every query is limited to one workspace by the database itself, beneath the app's own permission checks. A self-hosted install on SQLite (the default for npm start and npx aggregate-finance demo) doesn't have that second layer. It relies on the app's checks alone.

What happens instead: run self-hosted Aggregate on Postgres (DATABASE_URL=postgres://…) to get row-level security. A self-hosted database usually holds just one person's workspace anyway. The numbers are the same on both: a test compares SQLite and Postgres figure by figure.

Providers not live on the hosted version yet

Today: some providers are waiting for the provider's own approval, or for keys:

What happens instead:

Coming: each opens on hosted as soon as its provider approves it.

© 2026 Aggregate Finance LLC