Technical product overview

TieOut

TieOut rebuilds a client's bank and credit-card backlog into an import-safe cleanup package: extracted rows, cross-account reconciliation, source proof, books checks, and QuickBooks-ready exports in one workflow.

281+ statement corpus

6 public-bank formats scored at summary level

38,346 ledger distractors

synthetic eval rows used for regression pressure

0 false reconciled

hard gate for extraction tie-outs

0 false cross-account

hard gate for transfer and payout matching

Product system

A real reconciliation product with the engine in view.

TieOut is built around the accounting failure modes that appear only after conversion: internal transfers booked as income and expense, duplicated bank-feed overlap, processor payouts counted twice, missing statement periods, and rows that cannot be traced back to source evidence.

Product wedge

Other tools convert one statement into rows. TieOut owns the cleanup layer around conversion: every account, every month, processor exports, already-booked rows, review exceptions, and a final package that can be handed to a client or imported into QuickBooks.

Engineering bar

The core rule is conservative: no quiet export when arithmetic, source evidence, coverage, or human confirmation is incomplete. The product turns uncertainty into a typed review state instead of letting it leak into the books.

TieOut cleanup workspace overview showing real product navigation, status, notes, and activity.

Product workflow

The workflow is simple; the reconciliation logic is not.

TieOut follows the product path from imported statements to reviewed cross-account proposals to export, and blocks output until the ledger is safe to import. The visible screens are deliberately plain because the hard work is in the graph: accounts, periods, transaction rows, proposal status, evidence links, and export readiness.

01

Public converter

  • Single-statement CSV conversion gives users immediate value without hiding the larger workflow.
  • The converter routes serious cleanup work into a client backlog where cross-account issues can be seen.
  • No-account conversion sits in front of the authenticated workspace so the product has a low-friction wedge.
TieOut public converter screen.
02

Cleanup workspace

  • Each cleanup wraps one client backlog, one processing engagement, and the human review state around it.
  • Status, assignment, notes, and activity give firms a lightweight operating layer around technical processing.
  • Documents, coverage, review, source proof, books check, and export package are first-class workflow stages.
TieOut cleanup workspace overview.
03

Review queue

  • Duplicate rows, unmatched transfers, feed seams, and processor payout issues are surfaced before export.
  • Processor payout matching prevents the bank deposit and payout export from becoming duplicate revenue.
  • Each proposed action is reviewable, reversible, and tied to a typed reason rather than hidden mutation.
TieOut review queue.
04

Source proof

  • Extracted rows link back to the exact statement page and visible source region.
  • Source evidence is shown beside canonical rows so reviewers can inspect the extraction without hunting through PDFs.
  • Repair flows preserve the original statement while editing the row that will flow into exports.
TieOut source proof modal.
05

Coverage gate

  • Coverage is checked per account and period before package generation.
  • Missing, duplicate, unavailable, and needs-review states are explicit at the month/account level.
  • A cleanup cannot pretend a statement period exists when it does not, which keeps downstream balances honest.
TieOut coverage gate.
06

Books check

  • Imported rows are compared against existing books before the final package is generated.
  • Already-booked rows are excluded so import does not double count bank-feed or manually entered activity.
  • Mismatches between statement rows and books are surfaced as review work instead of becoming silent drift.
TieOut books check.
07

Export package

  • Package generation waits for coverage, review, source proof, and books checks to clear.
  • Outputs include QuickBooks import CSV, Excel workbooks, review CSV, PDF report, source index, and metadata.
  • The export package is client-ready, audit-backed, and structured so a firm can explain every adjustment.
TieOut export package screen.

Technical specs

Two engines, one export gate, no silent accounting magic.

The system separates per-document extraction from per-engagement reconciliation. That separation makes failures easier to reason about, test, and explain to a reviewer. A bad document extraction is handled as a statement problem; a bad transfer or duplicate relationship is handled as an engagement problem.

Statement Engine

extractStatement(input) -> StatementObject

Per-document, stateless extraction that lands every bank or card statement on one typed object with account fields, summary totals, rows, source references, confidence, and tie-out status. The statement tie-out is the QA layer that keeps extraction errors from flowing forward.

Adapter

fromStatementObject(so, ctx) -> CanonicalTxn[]

Decouples extraction from reconciliation, maps row-level flow semantics, stamps globally unique transaction IDs, and preserves source provenance for review. The adapter is what lets different statement lanes land on the same ledger contract.

Ledger Engine

reconcileEngagement(id, statements, opts) -> Engagement

Builds the engagement graph, runs deterministic passes for transfer matching, carry-forward continuity, deduplication, feed seams, and processor payouts. The engine proposes relationships, typed exceptions, and export readiness without mutating source rows.

Gated Export

buildExport(engagement) -> QuickBooks CSV | blockers

Exports only when no review-required exception remains and no match is still proposed. The system prefers blocked output over quiet accounting errors, then emits stable import rows and supporting evidence once the gate clears.

Matcher algorithms

Transfer pass

Equal amount within epsilon 0.005, date window up to 5 days, compatible flow roles, one-to-one greedy assignment by score.

Carry-forward pass

Validates closing[m] == opening[m+1], flags coverage gaps and overlapping periods before export.

Dedup pass

Groups by account, date, absolute amount, and normalized description; proposes dropping extras, never mutates silently.

Processor pass

Collapses processor payout report plus matching bank deposit into one settlement row to prevent double-counted revenue.

Pipeline contract

PDFs / markdown
  -> Statement Engine
  -> StatementObject[]
  -> CanonicalTxn[]
  -> Ledger Engine
  -> Engagement { matches, exceptions, exportReady }
  -> gated QuickBooks CSV

The key design choice is that matches are proposals, not hidden mutations. The UI and CSV exporter share the same readiness check, so a reviewer and an export job are looking at the same blocking state.

Evidence

The system is backed by measured engineering signals.

The important signal is not just that the app runs. It is that the domain risks are named, modeled, tested, and kept out of export until they are resolved. TieOut treats bookkeeping cleanup as a verifiable workflow with typed data contracts and scorecards, not a loose PDF-to-spreadsheet utility.

TypeScript pnpm monorepo with separate web, API, engine, statement-engine, shared, and worker packages so extraction, reconciliation, storage, and UI can evolve independently.

Deterministic-first financial logic where arithmetic decides relationships and any OCR or model-assisted lane is bounded by confidence, provenance, and review states.

Explicit data contracts for StatementObject, CanonicalTxn, Match, LedgerException, Engagement, export rows, source references, and review decisions.

Eval-driven quality story with hard gates, scorecards, seeded synthetic corpus, real-substrate distractors, GL-diff strategy, and active-learning decision logs.

Product UX tied directly to engine constraints: source proof, proposal review, coverage checks, books checks, export blocking, and import-safe QuickBooks output.

Actual product surface

The surrounding workflow is productized too.

The real product is more than one reconciliation table. It includes client cleanup tracking, source-backed row repair, billing, and a support loop for statement formats that need coverage. These surfaces matter because firms need repeatable operations around the engine, not just a one-off conversion screen.

TieOut cleanups list.

Cleanup list

Client backlogs are tracked as cleanup workspaces with period scope, assignment, status, plan limits, and the queue context a firm needs to manage many catch-up jobs.

TieOut source proof table.

Source proof table

Statement rows stay source-backed, editable, and visible before anything is allowed into an export package, so review can happen at the row level instead of in a detached spreadsheet.

TieOut billing screen.

Billing

The commercial surface is page-metered and tied to cleanup limits, export packaging, and team workflow, matching the way bookkeeping firms think about statement volume.

TieOut bank support screen.

Bank support

Unsupported statement layouts become support requests and fixture-building opportunities, turning failed extractions into repeatable coverage improvements.

Control plane

What TieOut refuses to do silently.

  • Export while coverage, source proof, books checks, or review proposals are unresolved.
  • Book internal transfers as income and expense just because the legs came from different statements.
  • Drop duplicate or already-booked rows without leaving a reviewable source trail and package evidence.
  • Treat processor payouts as new revenue when the payout report and bank deposit represent the same settlement.

Operational output

A cleanup package a firm can defend.

The final package is not just a CSV. It includes import-ready rows, account workbooks, review exceptions, source reference indexes, metadata, and a client-facing report so a bookkeeper can explain what changed, what was excluded, and why the result is safe to import.

Open TieOut app