Use case

A paper trail for every invoice, refund and plan change

Log paid invoices, failed charges, refunds, subscription upgrades and cancellations in one tamper-proof trail, separate from your production DB and your Stripe dashboard.

The problem

Stripe already has a dashboard. Your DB has a `subscriptions` table. But when a customer disputes a charge, or an auditor asks to see every refund over €1000 last quarter, you need one place that correlates the payment provider event, your own billing logic, and the user who triggered it. Grepping through Stripe's webhook log and your own Postgres is not that place.

The Recalled way

Every billing webhook you receive becomes a Recalled event: `invoice.paid`, `invoice.payment_failed`, `invoice.refunded`, `subscription.upgraded`, `subscription.cancelled`. Store the amount, currency, customer id and Stripe event id in metadata. When a dispute lands, filter by the customer id and you see the entire billing timeline at a glance. Auditors get CSV exports scoped to the quarter they care about.

Inside your Stripe webhook handler
await recalled.events.create({
  action: "invoice.paid",
  actor: { id: customer.id, email: customer.email },
  organization: customer.orgId,
  targets: [{ type: "invoice", id: invoice.id }],
  metadata: { amount: invoice.amount, currency: invoice.currency },
});

Why finance teams put billing on Recalled

  • One timeline across providers

    Log from Stripe, from your own billing code, from chargebacks. One actor filter gives you the whole story.

  • Tamper-proof evidence

    Each event is hash-chained and signed. Perfect when an auditor or a lawyer asks 'was this refund really issued on this date'.

  • CSV export per date range

    Export every `invoice.*` event for Q3 with one click. Hand it to the accountant or upload to your audit software.

  • Retention you set

    Keep billing events for the 5 or 7 years your jurisdiction requires. Everything else can expire on its own schedule.

Related use cases

Your next audit log is 2 minutes away

Stop hacking on your own logs table. Drop in Recalled, send your first event, move on.