type: decision
status: active
timestamp: 2026-06-22
tags: [decision, architecture, payments, razorpay, paddle, gumroad, substack, cloudflare-workers, no-card-on-file]

Payment architecture — direct platform links via CF Worker click-tracker

Direct platform links, redirect to payment provider to a provider's hosted checkout (Razorpay Payment Page, Gumroad URL, Paddle checkout\ link, Substack subscribe URL). Provider hosts the checkout; we host the button.\ User picked a small CF Worker proxy that logs the click anonymously to CF Analytics\ Engine and then 302s to the platform URL — ~1 Worker call per checkout, 20x\ headroom on the 100K/day free envelope. Zero payment secrets on our infra (no\ API keys); all payouts go to the creator's bank account after the platform's own\ KYC. Per-region routing: Razorpay (INR) + Paddle (USD/EUR/GBP/ROW) + Gumroad (digital\ downloads) + Substack (newsletters) + Play Billing (in-app).

Payment architecture — direct platform links via CF Worker click-tracker

Decision

Checkout flows in the family use direct platform links: a button on our site redirects the user to the payment provider’s hosted checkout. Provider hosts the checkout, we host the button. A tiny Cloudflare Worker sits in the middle to log the click anonymously before the 302.

Definitions

Flow

button click
  ? CF Worker  /track-checkout?dest=razorpay&plan=pro&ref=blog
  ? log to CF Analytics Engine  (anonymous, no PII)
  ? 302  https://rzp.io/l/oriz-pro

~1 Worker invocation per checkout click. With realistic checkout volume the burn is ~5K/day at peak — 20x headroom on the 100K/day free envelope (cf-worker-quota-mitigation.md).

Per-region routing

Region / use caseProviderWhy
India (INR)Razorpay Payment PageUPI + cards + netbanking, local KYC
International (USD/EUR/GBP/ROW)PaddleMerchant-of-Record, handles VAT/sales-tax globally
Digital downloads (PDFs, zips)GumroadHosts the file delivery + license keys
Newsletter subscriptionsSubstackSubscription billing built-in
Android in-app purchasesPlay BillingRequired by Play Store policy

Why this shape

Cross-refs


Edit on GitHub · Back to index