Skip to content
Finanly

Reconciliation engines

One deposit. Every cent accounted for.

A payout is never one number. Finanly unpacks it into the lines your ledger needs — charges, refunds, fees, adjustments, disputes — and proves they sum to the bank.

Cent-exact payout decompositionDispute lifecycle polled dailyBT-Unreconciled invariant enforced
  • Runs on your own hardware
  • AI never writes SQL
  • Tenant isolation by Postgres RLS
  • Every irreversible action audited
  • Statements parity-gated hourly

Reconciliation is where bookkeeping quietly goes wrong. We made it loud: an invariant that fails the run if a single bank line is left unreconciled.

Shopify payouts

Charges, refunds, fees, adjustments, disputes — on the right accounts.

Each payout is decomposed into journal lines by type. Balance adjustments and chargebacks are tracked through their lifecycle; the dispute poller runs every morning so the ledger reflects holds and releases.

  • Journal lines per payout component
  • Dispute holds and releases tracked daily
  • Batch-match pending payouts in one run

Flexport billing, bills and receipts

Flexport bills and ad receipts, already invoices.

Flexport billing rows become purchase invoices and payment entries. Meta ad receipts and Google Workspace invoices are ingested from email every hour into outstanding purchase invoices, ready to match the card line.

  • Hourly receipt ingestion
  • Purchase invoice + payment entry pairs
  • Idempotent: re-runs never duplicate

Verified in production

Reconciled on a real coffee business.

100%of payouts in the last verified run reconciled to the cent
24hdispute lifecycle polling cadence
1hreceipt ingestion cadence for ad and workspace invoices
0bank transactions allowed to stay unreconciled by the invariant

FAQ

Straight answers

Does this work for any Shopify or Flexport store?

The engines are built and verified on one live coffee business today; the account mapping is per-tenant. Other tenants use the standard categorization flow until their mapping is configured. We'd rather say that than 'works everywhere'.

What if a payout doesn't sum?

The run fails the invariant and surfaces the difference. Nothing is posted until it balances — the bank line stays unreconciled and visible instead of being forced.

What does a payout decompose into?

Charges, refunds, fees, adjustments and disputes, each as its own journal line on its own account, plus the payment entry that clears the bank transaction. Balance adjustments and chargebacks carry their lifecycle state.

How are disputes handled?

A dispute poller runs every morning at 02:50. Holds and releases are recorded as they happen, so a chargeback that reverses two weeks later doesn't leave a phantom receivable.

What does Flexport reconciliation do?

Flexport billing rows become purchase invoices and payment entries in the ledger, keyed by a stable row id so a re-run never duplicates a bill. Credits are routed to the right invoice.

Which receipts are ingested from email?

Meta ad receipts and Google Workspace invoices, polled hourly from the mailbox and created as outstanding purchase invoices ready to match the card line. Other vendors attach manually to the transaction.

Can I re-run a reconciliation safely?

Yes. Every posting carries an idempotency key checked in Finanly's database, at the connector and against the ledger. A re-run over the same period is recorded as skipped: already done.

What's the 'BT-unreconciled invariant'?

A check that fails the run if any bank transaction in scope is left without a matching ledger entry. It turns a quiet bookkeeping gap into a loud failure you see the same day.

Does it handle inventory and COGS from Shopify orders?

That's the fulfilment side: Shopify fulfilments become stock entries and COGS is recognised per fulfilment. See ERP Made Easy for inventory; this page is about money in and money out.

Stop explaining the payout line.

Private beta. Tell us where to send your access, and which company you close first.