Overview
Add Facto to checkout and understand what your backend and Facto each handle.
Facto is a payment method your customer already has. The customer links their account and approves payments on Facto-hosted pages. Your backend uses Basic auth to call the Merchant API.
You can take Facto payments without storing card data, customer credentials, or customer funds. The customer links once, then pays per order.
How Facto works
The integration has three parts:
- One server-side API. Your backend calls the Merchant API for readiness, authorizations and payments. Nothing that moves money runs in the browser.
- Hosted approval. Customers link their account and approve payments on pages Facto hosts, so their credentials never reach your systems.
- Idempotent payments. Every charge carries a key, so a retry returns the original payment instead of creating a second one.
To link a customer, your page opens Hosted Connect and receives a one-time code.
Your backend exchanges it for a userLinkRef and stores that reference with the
customer record. For each order, check payment readiness, get an authorization,
then submit the payment with an idempotency key.
Who owns what
| Owner | Responsibilities |
|---|---|
| Your app and backend | Cart, order, customer session, checkout UI, support, reconciliation. Merchant API calls, userLinkRef storage, idempotency keys, and trusted order state: amount, currency, reference. |
| Facto SDKs | Popup lifecycle and return-message validation in the browser; request signing, response typing, and secret isolation on the server. |
| Facto | Linking, user setup, and payment approval in Hosted Connect; readiness, payment options, checkout sessions, authorizations, and payment admission in the Merchant API; settlement of admitted payments. |
You never touch funds. No customer money enters, waits in, or leaves your systems.
Hard rules
Never call Facto-internal routes. Never resolve or validate a payment
authorization yourself. Derive amount, currency, and order reference from
trusted local order state, never from browser input. Keep clientSecret
server-side, always.
Start with Access and credentials, then follow the Quickstart.