Skip to content

Ledger

Scheduled Oct 11, 2026

Billing logic you own, on the processor you already use.

Replaces

  • Stripe Billing · Stripe, Inc. $620 per org per month (Billing — Pay Monthly, up to $100,000 monthly billing volume), about $7,440/yr at 400 seats
  • Chargebee · Chargebee Inc. $99 per org per month (Billing — Flow), about $1,188/yr at 400 seats

Rented, per year

$7,440

Stripe Billing list price at 400 seats.

Owned, per year

$13,800

AWS infrastructure only. Azure is $14,880.

Build

13 weeks

2 engineers. To parity on the ten core features, including the rating engine with property-based tests against your existing invoices, revenue recognition schedules, the GL journal mapping, and a parallel-run period where Ledger and the incumbent bill the same book and every difference is explained before cutover. We do not cut over a billing system without a parallel run.

Difficulty

5/5

Among the hardest in Techtons. Read the parity table closely.

Reference organisation: 12,000 active subscriptions, ~$40M of annual billed volume, ~9,000 invoices a month across 3 legal entities and 4 currencies, 40M metering events a month, 10-year invoice and revenue-schedule retention, single region, prod + non-prod. 3-year Compute Savings Plan on Fargate / 3-year reservation on Container Apps. Aurora minimum 1 ACU in prod given the metering write rate. Kinesis sized at 4 shards / Event Hubs at 32 partitions on Standard. Excludes all payment processing fees, which stay with your processor and are the larger number. Excludes any tax calculation service subscription. These figures are infrastructure only and exclude the build. For comparison, $40M of annual billed volume on Stripe Billing's published pay-as-you-go rate of 0.7% is $280,000 a year, and roughly $257,000 a year on the published Pay Monthly tiers — on top of processing fees, for the same transactions.

What it is

Ledger is subscription billing: product and price catalogue, subscriptions with proration and mid-term changes, usage metering and rating, invoicing, dunning, credit notes, and revenue recognition schedules under ASC 606 and IFRS 15, posting to your general ledger. It runs in your account on your database. Read this line before anything else: Ledger does not replace your payment processor. Stripe, Adyen, Braintree or your acquirer still take the card, still hold the merchant relationship, still bear the PCI scope. What Ledger replaces is the billing logic layered on top of that — the part Stripe charges 0.7% of your billed volume for, on money it is already processing.

Why this one stops making sense

  • Stripe Billing is a percentage of your billing volume, which means your billing system's cost scales with your revenue while its cost to run does not. At $40M of annual billed volume, 0.7% is $280,000 a year; the published Pay Monthly tiers work out at roughly $257,000 for the same volume.
  • Chargebee's Flow plan is $99 a month plus 0.65% of invoicing volume above $66,000 a month, which is the same shape with a different multiplier.
  • You are paying a revenue percentage twice on the same transaction — once to the processor for moving the money, once to the billing layer for describing why. Only one of those is a variable cost.
  • Pricing changes are the fastest-moving thing in a software business: new plans, usage dimensions, regional price books, enterprise one-offs. When the billing system cannot express your commercial model, the commercial model gets simplified to fit, which is an expensive way to make a pricing decision.
  • Revenue recognition schedules and the subscription ledger sit directly in the audit path. Having them in your own database, queryable and reconcilable against the GL, is worth something every single year-end.

What ships

  • Product and price catalogue with versioned price books per currency, region and segment
  • Subscription lifecycle: trials, activation, upgrades, downgrades, pauses, cancellations, with exact proration
  • Usage metering ingest with idempotency keys, and rating across tiered, volume, package and stairstep models
  • Invoicing with configurable billing cycles, anniversary or calendar alignment, and multi-entity numbering sequences
  • Dunning: retry schedules, escalation emails, grace periods and controlled service suspension
  • Credits, refunds, credit notes and prepaid balances with a proper double-entry trail
  • Revenue recognition schedules under ASC 606 and IFRS 15, including deferred and unbilled positions
  • GL posting with a journal export your finance team maps once, reconciled to the cash the processor reports
  • Processor abstraction so payment attempts route to Stripe, Adyen or an acquirer without changing billing logic
  • Customer billing portal for invoices, payment methods and self-service plan changes

Data model

CustomerProductPricePriceBookSubscriptionSubscriptionItemMeteringEventInvoiceInvoiceLineCreditNotePaymentAttemptDunningScheduleRevenueScheduleAuditEvent

Stack

frontend
Next.js 15 App Router + Tailwind + TanStack Query, plus a separate lightweight customer portal
backend
NestJS on Node 22; rating and revenue recognition as pure, property-tested modules with no I/O
database
PostgreSQL 16 — money as integer minor units, usage rating in numeric, never floating point; metering events in a partitioned append-only table
cache
Redis 7 for catalogue lookups and metering ingest deduplication windows
queue
BullMQ for invoice runs, dunning steps, revenue schedule generation and journal export
auth
OIDC against the customer IdP for staff; signed short-lived links for the customer portal
search
PostgreSQL tsvector across customers, invoices and subscription references
ai
Optional: explain an invoice line in plain language for support, and flag anomalous usage before a bill goes out. No model output ever affects an amount.

Parity, honestly

What we match, and what we do not.

The rows marked No are the important ones. If one of them is the reason you bought Stripe Billing, keep buying it — and we will tell you that on the first call rather than the fifth month.

CapabilityStripe BillingOursNote
Product catalogue and price booksYesYesVersioned as migrations, so a price change is reviewed and reversible.
Subscription lifecycle with prorationYesYes
Usage metering and ratingYesYesExact decimal arithmetic end to end. No floats anywhere near money.
Invoicing and multi-entity numberingYesYes
Dunning and involuntary churn managementYesPartialWe implement retry schedules and escalation. What we cannot implement is the network card account updater — see below.
Revenue recognition schedulesPartialYesChargebee prices RevRec separately and on request. Ledger includes it, and the schedules are rows your auditor can query.
Billing cost independent of revenueNoYesThe core argument. Ledger's cost does not move when you double.
Payment processingYesNoStated plainly because it is the thing people misread: Ledger never touches a card. Card data goes directly from the customer's browser to the processor's hosted fields, and Ledger holds only a token. You keep Stripe, Adyen or your acquirer, and you keep paying their processing fees, which are the larger number on your statement anyway. Anyone claiming to replace a payment processor is describing a regulated business, not a piece of software.
Network card account updaterYesNoWhen a customer's card is reissued, Visa and Mastercard push the new number to participating processors automatically. That service is available to acquirers and processors, not to a billing application. It materially reduces involuntary churn and Ledger cannot provide it — though if your processor offers it, you keep the benefit, because the processor is still in the loop.
Sales tax and VAT calculation and filingYesNoStripe Tax and Chargebee's tax integrations determine rates across thousands of jurisdictions and, in some configurations, file returns. Rates change constantly and the liability for getting them wrong is yours. Ledger integrates with Avalara, Vertex or Stripe Tax as a calculation service; it does not become a tax engine.
Fraud scoring on payment attemptsYesNoStripe Radar is trained on cross-merchant network data. Ledger has no equivalent signal and does not pretend to.
Breadth of global payment methodsYesPartialYou get whatever your processor supports, which for Stripe or Adyen is a great deal. Ledger's abstraction adds nothing here and takes nothing away.
Vendor-provided SOC 1 report over the billing systemYesNoIf your auditors rely on a service organisation control report covering the billing application, a self-hosted system moves those controls in-scope for your own audit. That is more work at year-end and it is a real cost of ownership.
Quote-to-cash and CPQPartialNoOut of scope. Ledger starts at an agreed contract; how you got there is a CRM and CPQ question.

Reference architecture

Built twice, on purpose.

Every application in Techtons ships with a production architecture for AWS and one for Azure, using the same diagram grammar so you can read them side by side. Your cloud, your account, your bill.

Amazon Web Services

Compute
ECS Fargate (api, ingest, rating, billing-run, portal) with the billing run isolated on its own service
Data
Aurora Serverless v2 PostgreSQL with a read replica for reporting and revenue queries
Storage and edge
S3 for invoice PDFs and journal exports, with Object Lock on the invoice bucket
Identity
Cognito federated to the customer IdP; processor API keys in Secrets Manager, never in the app database
Observability
OpenTelemetry to CloudWatch; alarms on rating lag, failed billing runs and unreconciled cash
Infrastructure as code
Terraform, with the billing run schedule as an EventBridge rule per entity and per timezone

Services

ECS FargateALBAurora Serverless v2ElastiCache RedisS3 Object LockKinesis Data StreamsSQSEventBridge SchedulerSecrets ManagerKMSCognitoSESWAFCloudWatch

The decision worth arguing about

The non-obvious decision is what happens to a metering event that arrives after its billing period has closed, and it is the decision that separates a billing system your finance team trusts from one they quietly reconcile in a spreadsheet. Usage events arrive late for entirely ordinary reasons: a customer's own batch job, a network partition, a collector restart. The intuitive handling is to accept the event, recompute the period's usage and reissue the invoice. That is the wrong answer, because a reissued invoice is a restatement — it breaks the numbers already posted to the general ledger, already reported to the board, already used in a revenue schedule, and in some jurisdictions it breaks the invoice numbering sequence's legal integrity. So Ledger closes a period hard: metering events carry a client-supplied idempotency key with a unique index, they are aggregated into period buckets incrementally as they arrive, and an event whose timestamp falls inside a closed period is accepted, stored, and rated as a dated adjustment line on the next invoice rather than reopening the last one. The trade-off is that a customer occasionally sees usage from March on their April bill, so the adjustment line carries its original period on the invoice and the portal explains it — a small presentational cost in exchange for invoices that are immutable once issued. Kinesis carries the metering firehose rather than SQS because ordering per subscription matters for stairstep and tiered models where the sequence of usage determines which tier applies, and the shard key is the subscription id. Two smaller points that are not negotiable in a billing system: every monetary value is an integer in minor units and every rating computation uses Postgres numeric, because a float rounding error of a hundredth of a cent across forty million events a month is not a rounding error, it is a reconciliation failure someone spends a week finding; and invoice PDFs go into an Object Lock bucket, because 'the invoice we sent' and 'the invoice we would generate today' must be provably the same document.

Microsoft Azure

Compute
Azure Container Apps (api, ingest, rating, billing-run, portal), billing run on its own revision
Data
Azure Database for PostgreSQL Flexible Server with a read replica for reporting
Storage and edge
Blob Storage with a locked immutable policy on the invoice container
Identity
Microsoft Entra ID; processor credentials in Key Vault with managed-identity access
Observability
Azure Monitor and Application Insights
Infrastructure as code
Bicep, with billing run schedules as Container Apps Jobs on cron triggers per entity

Services

Container AppsContainer Apps JobsFront Door StandardPostgreSQL Flexible ServerCache for RedisBlob Storage immutabilityEvent HubsService BusKey VaultEntra IDCommunication ServicesLog Analytics

The decision worth arguing about

The metering firehose is where Azure imposes a decision you cannot walk back, and it is the reason this section exists rather than saying 'as AWS, with Event Hubs'. Event Hubs is the Kinesis equivalent and it is a good one, but on the Standard tier the partition count is fixed when the hub is created and cannot be changed afterwards — increasing it is a Premium and Dedicated capability. Partition count is also what caps your consumer parallelism, and because per-subscription ordering matters to tiered rating, the partition key has to be the subscription id, which means a busy customer's events all land on one partition and that partition's throughput is your ceiling for that customer. Get the number wrong at creation and the fix is creating a new hub and migrating producers and checkpoints across, mid-flight, on a system that is metering revenue. So we over-provision deliberately at thirty-two partitions for the reference org's forty million events a month, well beyond what the throughput needs, purely to buy headroom we cannot buy later. The cost of that is not the partitions themselves but the checkpoint overhead — each consumer instance holds lease and offset state per partition, so a sparsely-loaded thirty-two-partition hub does more bookkeeping per useful message than an eight-partition one would, and the consumer group's rebalance on deploy takes longer. We accept slower rebalances and slightly higher idle overhead in exchange for never having to migrate a live billing firehose. Everything else ports cleanly: Blob immutability with a locked time-based policy gives the same guarantee as S3 Object Lock for invoice documents, Key Vault holds processor credentials, and the rating and revenue recognition modules are pure functions with no cloud dependency at all, which is deliberate — the part of this system that must be provably correct is the part that should be testable on a laptop.

Sources

Every price on this page, with the page we read it from and the date we read it.

ProductPlanList priceCheckedSource
Stripe BillingBilling — Pay Monthly, up to $100,000 monthly billing volume$620 / org/month2026-09-05stripe.com/billing/pricing

Stripe Billing is priced on billing volume, not seats. Pay as you go is 0.7% of billing volume. The published Pay Monthly tiers are $620/month up to $100,000 of monthly volume, $1,500 up to $250,000, $2,950 up to $500,000 and $5,750 up to $1,000,000, with 0.67% on volume above the tier. This is entirely separate from Stripe's payment processing fees.

ChargebeeBilling — Flow$99 / org/month2026-09-05www.chargebee.com/pricing/

Chargebee lists Flow at $99 per month plus 0.65% of monthly invoicing volume above a stated $66,000 breakeven. Revenue recognition (RevRec), CPQ beyond 50 quotes, and the Enterprise tier are all custom-priced on request, so the $99 is a floor for a very small business only.

Should you still be paying for Stripe Billing?

Two weeks, fixed price. We audit what you actually use, map it against Ledger, cost the replacement on your own AWS or Azure account, and give you a delivery plan. If the honest answer is to keep the licence, that is what the report will say.