Skip to main content

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.

Zuny FesterBy Zuny Fester, Head of Operations and Marketing
Reviewed by Zuny Fester
Published Last reviewed Editorial policy

Part of the finance integrations guide.

SymptomA voided Stripe invoice still shows as open on the AR aging report
Root causeLoopfour's Stripe integration has no webhook handler; a status change after creation only reaches AR aging if something re-polls getInvoice
What voiding actually does in StripeMarks a finalized invoice void permanently, treats it as zero-value, and is only possible from open or uncollectible status
What voiding is notNot the same as a refund — a paid invoice can't be voided, only refunded or credited

What voiding actually changes in Stripe

Stripe's void action is terminal — once an invoice is void, its status can never change again. Voided invoices are treated as zero-value for reporting and can't be paid; you can only void an invoice that's currently open or uncollectible, not one that's already been paid. A paid invoice needs a refund or credit note instead, which is a different operation with different accounting implications.

Why the void doesn't always reach AR

Loopfour's Stripe integration covers invoice creation, finalization, sending, and voiding, plus getInvoice for reading current status — but it has no webhook handler at all, unlike Airwallex's or HubSpot's integrations in this same matrix. There's no invoice.voided event to subscribe to, because nothing in this integration listens for Stripe events; every status read is a poll. If the workflow that populates AR aging calls getInvoice once at creation and never again, a status change that happens afterward — voiding, marking uncollectible, a later payment — simply isn't seen until something calls getInvoice again.

How to check whether this is happening

Compare Stripe's own invoice list, filtered to void status, against the AR aging report for the same period. Any invoice that shows void in Stripe but still open in AR aging is a case where the workflow's last getInvoice call predates the void — not a case where Stripe and the books actually disagree about the invoice's status. A scheduled re-poll of open invoices, not a one-time read at creation, is what closes that gap.

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.

Book a workflow review

Worked example

A $3,400 invoice that's void in Stripe and open in AR

A customer's plan changes mid-month, so a $3,400 invoice gets voided in Stripe and replaced with a corrected one. Stripe's own record is unambiguous: the original invoice is void, zero-value, and permanently closed, visible on Stripe's invoice list with a voided_at timestamp. But the AR aging report was populated by a single getInvoice call when the invoice was first created and finalized — nothing calls getInvoice again after that — so it keeps showing the same $3,400 as open and aging. The fix isn't in Stripe; it's scheduling a periodic getInvoice re-check on open invoices, since polling once at creation is structurally the same as never checking again.

Frequently Asked Questions

No — Stripe's void status is terminal and can never change back.

No — a refund happens on a paid invoice and is a different event; voiding only applies to an invoice that's still open or uncollectible, so the two need separate handling.

Yes, for the same reason — any status transition after the initial getInvoice call is invisible until something polls again. That applies equally to void, uncollectible, and a later payment.

Sources

Related