Mapping Chargebee to Recurso

The Import wizard in Settings → Import data
cmd/import
tool to migrate your live subscriber base idempotently and without
double-billing anyone mid-cycle.
Concept Mapping
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
Thecmd/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 theexternal_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.
Valid subscription
status values: active, trialing, paused, canceled,
past_due, unpaid. Timestamps are RFC 3339.
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
N created, N skipped (already exist), N failed. Because it’s
idempotent, re-running after fixing a failure only creates what’s still missing.
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