ENGINEERING VERSION LOG · 2026.07
Dodo subscriptions, quotas, and the usage ledger
A checkout page is only the entry point. A billing system must connect identity, entitlements, usage, renewals, and retries into one auditable path.
01 · CHECKOUT
Payment is bound to a verified product account
Only a signed-in account may create checkout. The server uses the verified account email for the Dodo session. Cards, payment methods, taxes, and invoices stay on Dodo-hosted pages.
02 · WEBHOOK
Subscription state comes from verified events
The webhook verifies signatures, enforces a five-minute replay window, and deduplicates by event ID. Active, renewed, plan_changed, failed, cancelled, and expired events project into account entitlements.
03 · USAGE LEDGER
Usage follows cost units, not request counts
Cloud ASR is metered by audio milliseconds and AI orchestration by calls. Request IDs are idempotency keys, so network retries do not charge twice. The immutable ledger remains separate from entitlement projection.
04 · PLAN BOUNDARY
Personal plans stay separate from future API plans
Free provides a bounded trial and Pro provides fixed monthly ASR minutes and AI calls. Future Team/API plans require separate concurrency, shared quotas, and usage overages rather than being mixed into individual subscriptions.
EVIDENCE · DIAGNOSIS
What the evidence establishes—and what it does not
Dodo is the source of payment events; InkTyper owns account entitlements and an immutable usage ledger. Webhooks require signature, time-window, and event-idempotency checks. Transcription is metered in audio_ms, AI by operation, and retries deduplicate on request ID.
OPERATIONS · OPEN WORK
Failure behavior and the next verification gate
Gifted Pro, developer access, and paid subscriptions should project into the same entitlement model while retaining different sources, so the system can explain why quota exists. A future API plan needs separate concurrency, keys, metering, and overage rules rather than borrowing consumer Pro limits.
- Failure visibility
- Every fallback needs a reason code and stage timing. A successful final transcript must not erase evidence that real-time, AI, or paste failed first.
- Release evidence
- Keep request ID, actual model, node, queue, upload, ASR, AI, and delivery timing together so a regression can be reconstructed end to end.