How do I reconcile Stripe invoice payment status against my open AR balance?
Compare each Stripe invoice's status field — draft, open, paid, uncollectible, or void — against what your AR aging report shows for the same invoice. A mismatch almost always means a status-change event (paid, voided, marked uncollectible) fired on Stripe's side but the workflow that updates AR aging never processed it, not that the two systems actually disagree about the invoice.
Part of the finance integrations guide.
| Stripe's 5 invoice statuses | draft, open, paid, uncollectible, void |
|---|---|
| Symptom | AR aging shows an invoice as open that Stripe already marked paid, void, or uncollectible |
| Root cause | The specific status-transition event wasn't processed by the workflow that updates AR aging |
| Where to check | Stripe's own invoice list, filtered by status, compared line by line against AR aging for the same period |
The five states an invoice can be in
Stripe's Invoice object carries a single status field, documented as one of draft, open, paid, uncollectible, or void, with a status_transitions object recording when each change happened (finalized_at, marked_uncollectible_at, paid_at, voided_at). That timestamp data is exactly what makes a reconciliation possible — you're not just checking current status, you're checking when it changed relative to when AR aging last updated.
Why AR aging drifts from Stripe's own record
AR aging is populated when an invoice is created, but every status change after that — paid, voided, marked uncollectible — is a separate event. If the workflow that maintains AR aging only listens for invoice creation and not the later transition events, Stripe's own record moves forward while AR aging stays frozen at whatever status it captured first. The two systems aren't actually in conflict about the invoice; one of them just never heard about the update.
How to run the comparison
Pull Stripe's invoice list for the period, and for each invoice compare its status and status_transitions timestamps against the corresponding row in AR aging. Any invoice where Stripe shows a later status than AR aging reflects is a candidate for a stale poll, not a genuine disagreement — Loopfour's Stripe integration has no webhook handler, so the fix is scheduling listInvoices or getInvoice to run periodically against open invoices, not re-deriving the status by hand for every invoice.
Next step
Map the finance workflow with the most exposure and prove the automation path.
Bring the invoice, contract, payment reconciliation, or customer finance workflow you have to defend at audit. Loopfour can map the trigger, controls, integrations, and approval loop.
Worked example
A $1,850 invoice marked paid in Stripe, still open in AR aging
A customer pays a $1,850 invoice through Stripe's hosted invoice page. Stripe's own record updates immediately: status moves to paid, and status_transitions.paid_at records the exact timestamp. But AR aging was populated by a single getInvoice call when the invoice was first created and finalized, and nothing has re-checked it since, so it keeps showing $1,850 as an open, aging balance for that customer. Pulling Stripe's invoice list and comparing paid_at against the AR aging snapshot date immediately shows the gap — the fix is a scheduled re-poll of open invoices, not investigating the customer for a payment problem that doesn't exist.
Frequently Asked Questions
Sources
Related
Topic
AR & Collections
Accounts receivable is the money customers owe a business for goods or services already delivered on credit — a current asset on the balance sheet until it's collected. AR and collections, as a practi…
Read moreTopic
Integrations
Every finance automation vendor publishes an integrations page: a grid of logos, a claim of "seamless" connectivity, and not much else. That page answers a marketing question — does this vendor touch…
Read moreDiagnostic
What breaks when a voided Stripe invoice doesn't clear from AR aging?
Voiding a Stripe invoice is terminal, but Loopfour's Stripe integration has no webhook handler — it's poll-only. The status change only reaches AR aging if the workflow re-polls via getInvoice after creation. Read status once, at creation, and the invoice stays open in AR aging even though Stripe itself now shows it as void.
Read moreHow-to
How do I connect Stripe invoices for AR collections?
Loopfour's Stripe integration creates and manages invoices end to end — createCustomer, createInvoice, finalizeInvoice, sendInvoice, and voidInvoice — making Stripe the only integration in this matrix that actually issues and collects AR invoices rather than just supplying payment data. Connecting it means creating the customer in Stripe first; invoices can't be created without one.
Read more