Every month I closed the books by opening my invoice list and my Stripe export in two windows and eyeballing rows against each other. It took an afternoon, I still found mismatches the next day, and "partially paid" was a special kind of pain because it lived only in my head.
ReconcileIO is the tool I built to collapse that afternoon. You paste your invoice list and your payment or Stripe export, and it returns a matched table: paid, partial, or unpaid, with no spreadsheet in between. The matching is the boring part a computer should do, and now it does.
Why eyeballing two lists fails
Humans are bad at comparing long lists row by row, especially when the values don't line up exactly. A payment might be short by a few cents, or a client paid two invoices in one transfer, and your eye slides right past both. The cost is a wrong "all paid" assumption that surfaces as a confused customer or a missed chase.
The tool removes the human from the comparison and keeps them for the judgment. It flags partials explicitly instead of letting them hide, and it presents the result as a table you can read in seconds rather than reconstruct.
What a matched table should show
The output splits cleanly into paid, partial, and missing, which is the only three states that matter at month-end. ReconcileIO keeps it copy-ready so the result drops into a report or a message to your accountant without reformatting.
I run it on the last day of the month and the unresolved rows are exactly my to-do list. Before, that list lived in a half-finished spreadsheet I was afraid to trust. Now the tool is the source and I act on its output.
Honest limits
It matches what you paste; if a payment isn't in your export, or an invoice number is wrong, it can't invent the link. Garbage in, confused out. It also doesn't post to your ledger or talk to your bank — it's a matcher, not accounting software. For persistent books and audit trails, use a real system; this is the fast close at month-end, not the system of record.
How I fit it into close
I run ReconcileIO on the last working day, not the first, because a payment that lands on the 31st shouldn't sit in "unpaid" for a month. The matched table becomes my close checklist, and anything still unresolved is the only thing I chase. Before this I kept a live spreadsheet that drifted every time I edited a row; now the tool is stateless and rerunnable, so the truth is whatever the latest paste says. That discipline — paste fresh, trust the output, act — removed the spreadsheet I was afraid to open.
FAQ
What do I need to paste?
Your invoice list and your payment or Stripe export. The tool matches them and sorts each row into paid, partial, or unpaid.
Does it handle partial payments?
Yes. Partial payments are flagged as their own state rather than being silently counted as paid or unpaid, which is usually where manual matching goes wrong.
Will it post to my accounting system?
No. It produces a matched table you can act on. It doesn't write to a ledger or connect to your bank; treat it as the fast close, not the system of record.
What if a payment isn't in my export?
It can only match what you provide. A missing payment or a mistyped invoice number will show as unpaid, so make sure your inputs are complete before you trust the result.
