1. Get authenticated
Glide creates your partner record and returnsclient_id and client_secret once. Glide enables the treasury:write token entitlement for your client, leaving the five consent scopes unchanged.
You mint a token and verify it works against a read endpoint. Confirm the returned scope string contains what you expect.
2. Settle the legal and funding shape
Glide and you confirm the custody and redemption mandate, then identify the funded reserve account and what will count as settlement evidence. You create the actual business entity through the normal owner flow, with its real verification status. Binding does not create a business, approve it, or supply funds.3. Bind the treasury
Glide binds your partner to the entity, the entity-scoped USD balance, your external payer UUID and the reserve account, and sets the caps and mandate expiry you approved. Binding identity and reserve provenance are immutable once set. The balance is created empty, indisabled status. Existing non-zero funds are never silently adopted.
You record the payer UUID in your configuration. Your client should refuse to send a batch whose payer_entity_id differs from it, so a misconfiguration fails locally instead of at Glide.
4. Fund and record it
You settle real USD into the bound reserve account. Glide inspects the settlement evidence and records the funding, which credits the USD balance and writes an immutable receipt. Funding is an operator attestation of already-settled money, not a deposit API.5. Onboard users and collect consent
You pre-create each recipient by email and distribute the claim link. Users sign in with that email, claim the account, and approve the scopes. To be paid, a user needs bothpayouts:receive and transfers:read, plus an active account.
You confirm readiness by reading each user back before including them in a batch. A 404 means no receipt or grant, and a 403 grant_required means the consent is missing or too narrow.
6. Wire up webhooks
Glide adds your exact URL to the allowlist, configures the endpoint and returns its secret once. You deploy the receiver and validate it end to end: signature verification over the raw body, a five minute timestamp tolerance, deduplication by event id, and a 2xx only after durable acceptance. Confirm you can accept a repeat of the same event without double-applying it. A configured, allowlisted endpoint is what makestransfer.settled reach you. Without it the payouts still work, and you find out about them only by polling.
7. Prove the whole path
Before activation, prove all of this in the configured environment with real money:- A funded reserve you can reconcile.
- A small live batch, two recipients is enough.
- The credit visible in each user’s personal Glide USD balance.
- A signed
transfer.settledreceived and correlated ontransfer_id. - A user-authorized bank withdrawal completing from that balance.
8. Activate
Glide sets the treasury toactive. Activation requires a valid active binding, a future mandate, an active partner and verified funding.
Running it
Monitor continuously:
Keep actual cash-out liquidity. A credited user balance is a liability you have to be able to fund when the user withdraws.
Stopping
Two switches with different blast radii:
Use treasury suspension for a money problem, and partner suspension for a credential or trust problem. If a secret leaked, do both: rotate and suspend, because rotation alone leaves live tokens valid until they expire.
Pre-launch checklist
- Token cached in process and refreshed before expiry, with a single retry on
invalid_token. - Client secret stored in a secret manager, never in source or logs.
-
payer_entity_idpinned in configuration and checked before every batch. -
execution_idandpayout_idgenerated once per obligation and persisted before the call. - The same
Idempotency-Keyreused verbatim on every retry of a batch. - Unconfirmed outcomes retried, never marked failed.
- Webhook signature verified over the raw body with a constant-time compare.
- Webhook events deduplicated by event id before side effects.
- Transfer polling overlaps its watermark and dedupes on id and updated timestamp.
-
amount_centsparsed as an integer or decimal type, never a float. -
request_idlogged from every error response.