Flint vs Stripe
Flint Pay vs Stripe: Stripe processing underneath, the commerce system on top.
Flint Pay runs on Stripe’s card processing and adds the commerce system Stripe leaves you to build: orders, product variants, inventory held at payment, stacked promotions, automatic US sales tax computed after discounts, shipping and pickup, returns, and line-item refunds. On Stripe, its own fulfillment guide leaves saving line items and updating stock to your code after each payment. On Flint the order is the record, and the dashboard, hosted checkout, and buyer account come with your API keys.
3.79% + 35¢ on cards · no monthly fee · free sandbox · no credit card
last reviewed 2026-10-15 · sources
01Side by side
Flint vs Stripe, need by need.
The Stripe column is what Stripe's own docs and pricing pages say today, each linked under Sources. The Flint column is what a Flint account does, with the API name behind it.
| What you need | Stripe Payments, Checkout, and Billing | Flint |
|---|---|---|
| Card processing | Stripe Payments, Checkout, and Billing: Stripe. | Flint: Stripe, on a processing account Flint sets up and runs for you. Card details go from the buyer's browser straight to Stripe. |
| Order record | Stripe Payments, Checkout, and Billing: No order object. The Orders and SKU resources were removed in stripe-node 11.0.0 (2022-11-15), and the fulfillment guide leaves saving line items to your code. Orders API history | Flint: Every checkout, payment link, invoice, and subscription renewal creates an order with line items and server-computed totals.POST /v1/orders |
| Product variants | Stripe Payments, Checkout, and Billing: A separate product for each size and color combination, per Stripe's catalog guide. | Flint: Products with options and variants, plus categories, modifier sets, and bundles.POST /v1/products |
| Inventory | Stripe Payments, Checkout, and Billing: No stock field on the Product object. The fulfillment guide leaves updating inventory or stock records to your code. Stripe inventory tracking | Flint: Stock per location, held when payment starts, committed when it succeeds, and released when it fails.held_quantity |
| Discount codes | Stripe Payments, Checkout, and Billing: Checkout Sessions currently support up to one coupon or promotion code. | Flint: Codes and automatic promotions that stack by rules you set, including buy X get Y, with a preview call.combines_with |
| Sales tax | Stripe Payments, Checkout, and Billing: Stripe Tax, priced separately: 0.5% per transaction on no-code integrations or 50¢ per API transaction, where you're registered. | Flint: Automatic US sales tax computed after discounts and recorded per line, at 0.50% only on payments that carry tax. Or pass your own rates.tax_money |
| Shipping and pickup | Stripe Payments, Checkout, and Billing: Shipping rates are a fixed amount for the whole order, and only payment-mode Checkout Sessions take shipping options. Local pickup on Stripe | Flint: Region-priced rates, free shipping over a threshold, in-store pickup, scheduled local delivery, and rate callbacks, on one-time orders and on subscription renewals.POST /v1/delivery-methods |
| Refund one item | Stripe Payments, Checkout, and Billing: A refund is an amount against a Charge or PaymentIntent; no parameter names a line item. Line-item refunds on Stripe | Flint: Refund by line item and quantity. Flint computes the item's share of the discount and the tax.line_item_allocations |
| Tips online | Stripe Payments, Checkout, and Billing: Stripe’s tipping features, on-reader and on-receipt, are for Terminal in-person payments. Tips on Stripe Checkout | Flint: Tip presets on hosted checkout and payment links: three percentages or smart fixed amounts.tip_percent_options |
| Invoice late fees | Stripe Payments, Checkout, and Billing: Invoicing from 0.4% per paid invoice. The documented invoice statuses are draft, open, paid, void, and uncollectible, and neither the lifecycle docs nor the pricing page lists a late fee. | Flint: Payment terms with a fixed or percentage late fee, an overdue status, reminders on your schedule, and credit notes, at 0.40% of invoice-collected payments.late_fee_policy |
| Subscriptions | Stripe Payments, Checkout, and Billing: Stripe Billing, 0.7% of Billing volume on pay as you go. Shipping on Stripe subscriptions | Flint: Any interval, trials, setup fees, and four retries over 16 days. Each renewal is an order that can ship. 0.40% of subscription payments.POST /v1/subscriptions |
| Buyer account | Stripe Payments, Checkout, and Billing: The customer portal manages payment details, invoices, and subscriptions. One-time orders in the portal | Flint: A hosted buyer account with orders, tracking, returns, invoices, subscriptions, and saved cards, or build your own on the same API.GET /v1/me/orders |
02What you build
What do you build around Stripe to sell physical products?
Each box on the left is code and data your team writes, tests, and keeps in sync with Stripe after every payment, refund, and return. On Flint each job is already a field or an endpoint on the order.
Around Stripe Checkout, you build
Orders
An orders table and an order lines table
written from checkout.session.completed
Variants
A Stripe product per size and color
mapped back to the catalog you keep
Inventory
A stock table, a hold at checkout start
and a sweep that releases expired holds
Promotions
Your own stacking and best-offer logic
because a Checkout Session takes one code
Refund tax
Each line's tax and discount share, stored
and recomputed for every partial refund
Returns
A returns table, inspections, restocking
and the refund each approved return triggers
Order history
An order history page for one-time buyers
beside the portal's invoices and subscriptions
Fulfillment
A handler safe to run twice, concurrently
plus a fulfillment status you record yourself
8 systems to build, run, and keep in sync
On Flint, you read the order
Orders
orderPOST /v1/ordersVariants
variantsPOST /v1/productsInventory
held_quantityGET /v1/inventory-levelsPromotions
combines_withPOST /v1/promotionsRefund tax
line_item_allocationsPOST /v1/refundsReturns
returnPOST /v1/returnsOrder history
ordersGET /v1/me/ordersFulfillment
fulfillmentsorder.paid
1 order · 1 API key · 1 webhook stream
03After the payment
What runs on your server after a Stripe Checkout payment?
Stripe's guide asks for a fulfillment function that survives repeat and concurrent calls, retrieves the session with its line items, checks the payment status, fulfills, and records that it did. The left pane is that function with its database writes filled in. The right pane is the whole handler on Flint.
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
export async function POST(request: Request) {
const event = stripe.webhooks.constructEvent(
await request.text(),
request.headers.get("stripe-signature")!,
process.env.STRIPE_WEBHOOK_SECRET!,
);
if (
event.type === "checkout.session.completed" ||
event.type === "checkout.session.async_payment_succeeded"
) {
await fulfillCheckout(event.data.object.id);
}
return new Response(null, { status: 200 });
}
// must be safe to call twice, even at the same time, for one session
async function fulfillCheckout(sessionId: string) {
const session = await stripe.checkout.sessions.retrieve(sessionId, {
expand: ["line_items"],
});
if (session.payment_status === "unpaid") return;
await db.transaction(async (tx) => {
if (await tx.orders.findBySession(sessionId)) return; // already done
const order = await tx.orders.insert({ sessionId, total: session.amount_total });
for (const line of session.line_items!.data) {
await tx.orderLines.insert({
orderId: order.id,
priceId: line.price!.id,
quantity: line.quantity,
tax: line.amount_tax, // kept for the partial refund later
});
await tx.stock.decrement(line.price!.id, line.quantity!); // your count, not Stripe's
}
await tx.fulfillments.insert({ orderId: order.id, status: "pending" });
});
}Stripe's required steps, with its TODOs and the optional writes its guide suggests (saving line items, updating stock) filled in. The order tables, the duplicate check, and the stock count are yours to run and back up.
import { Client } from "@flintpay/node";
const flint = new Client({
baseUrl: "https://api.withflintpay.com",
apiKey: process.env.FLINT_API_KEY!,
});
export async function POST(request: Request) {
const rawBody = new Uint8Array(await request.arrayBuffer());
const { event, known } = flint.verifyWebhook(
rawBody,
Object.fromEntries(request.headers),
[process.env.FLINT_WEBHOOK_SECRET!],
);
if (known && event.event_type === "order.paid") {
// lines, tax, discounts, and committed stock are on the order
await startShipment(event.data.object.order_id);
}
return new Response(null, { status: 204 });
}The cart went in by variant, so Flint priced each line, held the stock at payment, and committed it on success. order.paid fires once per order, and a retry carries the same webhook id.
04Included
What does a Flint account include that Stripe leaves to you?
One API and one dashboard. Checkout, payment links, orders, catalog, inventory, discounts, fulfillment, returns, refunds, the buyer account, and reporting are in the 3.79% + 35¢ card rate, with no monthly fee. Invoices, subscriptions, and automatic tax are priced add-ons.
Products carry options and variants, plus categories, modifier sets, and bundles.
POST /v1/productsStock is held per location when payment starts, committed on success, and released on failure.
held_quantity · committed_quantityCodes and automatic promotions stack by rules you set, with a preview call that shows the result first.
POST /v1/discount-previewsAutomatic US sales tax is computed after discounts and recorded on each line item and in the order total.
tax_moneyShipping prices by region, goes free over a threshold, or switches to in-store pickup or scheduled local delivery.
POST /v1/delivery-methodsReturns run from a policy, with inspections, restocking fees, exchanges, and buyer self-serve.
POST /v1/return-policiesRefund a line item and its share of the discount and the tax goes back with it.
line_item_allocationsHosted checkout and payment links offer tip presets, as percentages or smart fixed amounts.
tip_percent_optionsInvoice payment terms carry a fixed or percentage late fee, with reminders on your schedule.
late_fee_policySubscription renewals are orders, so a box ships, quotes shipping, and gets taxed every cycle.
POST /v1/subscriptionsBuyers get a hosted account with their orders, tracking, returns, invoices, and saved cards.
GET /v1/me/ordersPricing →The commerce API →Selling physical goods on Flint →
05Who Flint is for
Flint is built for US businesses selling online.
If that describes you, everything above is running the day you create your account.
US businesses
Flint onboards businesses in the US and pays out in USD to your own bank account. Buyers can pay from anywhere with a card.
Online payments
Hosted checkout, payment links, invoices, or Stripe Elements on your own site, with cards, Apple Pay, Google Pay, ACH debit, and Affirm.
Goods and services
Orders that ship, get picked up, deliver locally, or fulfill as a download or a service, with stock held at payment.
Developers and agents
A public OpenAPI spec, Node and PHP SDKs, a CLI, llms.txt, and MCP servers a coding agent can read.
06Switching
How do you switch from Stripe to Flint?
One flow at a time. Your frontend keeps Stripe.js and Stripe Elements for card entry; the calls your backend makes change.
Recreate the catalog
POST /v1/productsCreate each product with its options and variants, and keep the Stripe product id in metadata so your reports and support tools resolve during the cutover.
Replace Checkout Sessions and Payment Links
POST /v1/checkout-sessionsCreate an order from the cart and open a hosted checkout for it, or create a Flint payment link. Both collect what the order owes, with tax and discounts already computed.
Move subscribers without a second charge
POST /v1/subscriptionsRecreate each recurring price as a subscription plan. Flint has no card import, so each subscriber first saves a card on Flint, in the hosted buyer account or on your own page. Then create their subscription with an imported billing start set to the start of the period Stripe already billed. Flint charges nothing for that period and takes over at the next renewal.
Fulfill from order.paid
order.paidMove the job your checkout.session.completed handler runs to order.paid, and verify Flint's webhook signatures in place of Stripe's.
Go live
Run each flow in a sandbox with Stripe's test cards, then switch to live keys. The host and the paths stay the same.
07Start
From a sandbox key to a paid test order in ten minutes.
Node
CLI
Test keys are prefixed flint_test_ and bound to a sandbox with its own data, so nothing you try there touches live money. Pay with 4242 4242 4242 4242, any future expiry, any CVC.
Then read these
- 01Migrating from StripeThe object map, one flow at a time
- 02
- 03Stripe alternatives, rankedSquare, PayPal, Adyen, and merchants of record
- 04
- 05
- 06
Sources
Where each claim comes from.
The fulfillment function must handle repeat calls, retrieve the session with its line items, check the payment status, fulfill, and record fulfillment status; the guide lists saving line items in your own database and updating inventory or stock records among what it may also do. Fulfill orders
docs.stripe.com · checked 2026-10-15Orders and SKU resources removed in stripe-node 11.0.0, released 2022-11-15. stripe-node migration guide for v11
github.com · checked 2026-10-15A separate product for each size and color combination. How products and prices work
docs.stripe.com · checked 2026-10-15The Product object's attributes, none of them a stock or quantity on hand. The Product object
docs.stripe.com · checked 2026-10-15Checkout Sessions currently support up to one coupon or promotion code. Add discounts
docs.stripe.com · checked 2026-10-15Shipping rates are fixed amounts for the entire order, and only payment-mode Checkout Sessions support shipping options. Charge for shipping
docs.stripe.com · checked 2026-10-15A refund names a Charge or PaymentIntent and an amount; no parameter names a line item. Create a refund
docs.stripe.com · checked 2026-10-15On-reader and on-receipt tipping are Terminal features. Collect tips
docs.stripe.com · checked 2026-10-15Invoice statuses: draft, open, paid, void, and uncollectible. How invoicing works
docs.stripe.com · checked 2026-10-15Invoicing Starter at 0.4% and Plus at 0.5% per paid invoice. Stripe Invoicing pricing
stripe.com · checked 2026-10-15Billing at 0.7% of Billing volume on pay as you go. Stripe Billing pricing
stripe.com · checked 2026-10-15Stripe Tax Basic at 0.5% per no-code transaction or 50¢ per API transaction, where you're registered. Stripe Tax pricing
stripe.com · checked 2026-10-15The customer portal manages payment details, invoices, and subscriptions. Customer portal
docs.stripe.com · checked 2026-10-15
last reviewed 2026-10-15 · corrections: Flint Help
FAQ
Questions people ask.
What is the difference between Flint Pay and Stripe?
Stripe processes payments, and its fulfillment guide leaves the order record, stock updates, and fulfillment status to code on your server. Flint runs on Stripe's processing and adds that commerce system: orders with line items, product variants, inventory held at payment, promotions that stack, automatic US sales tax computed after discounts, shipping and pickup, returns, line-item refunds, invoices with late fees, subscriptions, a hosted buyer account, and a dashboard.
Is Flint a good alternative to Stripe for a small business?
Yes, for a US business selling goods or services on its own website or app that wants orders, inventory, promotions, sales tax, shipping, returns, and invoices without building them. Flint has no monthly fee and one published card rate, 3.79% + 35¢, which covers Stripe’s processing fees and the core commerce system; invoices, subscriptions, and automatic tax are priced add-ons. Sign up on the web or from the terminal with flint signup.
Is there a Stripe alternative with orders and inventory built in?
Flint. Every checkout, payment link, invoice, and renewal creates an order with line items and server-computed totals, and stock is tracked per location: held when payment starts, committed when it succeeds, and released when it fails. Stripe removed its Orders and SKU resources from stripe-node in version 11.0.0 (November 2022), and its Product object has no stock field.
Does Flint use Stripe?
Yes. Stripe processes every card payment on Flint. Card details go from the buyer's browser to Stripe, so neither your server nor Flint sees card numbers. Flint sets up and runs the processing account for each business, so you sign up once and hold one set of API keys. Flint does not connect to a Stripe account you already have.
How much does Flint cost compared with Stripe?
Flint charges 3.79% + 35¢ per card payment with no monthly fee. The rate covers Stripe’s processing fees and includes checkout, payment links, orders, catalog and inventory, discounts, fulfillment, returns, refunds, the buyer account, and reporting. Invoices and subscriptions are 0.40% each, and automatic tax is 0.50% on payments that carry tax. On Stripe, Billing is 0.7% of Billing volume, Stripe Tax is 0.5% per transaction on no-code integrations, and Invoicing starts at 0.4% per paid invoice, before the code you write for orders, stock, and returns. Flint pricing
Can I move Stripe subscribers to Flint without charging them twice?
Yes. Flint has no card import, so each subscriber first saves a card on Flint, in the hosted buyer account or on your own page. Then create their Flint subscription with an imported billing start set to the start of the period Stripe already billed. Flint charges nothing for that period, computes its end from the plan interval, and takes over at the next renewal. Stripe migration guide
Keep Stripe's processing. Stop building the store around it.
Free sandbox, no credit card, no sales call. Create an order by variant, take a test payment, and refund one line with its share of the tax.
Or run npm install -g @flintpay/cli && flint signup to create your account and a sandbox key from the terminal. CLI guide
More comparisons · last reviewed 2026-10-15