CapsuleCredit
← All posts

5 Steps to Launch Virtual Cards with Stripe Issuing

May 12, 2026

▶ Watch the 60-second version on YouTube

Streamline Your Virtual Card Program with Stripe Issuing

In today's fast-paced fintech landscape, virtual cards are becoming essential for managing expenses, providing users with control, and enhancing security. Stripe Issuing allows developers to create, manage, and distribute virtual cards with relative ease. This post dives into the technical steps required to launch your own virtual card program using the Stripe Issuing API, complete with code snippets and insights that can help you avoid common pitfalls.

Step 1: Create an Issuing Account

Before you can start issuing virtual cards, you'll need to ensure that your Stripe account has access to the Issuing product. You can check this in your Stripe Dashboard under the "Issuing" tab. If your account isn't enabled, you'll need to contact Stripe support to get access.

Step 2: Set Up Your Card Program

Once you have access, the next step is to create a card program. This involves defining the parameters of your virtual card, such as spending controls and transaction limits. Here's how to do it using the Stripe API:

import stripe

# Set your secret key
stripe.api_key = "sk_test_your_secret_key"

# Create a Card Program
program = stripe.Issuing.CardProgram.create(
    name="My Virtual Card Program",
    spending_controls={
        "allowed_categories": ["online", "in_store"],
        "spending_limits": [{
            "amount": 1000,  # Amount in cents
            "currency": "usd",
            "interval": "monthly"
        }]
    },
    status="active"
)

print("Created Card Program:", program.id)
This snippet creates a new card program with the specified spending controls. Adjust the parameters to fit your specific needs, such as allowed categories or spending limits.

Step 3: Issue a Virtual Card

Now that you have a card program, you can issue virtual cards. This is done by creating a card that is linked to the program you just set up.

# Issue a Virtual Card
card = stripe.Issuing.Card.create(
    card_program=program.id,
    cardholder="cardholder_id",  # Replace with your cardholder ID
    type="virtual",
    currency="usd",
    spending_controls={
        "allowed_categories": ["online"],
        "spending_limits": [{
            "amount": 5000,  # Amount in cents
            "currency": "usd",
            "interval": "monthly"
        }]
    }
)

print("Issued Virtual Card:", card.id)
In this snippet, replace `"cardholder_id"` with the ID of the cardholder you want to associate with the virtual card. The spending controls can also be adjusted as needed.

Step 4: Manage Cardholder Information

Managing cardholder information is crucial for compliance and tracking purposes. You can create cardholders to associate with the virtual cards you issue.

# Create a Cardholder
cardholder = stripe.Issuing.Cardholder.create(
    name="John Doe",
    email="john.doe@example.com",
    address={
        "line1": "123 Main St",
        "city": "San Francisco",
        "state": "CA",
        "postal_code": "94105",
        "country": "US"
    },
    type="individual"
)

print("Created Cardholder:", cardholder.id)
With this information, you can set up a dedicated cardholder for each user or department that requires access to a virtual card.

Step 5: Monitor and Adjust

After your cards are issued, the real work begins. Monitoring transaction data, adjusting spending limits, or updating cardholder information is essential for compliance and effective management. To retrieve transactions for a specific card, you can use the following API call:

# Retrieve Card Transactions
transactions = stripe.Issuing.Transaction.list(
    card=card.id,
    limit=10
)

for transaction in transactions.data:
    print(f"Transaction ID: {transaction.id}, Amount: {transaction.amount} {transaction.currency}")
This allows you to keep track of how much each card is being used and adjust controls accordingly.

Non-Obvious Gotcha: Spending Controls and Cardholder Associations

One common oversight when implementing Stripe Issuing is the interaction between spending controls and cardholder associations. If you define spending limits at the card level but do not properly associate the cardholder, you may run into unexpected behavior. For example, if you create a card with a specific spending limit but later change the cardholder's associated spending limits, the card may still adhere to the original settings unless explicitly updated. Always ensure that your cardholder's spending limits align with the cards they are associated with. It’s best practice to update both the card and cardholder settings simultaneously when making adjustments.

Conclusion

By following these steps, you can efficiently launch a robust virtual card program using Stripe Issuing. Each API call is straightforward, and the flexibility of the platform allows for extensive customization. With careful management of cardholder information and spending controls, you can deliver a secure and user-friendly payment solution tailored to your needs.

💳 Best card for API and cloud spend — earn rewards on every Stripe, AWS, and OpenAI charge.

Get Brex →