Integration, Connection, Payment option
One Integration can serve several Connections, and one Connection can carry several approved capabilities. A single Stripe Integration, two Stripe accounts, two Connections.
Scope decides the owner
Sharing an interface does not move authority. Whichever plane owns the Connection is the one that authorizes the operation and keeps the audit record.
Every operation gets bound to one
A provider-backed operation follows the same five steps:- Pick an active Connection with the right scope and capability.
- Authorize the operation against that Connection.
- Write that Connection’s identifier onto the record the operation produced.
- Send refunds, disputes, webhooks, cancellations, and other reversals back through the same Connection.
- Stop and ask for attention when that Connection cannot continue.
Secrets stay on the server
Browsers and agents get an opaque Connection reference and a health status. That is enough to use a Connection and not enough to steal one. Provider keys, OAuth tokens, webhook signing secrets, and managed workload credentials stay in server-side storage. If you are self-hosting today, keep provider secrets in the server environment. Never put them inconfig.json, in a NEXT_PUBLIC_ variable, in a Template, in logs, or anywhere a model can read them back.
Before you widen testing on an Integration
Work through this list with a sandbox account before you let real money near it:- Use the provider’s sandbox or test mode.
- Turn on whatever event verification the provider offers, and confirm an unsigned event is rejected.
- Try invalid credentials and missing scopes. Read what the Store does.
- Send the same event twice and interrupt a request mid-flight. Confirm nothing duplicates.
- Refund something and confirm the refund went through the original provider.
- Check the Integration’s maturity evidence.