Skip to main content

Mapping Chargebee to Recurso

The Import wizard in Settings → Import data

The Import wizard in Settings → Import data

Moving off Chargebee? Recurso covers the same billing surface — plans, subscriptions, invoices, dunning, usage, entitlements — with a self-hosted architecture and native India compliance. This guide maps Chargebee’s object model to Recurso, calls out what’s different, and walks through the cmd/import tool to migrate your live subscriber base idempotently and without double-billing anyone mid-cycle.

Concept Mapping

Chargebee’s Item Family / Item / Item Price hierarchy flattens in Recurso: one Plan holds the recurring price(s) directly. A metered add-on maps to a usage dimension you report events against.

What’s Different

  • Self-hosted — Recurso runs on your infrastructure (Go + PostgreSQL, optionally TigerBeetle). Your billing data lives in your own database.
  • No percentage fee — there’s no per-transaction billing fee taken by Recurso. You pay gateway fees and your own hosting.
  • Built-in double-entry ledger — every billing event posts to a ledger with a first-class reconciliation report.
  • India compliance is native — GST (CGST/SGST/IGST), e-invoicing via the IRP, and RBI e-mandates are first-class. See GST Invoicing.
  • Your gateway, your relationship — Recurso orchestrates billing but charges through your own Razorpay or Stripe account.

Migrating Your Subscribers

The cmd/import tool loads plans, customers, and subscriptions directly into the database without generating invoices or calling payment gateways. Each imported subscription keeps its original billing period, so Recurso only issues the next invoice at current_period_end — no mid-cycle double-billing.

Step 1: Export from Chargebee

Export your active subscriptions with their customers and item prices (via the Chargebee export or API). Keep each Chargebee subscription ID — it becomes the external_id that makes the import idempotent.

Step 2: Build the import file

Recurso reads a single JSON file (or three CSVs). Amounts are in minor units (paise/cents). This example shows an Indian B2B subscriber with GSTIN and place of supply carried across:
data.json
The importer matches plans by code, customers by email, and subscriptions by external_id (your Chargebee subscription ID). Set external_id to the Chargebee ID so re-running the import skips anything already migrated.
Field reference: Valid subscription status values: active, trialing, paused, canceled, past_due, unpaid. Timestamps are RFC 3339.
Carrying gstin and place_of_supply over means the first Recurso invoice is already GST-correct — CGST/SGST vs IGST is decided from the customer’s state against your seller state code.

Step 3: Dry-run first

The dry run validates the whole file and reports what would happen without writing anything — surfacing every problem in one pass.
Find your tenant UUID in the dashboard under Settings, or in the POST /auth/register response. The tenant must already exist.

Step 4: Import for real

The tool prints N created, N skipped (already exist), N failed. Because it’s idempotent, re-running after fixing a failure only creates what’s still missing.
No invoices are generated by the import. The renewal worker issues each subscription’s next invoice at its current_period_end. Configure your gateway credentials (see Payment Gateways) before that first renewal.

Step 5: Prove it — the Compare gate

Before pointing billing at Recurso, re-run your export through the Compare gate. It diffs the export against your live Recurso data — read-only — and reports, per record:
  • Coverage — every importable source record exists in Recurso
  • Fidelity — plan amount, currency, and interval match exactly; customer identity intact
  • Continuity — billing resumes exactly where Chargebee stops: a subscription whose period end drifted more than an hour is flagged as the double-billing / billing-gap risk it is
"ready": true means zero issues — safe to cut over. The same gate runs from the dashboard’s Import wizard (“Before you cut over: run the Compare gate”).

After Migrating

1

Point webhooks at Recurso

Register your endpoint with POST /v1/webhooks and verify the X-Recurso-Signature header. See Webhooks.
2

Configure tax

Set GST (India) or TaxJar (US) so the first Recurso invoice is compliant. See India GST setup.
3

Reconcile

After the first renewal cycle, run GET /v1/finance/reconciliation to confirm the ledger, invoices, and gateway agree.

Next Steps

Going to Production

The full pre-launch checklist

End-to-End Flow

See the complete billing lifecycle