ADR 0068 — Multi-Currency + Crypto + BNPL Payments (Wave-6 D5-D7)¶
| Status | Date | Author | Supersedes | Superseded by |
|---|---|---|---|---|
| Accepted | 2026-05-16 | André Luiz Gallon | partial: Wave-2 USD-only Stripe | — |
Context¶
ADR 0067 D5-D7 mandate expanded payment rails:
- D5 Multi-currency settle-local (8 currencies beyond USD)
- D6 Crypto stablecoin (USDC/USDT via Coinbase Commerce)
- D7 BNPL Enterprise (Klarna for $50k+ annual contracts)
Wave-3 ships USD-only Stripe + NFe.io BR. This ADR formalizes the expansion contract.
Architectural decision¶
10 LOCKED decisions.
D1: Settle-local currencies (8 + USD = 9 total)¶
| Currency | Region | Entity / PSP |
|---|---|---|
| USD | NA + Default | Stripe US (existing Wave-2) |
| EUR | EU | Stripe Ireland + Stripe Tax EU |
| GBP | UK | Stripe UK (post-Brexit separate entity) |
| BRL | Brazil | Stripe Brazil + NFe.io (Wave-2 W2-3 reuse) |
| JPY | Japan | Stripe JP + JCT compliance |
| CAD | Canada | Stripe Canada + GST/HST handling |
| AUD | Australia | Stripe Australia + GST |
| MXN | Mexico | Stripe Mexico + Carta Porte (e-invoice) |
| INR | India | Razorpay (RBI compliance — Stripe IN partial) |
No settlement in fiat-pegged crypto (USDC explicitly classified as crypto, NOT a 10th fiat currency — see D5).
D2: FX rate strategy = daily fixed at deal close¶
For multi-year contracts:
- Spot rate at deal close locks the customer's annual price
- Annual renewal re-quotes at then-current rate (with cap +/-15% built into Term Sheet)
- Mid-year true-up NEVER changes USD-equivalent (TLSStress.Art absorbs FX risk for stability)
For monthly/usage-based: - 30-day rolling average of mid-market rate (XE.com API) - Updated daily 00:00 UTC - Surfaced to customer in invoice line item: "FX rate applied 2026-05-16: 1 USD = 0.92 EUR"
D3: Tax handling per currency¶
- Stripe Tax for all major jurisdictions (EU, UK, CA, AU, US, JP) — automated VAT/GST/sales tax
- NFe.io for BRL (Brazil-specific NFSe e-invoicing — Wave-2 W2-3)
- Manual GST for INR (Razorpay handles tax IDs; CSP-side reconciliation)
- Reverse-charge B2B for EU intra-community (Stripe Tax auto)
Every invoice carries tax_breakdown JSON per line item for
customer-side audit.
D4: Currency selection UX¶
Customer self-serve flow:
- Auto-detect via IP geolocation (Cloudflare CF-IPCountry header)
- Default currency suggested matching country of residence
- Customer can override in pricing page dropdown
- Stored in
account.preferred_currency(immutable post-checkout without account migration)
For Salesforce / ServiceNow integrations (ADR 0067 D2): inherit currency from orgs' CRM data.
For marketplace listings (ADR 0067 D1): inherit from marketplace contract (e.g., AWS EU-EUR commitment).
D5: Crypto payment rail = Coinbase Commerce¶
USDC (Ethereum mainnet + Base L2): - Primary stablecoin - L2 (Base) reduces gas to <$0.10 per settlement - Coinbase Commerce settles to TLSStress.Art's USDC wallet within 10 confirmations (~2 min on Base)
USDT (Tron): - Lower fees for LATAM / APAC customers - Coinbase Commerce settles to USDT wallet (TLSStress.Art converts to USDC weekly to avoid Tether counterparty risk concentration)
Pricing: customer sees USD-equivalent price; charged in stablecoin at then-spot. Audit chain entry records both USD and stablecoin amounts.
KYC + AML: - Coinbase Commerce verifies KYC at deposit - Secondary OFAC sanctions screening server-side via Chainalysis API - Block transactions from sanctioned wallet addresses
No volatile crypto (BTC, ETH, etc.) — stablecoin only for pricing predictability.
D6: BNPL = Klarna Enterprise¶
Klarna for B2B SaaS contracts $50k-500k annual:
- Net-60 standard
- Net-90 for enterprise tier (>$200k)
- Klarna underwrites credit risk
- TLSStress.Art receives full payment from Klarna upfront (less ~3% fee)
- Customer pays Klarna over agreed terms
Below $50k contracts: card / ACH / wire-only. BNPL not offered for self-serve tier (collection risk vs ticket size).
Default-on: Klarna offered on Enterprise checkout flow; customer can opt for wire instead.
D7: Refund policy per payment method¶
| Method | Refund window | Refund SLA |
|---|---|---|
| Card | 7 days self-serve / 30 days CS | 5-10 business days |
| ACH / Wire | 7 days self-serve / 30 days CS | 5-10 business days |
| Crypto (USDC/USDT) | 7 days self-serve / 30 days CS | Immediate on-chain |
| Klarna BNPL | 30 days CS only (not self-serve) | Klarna handles |
| Marketplace (AWS/Azure/GCP) | Per marketplace TOS | Per marketplace |
D8: Audit chain entries per payment¶
Every payment + refund emits audit entry:
{
"eventType": "billing.payment.captured",
"paymentId": "pi_...",
"method": "card | ach | wire | crypto.usdc | crypto.usdt | bnpl.klarna | marketplace.aws | ...",
"currency": "USD",
"amountCents": 5000000,
"settlementCurrency": "USDC", // if different
"settlementAmount": "5000.000000",
"fxRate": 1.0,
"fxRateApplied": "2026-05-16T00:00:00Z",
"taxBreakdown": {...},
"kycVerified": true,
"ofacScreened": true,
"hash": "..." // SHA-256 chained
}
7-year retention (legal).
D9: Backend organization¶
pkg/octopus/payments/
├── multicurrency/
│ ├── fx.go # FX rate fetching + caching
│ ├── tax.go # Stripe Tax / NFe.io / Razorpay adapters
│ ├── invoice.go # multi-currency invoice generation
│ └── settle.go # daily settlement reconciliation
├── crypto/
│ ├── coinbase.go # Coinbase Commerce webhook handler
│ ├── chain.go # USDC Base + USDT Tron RPC clients
│ ├── ofac.go # Chainalysis sanctions screening
│ └── audit.go # on-chain audit entry emission
├── bnpl/
│ ├── klarna.go # Klarna Enterprise REST adapter
│ ├── eligibility.go # $50k+ check + credit pre-screen
│ └── audit.go # ledger entry
└── types/
├── currency.go # Currency, CurrencyCode, FXRate
├── payment.go # Payment, PaymentMethod, Status
└── settlement.go # Settlement, AuditEntry
D10: Trigger gates¶
Per ADR 0067 + payment-specific:
- ADR 0067 trigger met ($10M+ ARR or first channel deal)
- Currency expansion gated PER-currency by customer demand:
- EUR: ≥5 EU customers asking
- GBP: ≥3 UK customers
- BRL: NFe.io integration validated end-to-end
- Others: case-by-case demand signal
- Crypto: at least 1 Enterprise contract requiring stablecoin settlement (Defense, Crypto-Native firm)
- BNPL: at least 3 Enterprise deals lost specifically due to payment terms ($50k+ ARR opportunity)