Billing transparency
Example checkout math: processor and network surcharges (especially on adult / high-risk merchants) are shown explicitly so customers know what is bank-imposed versus platform margin. The same breakdown component is meant for every paid flow.
CDN and edge egress are not implicitly “free unlimited” in infrastructure contracts — see the operator checklist for pass-through policy decisions. Integration notes: docs/PAYMENTS-INTEGRATION.adoc in the repo.
Card + platform split
Subtotal$49.99
Stacked bar = card fees, platform fee, and estimates only (scaled to 100% of surcharges).
| Line | Party | USD | % of total |
|---|---|---|---|
| Subtotal (goods or access) | Goods / access | $49.99 | 73.2% |
| Processor discount fee | Processor / acquirer | $6.45 | 9.4% |
| Processor fixed authorization | Processor / acquirer | $0.35 | 0.5% |
| Card network / high-risk program (estimated) | Network | $0.10 | 0.1% |
| Linx Photos platform fee (illustrative) | Platform | $4.00 | 5.9% |
| Tax / VAT (placeholder — jurisdiction dependent) | Tax (estimate) | $3.65 | 5.3% |
| Included monthly transfer (plan allowance) | Infrastructure / CDN | $0.00 | 0.0% |
| CDN / edge egress overage (42.00 GB beyond allowance) | Infrastructure / CDN | $3.78 | 5.5% |
| Customer total (illustrative) | $68.32 | 100% | |
Rates are placeholders for UI wiring. Adult / high-risk processing is typically much higher than mainstream — that difference is imposed by acquirers, not an arbitrary platform surcharge. Replace these numbers with your live processor contract and tax engine output.
API mirror (`POST /api/commerce/quote`)
Loaded once on mount in the browser so SSR stays simple. Reload the page after changing numbers to refresh the API mirror, or call POST /api/commerce/quote from your checkout code.
Paddle vs Centrobill + PayPal (what you asked)
Paddle is usually a merchant-of-record reseller: they are the seller on the receipt for many transactions, simplify VAT in supported cases, and pay you out. That can be great friction-wise, but it is not the same as “your brand is the merchant everywhere,” and acceptable-use rules may be tighter than a dedicated adult acquirer. This project wires Centrobill for the high-risk path and PayPal Orders for an SFW option—see docs/PAYMENTS-INTEGRATION.adoc.
Tax API demo (`POST /api/tax/quote`)
Default TAX_ENGINE=stub. Set TAX_ENGINE=taxjar + TAXJAR_API_KEY for live TaxJar.
PayPal SFW order (`POST /api/payments/paypal/create-order`)
Uses sandbox API base by default. Requires server env credentials. Response includes approveUrl for the buyer. With a valid guest email, the server stores a pending purchase row and returns purchaseId for capture + receipt email (needs Turso + RESEND_API_KEY for mail).
Capture (after PayPal approval)
Paste orderId from the response (or use the fields below after create). Calls POST /api/payments/paypal/capture-order.
Centrobill webhook URL (configure in Centrobill dashboard)
/api/webhooks/centrobill
Charge saved payment methods via POST /api/payments/centrobill/charge-on-file (server only; obtain paymentAccountId through Centrobill tokenization per their docs—do not POST raw PAN to Linx).
SVG data URL — no photograph pixels; auto follows site theme.
Embed theme overrides
Light
Dark