Lunixi
ArchitectureJanuary 2026· 7 min read

Why payment-intent architecture beats the gateway charge call

S

By Selim Destanci

Founder

Classic gateways expose payments as a function call: send a charge, get success or failure. That abstraction holds right up until reality intervenes — a timeout where you don’t know if the bank charged, a retry on a second acquirer, a partial capture, a refund against a capture that itself was partial. A boolean can’t carry that story.

An intent models the payment as a long-lived state machine instead: initiated, processing, awaiting 3-D Secure, authorized, partially captured, captured, refunded — with every legal transition defined and everything else rejected. Code can’t “accidentally” refund an unauthorized payment, because the transition simply doesn’t exist.

The most underrated state is the honest one: needs-reconciliation. When a bank times out, the truthful status is “unknown”, and pretending otherwise is how double charges happen. An intent can park there while a sweep asks the bank what actually happened — and only then move forward. A charge call has nowhere to park; it has to lie in one direction or the other.

Intents also make multi-acquirer routing natural. Attempt one declines; the cascade fires attempt two under the same intent — same idempotency scope, same audit trail, one charge guaranteed. With charge-call gateways, every retry is a brand-new payment, and stitching them into one customer story becomes your problem.

Finally, an intent emits events at every transition — an append-only history you can hash-chain, audit and replay. That’s not just compliance hygiene; it’s the substrate that webhooks, ledgers and dispute evidence are built on. The gateway gave you an answer. The intent gives you a record.

Why payment-intent architecture beats the gateway charge call — Lunixi