How to issue debit cards that spend stablecoins from non-custodial wallets using Bridge and Stripe Issuing
Bridge lets your app issue debit cards that spend stablecoins directly from a non-custodial or custodial wallets. Card creation is handled through Stripe Issuing, while Bridge manages customer identity, KYC, and onchain fund-pulling. When a cardholder makes a purchase, Bridge pulls funds from the linked wallet via an onchain approval.Before starting, set up a Bridge account and create Bridge customers by following the Bridge onramp and offramp recipe.This recipe covers:
Creating a card via Stripe Issuing
Setting up a token approval
Handling card transaction webhooks
Setting up a Bridge account with Privy
Set up Bridge onramp and offramp flows with Privy.
Bridge + Stripe Issuing documentation
Official Bridge documentation for Stripe Issuing card integration.
Use the stripe_cardholder_id to create a card via Stripe’s Issuing API. Set the crypto_wallet parameters to link the card to the non-custodial wallet.
Solana
EVM
For Solana, provide the owner address (not the associated token account).
Bridge automatically derives the token account from the owner address and currency.
On Solana, Bridge submits an onchain transaction to register the program delegate address for the wallet after the card is created.
Create the card before setting up the token approval. This ensures Bridge ties the address to the
customer before your app submits any approvals onchain.
After creating the card, the wallet must approve Bridge’s smart contract to pull funds during card transactions. Bridge provides a consolidated version of the Solana delegate approval logic in a GitHub Gist.
Add an instruction that approves Bridge’s card program to spend from the ATA. Bridge
assigns the MERCHANT_ID to your developer account during onboarding.
Submit the transaction using Privy. Pass sponsor: true to enable
Solana gas sponsorship, which handles the fee
payer and recent blockhash automatically.The result is a delegate approval resembling this transaction.
Submit a standard ERC-20 approve call to allow the Bridge issuer contract to spend from the
wallet.
The card issuer contract address is specific to your developer account and differs from the main
contract listed in the chain table above. Bridge provides this address during onboarding.
The card is now ready to use. When a cardholder makes a purchase, Bridge publishes webhook events for both the card network authorization and the onchain transaction.
Cards created via Stripe Issuing also emit Stripe webhook events (issuing_authorization.created,
issuing_transaction.created). See the Stripe Issuing webhooks
documentation for details on
handling these events.
Bridge submits transactions onchain at the time of card authorization, but they complete asynchronously. This results in two Bridge webhook events:
Bridge publishes this event seconds later when the onchain transaction confirms. It includes crypto_details with the chain, amount, and transaction hash:
Bridge rejects an authorization if the onchain approval is inactive, the approved amount is
insufficient, or the wallet lacks funds. Incremental authorizations trigger additional onchain
transactions to cover the extra charge.