Commerce-first comparison

Stripe Payments handles the rail. Commerce-first APIs handle everything the rail leaves behind.

This comparison is for teams whose processor integration already works, but whose application keeps absorbing all the order, billing, and post-payment logic Stripe Payments does not try to own.

Stripe Payments
payments API
card collection
payment state
processor events

Strong at moving money, intentionally narrow above the rail.

Commerce-first API
orders + hosted flows + refunds + billing

Own the application state above the processor instead of rebuilding it yourself.

What This Page Answers

Do we need a better processor integration or a better commerce model above the processor?

If the pain is checkout state, refunds, hosted links, invoice collection, or subscription context, the gap is usually in the model above Stripe Payments rather than the rail itself.

Processor APIs are not wrong. They are just narrower than the workflow your product eventually needs.

Stripe Payments is strong when the job is collecting money. The trouble starts when your product needs a record of what was sold, what changed later, how hosted flows connect back to the sale, or how support explains the transaction after the fact.

A commerce-first API exists to own those questions directly instead of leaving them as internal application architecture problems.

Code comparison

The difference shows up before the first card is charged

One system begins by moving money. The other begins by modeling the sale that money movement belongs to.

Stripe Payments
const paymentIntent = await stripe.paymentIntents.create({
amount: 6384,
currency: "usd",
metadata: { order_id: "internal_1042" },
});
// Stripe now knows charge state.
// Your app still owns:
// - line items
// - discounts
// - tax math
// - refund allocation
// - customer-facing order history
Commerce-first Flint flow
const order = await flint.orders.create({
line_items: [
{ name: "Coffee Beans", quantity: 2,
unit_price_money: { amount: 1999, currency: "USD" } },
{ name: "Pour-Over Mug", quantity: 1,
unit_price_money: { amount: 2400, currency: "USD" } },
],
discounts: [{ coupon: { coupon_code: "WELCOME10" } }],
});
// Flint computes totals and keeps the record:
// order.net_amounts → subtotal, discount, tax, paid, balance
// order.activities → every state change
// order.payment_intent_ids, refund_ids, checkout_session_ids

Side by side

Processor-first and commerce-first APIs solve different layers of the stack

This is the layer-by-layer difference a technical buyer should actually care about.

CapabilityStripe PaymentsFlint commerce-first API
Primary object
What the API wants you to organize around
PaymentIntent / charge
Order and linked commerce objects
Hosted collection
Checkout and payment-request surfaces
Separate surfaces you still rejoin in app logic
Hosted flows tied to the same model
Receivables
Formal invoice collection and manual settlement
Lives beside payments
Part of the same platform family
Refund reasoning
How later operators understand what changed
Refund money and correlate app data later
Refund stays attached to the business workflow
Recurring billing context
Where subscriptions sit relative to the sale
Adjacent billing concern
Recurring flows remain inside the same model

A commerce-first API is not a better payment rail. It is a better home for the application state that grows above the rail.

The right answer depends on where your real complexity lives

If your product only needs to charge an amount and show payment success, Stripe Payments may already be enough.

If your team keeps building order state, hosted-flow joins, refund ledgers, invoices, and recurring-billing glue, a commerce-first API becomes the better fit because it owns those concerns directly.

Decision path

A simple way to decide

Use this sequence when the team is unsure whether the current pain is payment-rail related or architecture related.

Step 1

List the systems support checks after a payment issue

If the answer is processor dashboard plus internal tables plus webhook logs, the problem is likely above the rail.

Step 2

List the business objects your app already stores beside Stripe

If you have orders, line items, refund ledgers, invoice state, and hosted-flow joins, you are already operating a commerce layer.

Step 3

Choose whether to keep owning that layer

If not, move into a commerce-first API that makes those objects part of the public contract.

Frequently asked questions

Decide whether you need a better rail or a better model

If the business pain lives above the payment, a commerce-first API is the more important upgrade than another processor-shaped surface.