How to sell and redeem gift cards with Stripe

Stripe's gift card support is a private preview for accepting closed-loop gift cards from a gift card provider you already have an agreement with. Its docs list SVS as the provider, US customers and USD, and the Payment Intents API and Terminal readers as the integration paths; redemptions settle off Stripe. To sell your own gift cards without a provider, sellers sell a Gift card product through Checkout and issue each buyer a single-use promotion code, and track the balance themselves.
Verified against official documentationReviewed Send a correction (opens in a new tab)

The short answer on Flint

Flint has gift cards in the API. Sell them as catalog products in fixed or custom amounts. When the purchase is paid, Flint issues the card with a 16-character code and emails the recipient on the date the buyer chose. Buyers redeem codes at Flint's hosted checkout, up to 20 cards with one card payment covering the rest, or in your own checkout through the API. Balances, partial spends, refunds back to the card, and a liability report are part of the ledger. Card processing runs on Stripe underneath. The Flint requests are below.

What Stripe's gift card docs cover

Stripe's gift card payment method is for redeeming third-party gift cards, in its API reference's words. The docs set these conditions:

  • Access is a private preview, requested from your account executive or by email with your Terminal device, integration type, and gift card provider.
  • You need an existing agreement with a gift card provider; SVS is the supported provider listed. The provider's program sets load amounts, maximum balances, and expiry.
  • Customers in the United States, in USD. Integration is the Payment Intents API or a Terminal reader.
  • Redemptions settle off Stripe, so there are no disputes on them, and the refunds endpoint returns an error: you reload the card or activate a new one instead.

That fits a business that already runs a provider-backed gift card program. A business that wants to sell its own cards online, without a provider, has no gift card object to use.

The workaround: a coupon per card

The pattern third-party guides describe, such as Acodei's September 2026 write-up, sells a Gift card product through Checkout and turns each sale into a coupon with a single-use promotion code:

JavaScript
// After checkout.session.completed for the "Gift card" product
const coupon = await stripe.coupons.create({
  amount_off: 5000,
  currency: "usd",
  duration: "once",
  applies_to: { products: REGULAR_PRODUCT_IDS }, // keep the gift card product out
});
const code = await stripe.promotionCodes.create({
  promotion: { type: "coupon", coupon: coupon.id },
  code: randomCode(16),
  max_redemptions: 1, // one order uses it up, whatever it spends
});
await db.giftCards.insert({ code: code.code, balance: 5000, soldFor: 5000 }); // your ledger
await sendGiftEmail(session.metadata.recipient_email, code.code);         // your email

That is a code generator, a balance ledger, an email, an applies_to list to maintain, and accounting that treats the sale as a liability. These are the places it breaks:

Where coupon gift cards go wrong

  1. The leftover balance disappears#

    A customer spent $35 of a $50 card and the code stopped working.

    A promotion code with max_redemptions of 1 is used up by one order. The $15 the customer didn't spend still belongs to them, and Stripe has nothing that records it.

    Confirm it

    Compare each gift card's sale amount with the discounts its code has applied.

    Fix

    Issue a new code for the remainder after each partial use, and track every card's balance in your own ledger.

  2. A customer can't use two gift cards on one order#

    A buyer with a $25 card and a $50 card could apply only one.

    A Checkout Session takes one coupon or promotion code. Two gift card codes, or a gift card and a sale code, can't both apply.

    Confirm it

    Search support tickets for buyers holding more than one card.

    Fix

    Merge balances into one code on request, or build your own checkout that applies several cards and charges the rest.

  3. A gift card buys another gift card#

    A $100 code was spent on a new $100 gift card, and the balance moved without anything being sold.

    A coupon applies to the whole order unless you restrict it. A card spent on another card turns your liability into a new code you also have to track.

    Confirm it

    Look for orders where a gift card code discounted the gift card product.

    Fix

    Set applies_to on every gift card coupon to your regular products and leave the gift card product out.

  4. An expired code doesn't end what you owe#

    Your books show the card as revenue, and the customer wants their unspent balance back.

    A gift card sale is money you owe until it is spent. A code's expiry only stops Stripe from accepting it, and state laws set when a customer can ask for a small remaining balance in cash.

    Confirm it

    Reconcile unspent gift card value against a liability account, not revenue.

    Fix

    Book sales to a liability account, release it as codes are spent, and keep a cash-out path for the states that require one.

On Flint, gift cards are a product and a ledger

Create a gift card product. This one sells a $50 card by default and lets the buyer pick any amount from $10 to $500:

cURL
curl -X POST https://api.withflintpay.com/v1/products \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: product-gift-card" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Gift card",
    "product_type": "gift_card",
    "default_variant": {
      "unit_price_money": { "amount": 5000, "currency": "USD" },
      "gift_card_configuration": {
        "face_value_money": { "amount": 5000, "currency": "USD" },
        "price_mode": "face_value",
        "custom_amount_bounds": {
          "minimum_money": { "amount": 1000, "currency": "USD" },
          "maximum_money": { "amount": 50000, "currency": "USD" }
        }
      }
    }
  }'

A buyer orders a $75 card for a friend, delivered on December 24. The order needs a customer, or a buyer who confirms their email at checkout:

cURL
curl -X POST https://api.withflintpay.com/v1/orders \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: order-gift-card-001" \
  -H "Content-Type: application/json" \
  -d '{
    "customer_id": "cus_1kmn0aExample",
    "line_items": [{
      "variant_id": "var_1kmn0aExample",
      "quantity": 1,
      "gift_card_purchase": {
        "face_value_money": { "amount": 7500, "currency": "USD" },
        "recipient": {
          "email": "sam@example.com",
          "name": "Sam",
          "message": "Happy birthday!",
          "send_at": "2026-12-24T14:00:00Z"
        }
      }
    }]
  }'

Collect payment with a checkout session as for any order. When the payment settles, Flint issues the card, lists it on the line item's purchased_gift_cards by its last characters, and emails Sam a private link to the card on the 24th. Ordinary reads never show the full code.

To spend it, the buyer types the code at Flint's hosted checkout, which applies up to 20 cards to an order and charges the rest to one card payment. In your own checkout, your backend applies the code with the checkout credential, and the order's gift_card_estimate says what the cards cover and what the card still pays:

Shell
# In your own checkout: apply the code the buyer typed, with the checkout credential
curl -X POST https://api.withflintpay.com/v1/orders/ord_2bqr7dExample/gift-cards \
  -H "X-Checkout-Session-ID: cs_1kmn0aExample" \
  -H "X-Checkout-Session-Secret: ckat_1kmn0aExample" \
  -H "Idempotency-Key: apply-gift-card-cart-123-1" \
  -H "Content-Type: application/json" \
  -d '{ "code": "ABCD-EFGH-JKMN-PQRS", "expected_version": 1790760000 }'

What the ledger handles:

  • Balances and partial spends. A $75 card spent on a $35 order keeps $40, and the buyer can save the card in their store account to check it.
  • Refunds. Refunding an order paid by gift card returns the value to the original card first.
  • Guessing. After repeated failed codes, Flint requires a challenge before more lookups; hosted checkout runs it for you.
  • Accounting. The gift_card_liability_v1 report rolls forward what you owe, and orders_itemized_v2 separates gift card sales from merchandise. Discounted offers, such as a $100 card for $90, record both amounts.
  • Existing cards. Import balances from another system with POST /v1/gift-cards and import funding.

The limits: Flint gift cards hold USD value issued by your business and spend only with your business. Purchased cards have no expiry or fees. They can't pay for subscriptions or buy other gift cards, face values go up to $2,000 a card, and promotional gift card products and general store credit aren't offered. The gift cards reference covers cash-out rules by state, funding losses from disputes, and recipient emails.

Who Flint is built for

US businesses selling online and in apps in USD, such as shops, restaurants, studios, and service businesses, that want gift cards on the same orders, checkout, and buyer account as everything else they sell. See Flint gift cards, Flint checkout, and the Flint commerce API.

Gift cards on Stripe and on Flint

Stripe gift card paymentsStripe coupon workaroundFlint gift cards
AvailabilityPrivate previewCoupons and promotion codesGift cards API
Who issues the cardYour gift card provider, such as SVSYour codeFlint, when the purchase is paid
Sell onlineActivation operations through the APIA Checkout product plus your emailCatalog product, fixed or custom amounts, recipient email
Redeem at hosted checkoutPayment Intents and TerminalOne code per Checkout SessionUp to 20 cards, plus one card payment
Leftover balanceHeld by the providerYour ledger and a new codeStays on the card
Refund to the cardReload or activate a new cardYour codeBack to the original card first
Liability reportFrom your providerYour booksgift_card_liability_v1

Questions, answered

Does Stripe support gift cards?

Stripe has a private preview for accepting closed-loop gift cards from a gift card provider you already have an agreement with. The docs list SVS as the supported provider, US customers, and USD, and the integration paths are the Payment Intents API and Terminal readers. Redemptions settle off Stripe.

How do I sell gift cards with Stripe?

Without a gift card provider, sell a Gift card product through Checkout and issue each buyer a coupon with a single-use promotion code, as third-party guides describe. The balance, partial spends, combining cards, and the liability are yours to track, because a Checkout Session takes one code and a used code doesn't keep a remainder.

Can customers redeem gift cards at Stripe Checkout?

Only as a coupon or promotion code you issued, one per session. Stripe's gift card payment method, in private preview, is integrated through the Payment Intents API and Terminal; Checkout isn't one of its documented integration paths.

Which payments API includes gift cards?

Flint Pay. You sell gift cards as catalog products in fixed or custom amounts, Flint issues a code when the purchase is paid and emails the recipient on the date the buyer picks, and buyers redeem up to 20 cards with one card payment at hosted checkout. Balances, partial spends, refunds back to the card, and a liability report are built in. Card processing runs on Stripe underneath.

Do Flint gift cards expire?

No. Purchased Flint gift cards have no expiry and no fees. They hold USD value issued by your business and spendable only with your business, and they can't pay for subscriptions or buy other gift cards.

Is Flint a good alternative to Stripe for gift cards?

Yes, for US businesses selling online in USD that want to sell and redeem their own gift cards without a gift card provider contract or a coupon workaround. Gift cards are part of Flint's API alongside orders and checkout; Flint's published card rate is 3.79% + 35¢, which covers Stripe's processing fees, with no monthly fee.

Sources

All sources accessed October 15, 2026.