Skip to content
Create account or Sign in
The Stripe Docs logo
/
Ask AI
Create accountSign in
Get started
Payments
Revenue
Platforms and marketplaces
Money management
Developer resources
APIs & SDKsHelp
Overview
Use for your business
Financial Accounts
CardsInstant currency conversion
Global Payouts
Capital
Embed in your platform
Financial Accounts for platforms
Issuing cards
    Overview
    How Issuing works
    Global availability
    Product and marketing compliance guidance (US)
    Marketing guidance (Europe/UK)
    Manage fraud
    Get started with Issuing
    Onboarding overview
    Choose a cardholder type
    Choose your card type
    Virtual cards
    Physical cards
    Fund your Issuing balance
    Testing
    Integrate Issuing
    Integration guides
      Embedded Finance
      B2B payments
      Fleet
    Sample app
    Manage cards
    Digital wallets
    Replacement cards
    Card programs
    Program management
    Processor-only Issuing
    Customize your card program
    Add funds to your card program
    Credit Consumer Issuing
    Stablecoin-backed issuing with Connect
    Controls
    Spending controls
    Advanced fraud tools
    3DS
    Fraud challenges
    Real-time authorizations
    PIN management
    Issuing Elements
    Token Management
    Postfunding
    Postfund your integration with Stripe
    Postfund your integration with Dynamic Reserves
    Purchases
    Authorizations
    Transactions
    Disputes
    Merchant categories
    ATM usage
    Enriched merchant data
    Issuing with Connect
    Set up an Issuing and Connect integration
    Update terms of service acceptance
    Connect funding
    Connected accounts, cardholders, and cards
    Inactive connected accounts offboarding
    Embed card management UI
    Credit
    Overview
    Set up connected accounts
    Manage credit terms
    Report other credit decisions and manage AANs
    Report required regulatory data for credit decisions
    Manage account obligations
    Test credit integration
    Additional information
    Customer support for Issuing and Financial Accounts for platforms
    Issuing watchlist
Capital for platforms
United States
English (United States)
HomeMoney managementIssuing cardsIntegration guides

B2B payments integration guide

Build a B2B payments integration with Issuing.

Unfamiliar with embedded finance?

Check out our introductory guide to using embedded finance for SaaS Platforms.

Build a US B2B payments integration by using Stripe Issuing to create cards for your business, employees, or contractors to make purchases on your behalf.

By the end of this guide, you’ll know how to:

  • Fund your Issuing Balance
  • Create virtual cards for your own business
  • Use these cards to spend funds from your Issuing Balance

Before you begin

  1. Sign up for a Stripe account.
  2. Activate Issuing in a sandbox environment from the Dashboard.

Add funds

To spend money using cards, add funds to the Issuing balance on your account. This balance represents funds reserved for Issuing and is safely separated from your earnings, payouts, and funds from other Stripe products.

You can add funds from your Dashboard.

Create cardholders and cards

Create a cardholder

The Cardholder is the company or business entity that’s authorized to use card funding by the Issuing balance. The Cardholder object includes relevant details, such as a name to display on cards and a billing address, which is usually the business address.

The following API call creates a new Cardholder:

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/issuing/cardholders \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d name="Company Card" \ --data-urlencode email="company@example.com" \ --data-urlencode phone_number="+18008675309" \ -d status=active \ -d type=company \ -d "billing[address][line1]"="123 Main Street" \ -d "billing[address][city]"="San Francisco" \ -d "billing[address][state]"=CA \ -d "billing[address][postal_code]"=94111 \ -d "billing[address][country]"=US

Stripe returns a Cardholder object that contains the information you provided and sends the issuing_cardholder.created webhook event.

Create a card

Create a card and attach it to the Cardholder that you want to make the authorized user of the card.

In the following examples, we show you how to create a virtual card. You can, however, create physical cards and ship them to cardholders in live mode.

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/issuing/cards \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d currency=usd \ -d type=virtual \ -d cardholder=
"{{CARDHOLDER_ID}}"

Stripe returns a Card object on creation, and sends the issuing_card.created webhook event:

{ "id": "ic_1NvPjF2SSJdH5vn2OVbE7r0b", "object": "issuing.card", "brand": "Visa", ... "status": "inactive", "type": "virtual" }

You need to activate the card before a user can use it. While you can activate virtual cards in the same API call you used to create it, you must activate physical cards separately. When ready, activate the card by marking the status as active:

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/issuing/cards/ic_1NvPjF2SSJdH5vn2OVbE7r0b \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d status=active

At this point, there’s now an active card attached to a cardholder. See the Issuing page to view the card and cardholder information.

{ "id": "ic_1NvPjF2SSJdH5vn2OVbE7r0b", "object": "issuing.card", "brand": "Visa", ... "status": "active", "type": "virtual", }

To learn more, see:

  • Virtual cards
  • Physical cards
  • Use the Dashboard for Issuing with Connect
  • Create cards with the API

Use the card

Create an authorization

To observe the impact of card activity on the associated balance, generate a test authorization. You can do this in the Issuing page of the Dashboard, or with the following call to the Authorization API:

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/test_helpers/issuing/authorizations \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d card=
"{{CARD_ID}}"
\ -d amount=1000 \ -d authorization_method=chip \ -d "merchant_data[category]"=taxicabs_limousines \ -d "merchant_data[city]"="San Francisco" \ -d "merchant_data[country]"=US \ -d "merchant_data[name]"="Rocket Rides" \ -d "merchant_data[network_id]"=1234567890 \ -d "merchant_data[postal_code]"=94107 \ -d "merchant_data[state]"=CA

After approval, Stripe creates an Authorization in a pending state while it waits for capture. Note the authorization id that you’ll use to capture the funds:

{ "id": "iauth_1NvPyY2SSJdH5vn2xZQE8C7k", "object": "issuing.authorization", "amount": 1000, ... "status": "pending", "transactions": [], }

Capture the funds

Capture the funds using the following code:

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl -X POST https://api.stripe.com/v1/test_helpers/issuing/authorizations/
{{AUTHORIZATION_ID}}
/capture
\ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"

After the authorization is captured, Stripe creates an Issuing Transaction, the status of the authorization is set to closed.

See also

  • Spending controls
  • Issuing authorizations
  • Issuing transactions
  • Working with Stripe Issuing cards and Financial Accounts for platforms
  • Manage transaction fraud
Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc