Case study
reels-downloader × PayCraft
A real-world adoption — Android · iOS · Web · Desktop — in production since April 2026.
First production tx
2026-04-26
Platforms shipping
4
Real-card E2E latency
≤ 5s
Infra cost / month
$0
Why PayCraft
reels-downloader needed multi-platform subscription billing without writing 4 platform-specific paywalls (Play Billing, App Store StoreKit, Stripe Web, custom Desktop) and 2 webhook routers (Stripe + Razorpay). PayCraft delivers a single KMP BillingManager.isPremium(uid) contract that wires the same gating decision into every target.
Integration in 5 commits
- Sign up at paycraft.mobilebytesensei.com, pick slug
reels-downloader - One-click Stripe Connect OAuth — keys never typed in chat
- Create monthly + annual products on the dashboard
- Wire
cmp-paycraftincommonMain+ callPayCraft.initialize()in app start - Gate features with
BillingManager.isPremium(uid)
The SDK is cache-first (weekly default, hourly during trial) — zero network on the happy path.
End-to-end proof points
- Tenant signup creates a row in `tenants`
- Stripe Connect OAuth completes without secrets typed in chat
- Webhook signature verification (edge function logs)
- subscriptions lifecycle (created → active → canceled)
- isPremium returns true within 5s of invoice.payment_succeeded
- Trial-sticky-fields survive renewal
- RLS prevents tenant A reading tenant B's subscriptions
- Webhook idempotency (Stripe retry → same DB state)
- Refund flow (charge.refunded) downgrades subscriptions.status
Cost the day they shipped
| Supabase Free | 500 MB DB · 2 GB egress · 50K MAU | $0 |
| Vercel Hobby | 100 GB bandwidth | $0 |
| Stripe | 2.9% + $0.30 per success (pass-through) | $0 fixed |
| Resend Free | 100 emails/day · 3K/month | $0 |
| Cloudflare R2 Free | 10 GB storage · 10M reads/mo | $0 |
Full case study
The full step-by-step integration walkthrough — including DB schema snippets, webhook event payloads, anti-patterns we hit, and the monthly drill log — lives in the PayCraft repo:
docs/REELS_DOWNLOADER_INTEGRATION.md