Skip to content

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:

  1. Auto-detect via IP geolocation (Cloudflare CF-IPCountry header)
  2. Default currency suggested matching country of residence
  3. Customer can override in pricing page dropdown
  4. 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:

  1. ADR 0067 trigger met ($10M+ ARR or first channel deal)
  2. Currency expansion gated PER-currency by customer demand:
  3. EUR: ≥5 EU customers asking
  4. GBP: ≥3 UK customers
  5. BRL: NFe.io integration validated end-to-end
  6. Others: case-by-case demand signal
  7. Crypto: at least 1 Enterprise contract requiring stablecoin settlement (Defense, Crypto-Native firm)
  8. BNPL: at least 3 Enterprise deals lost specifically due to payment terms ($50k+ ARR opportunity)

Cross-references

  • ADR 0067 — Wave-6 umbrella (sibling)
  • ADR 0056 — Stripe Subscriptions (Wave-2 baseline preserved)
  • Wave-2 W2-3 — NFe.io BR (reused unchanged)
  • Stripe docs: Currencies, Tax, Connect
  • Coinbase Commerce API docs
  • Chainalysis sanctions API
  • Klarna for Business
  • Razorpay India docs