The short answer on Flint
When a payment covers the whole order, Flint builds its receipt from the order: each line item with its quantity and price, the options and modifiers you mark for the receipt, discounts, shipping and service charges, tax, tip, total, the order number, and the payment method, with a link back to the order. A deposit or a split leg paid on its own gets a receipt with the amount paid and the order number. It goes out when the order is paid, as part of payments, with no per-receipt fee. Resend it with one call, or turn Flint's receipts off and send your own from the order.paid webhook. Card processing runs on Stripe underneath. The details are below.
What Stripe's receipts docs offer
Stripe creates a receipt for every successful payment and refund. You turn on automatic emails under Settings, Business, Customer emails, or send one by hand from a payment's page in the Dashboard. You can brand them and set the business details they show.
For more detail, Stripe's docs point to paid invoices, which include more detail than standard receipts. Subscriptions get one automatically. For a one-time payment, you enable it on each Checkout Session:
const session = await stripe.checkout.sessions.create({
mode: "payment",
line_items: cart.lineItems,
invoice_creation: { enabled: true }, // 0.4% of the total, up to $2 per invoice
customer_creation: "always", // post-purchase invoices need a Customer
success_url: "https://example.com/thanks?session_id={CHECKOUT_SESSION_ID}",
});
Stripe prices post-purchase invoices separately from Invoicing: 0.4% of the transaction total, up to $2 per invoice. On a $50 average order that is $0.20 an order, or $200 a month at 1,000 orders; the $2 cap applies from $500 up. The option exists on Checkout Sessions and Payment Links. A PaymentIntent you create directly has an amount, an optional description, and optional amount_details line items, which Stripe documents for card-network data, reconciliation, and Klarna and PayPal approvals.
The workaround: send your own receipt
Stripe's fulfillment guide lists a custom receipt email as something your fulfillment function might send. It reads the session's line items and totals and renders them:
async function sendReceipt(sessionId) {
const session = await stripe.checkout.sessions.retrieve(sessionId, {
expand: ["line_items", "line_items.data.price.product"],
});
if (session.payment_status !== "paid") return; // ACH: wait for async_payment_succeeded
// Runs from the webhook and the landing page, even at the same time. A unique
// index on session_id makes the insert the guard: only the caller that
// inserts the row sends the email.
const claimed = await db.receipts.insertIfAbsent(sessionId); // false on conflict
if (!claimed) return;
await email.send({
to: session.customer_details.email,
template: "receipt",
data: {
items: session.line_items.data.map((li) => ({
name: li.description,
quantity: li.quantity,
amount: li.amount_total,
})),
discount: session.total_details.amount_discount,
shipping: session.total_details.amount_shipping,
tax: session.total_details.amount_tax,
total: session.amount_total,
orderNumber: await db.orders.numberFor(sessionId), // yours to assign
},
});
}
That is an email template, a provider, an order number scheme, a record of what was sent, and a resend path for the buyer who lost it. These are the places it goes wrong:
Where hand-built receipts go wrong
On Flint, the receipt is the order
When an order is paid, through hosted checkout, a payment link, an invoice, or your own checkout, Flint emails the buyer a receipt drawn from the order. A paid order with a variant, a quantity of two, a promotion code, shipping, and tax reads like this:
Receipt
You paid Canyon Coffee $47.93
Order 1042
Pour-over kettle ×1: $38.00
Finish: Matte black
Filter papers ×2: $9.00
Subtotal: $47.00
Spring sale, 10% off: -$4.70
Shipping: $4.00
Tax: $1.63
Total: $47.93
PAID: $47.93
View order https://...
Payment method: Card ending in 4242
What it covers:
- Items as sold. Each line with its quantity and amount, the variant options the buyer picked, and the modifiers you set to
show_on_receipt, so "Add patty" prints and a kitchen note doesn't. - Every adjustment. Discount rows by name, charges such as shipping or a service fee, tax, and tip, adding up to the total charged.
- How it was paid. The card, or how many methods paid a split order, and each gift card by its last four characters.
- Refunds. A refund receipt lists the refunded line items with the order number.
A receipt for part of an order's balance, such as one leg paid on its own or an installment, shows the amount paid and the order number without the item list, so it never shows a total the buyer didn't pay. The item list prints once a payment covers the whole order.
To send a copy to the buyer, or to a new address:
curl -X POST https://api.withflintpay.com/v1/orders/ord_1kmn0aExample/send-receipt \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "email": "buyer@example.com" }'
To send your own design, turn off Flint's receipts and keep everything else Flint sends. order.paid still fires, and the order already holds the items, discounts, tax, and totals your template needs:
curl -X PATCH https://api.withflintpay.com/v1/settings \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "customer_email_delivery": { "order_receipts": "merchant_sends" } }'
The buyer can also find every order, with its items, in their customer account. See Customer email delivery for the other email families.
Who Flint is built for
US businesses selling online and in apps in USD, from shops to restaurants and service businesses, that want receipts, order history, and refunds by line item without building them. See Flint checkout and customer accounts.
Stripe and Flint receipts, side by side
| Stripe | Flint |
|---|
| Detailed receipt for a one-time payment | Paid invoice with invoice_creation, or your own email | Built from the order when a payment covers the whole order |
| Extra cost | 0.4% up to $2 per post-purchase invoice | None; receipts are part of payments |
| Options and modifiers | Your template | Options, and modifiers with show_on_receipt |
| Order number | Yours to assign | On every receipt |
| Resend | Dashboard, or your resend path | POST /v1/orders/{order_id}/send-receipt |
| Use your own email instead | Build it, and turn Stripe's off | order_receipts: "merchant_sends", then order.paid |
Questions, answered
Does Stripe send itemized receipts?
Stripe sends a receipt for every successful payment when you turn on successful-payment emails. Its docs say paid invoice receipts include more detail than standard receipts. Subscriptions get invoices automatically; for a one-time payment you enable a post-purchase invoice on each Checkout Session or Payment Link.
How much does a Stripe post-purchase invoice cost?
0.4% of the transaction total, up to $2 per invoice, for one-time purchases through Checkout and Payment Links. It is priced separately from Stripe Invoicing and included in Billing pricing for subscriptions. On a $50 order that is $0.20, or $200 a month at 1,000 orders.
How do I send a receipt with line items for a Stripe PaymentIntent?
Send your own. A PaymentIntent you create carries an amount and an optional description; line items you add in amount_details are documented for card-network data and reconciliation, not receipts. Build the email from your order record when payment_intent.succeeded arrives, once per payment.
Which payments API sends itemized receipts automatically?
Flint Pay. When a payment covers the whole order, its receipt is built from the order: line items with quantities, selected options and modifiers, discounts, shipping and service charges, tax, tip, total, order number, and payment method. A receipt for part of the balance, such as a deposit or one card of a split paid on its own, shows the amount paid and the order number. Receipts are included with payments, and you can resend one with POST /v1/orders/{order_id}/send-receipt. Card processing runs on Stripe underneath.
Can I send my own receipts instead of Flint's?
Yes. Set customer_email_delivery.order_receipts to merchant_sends in your settings, and send your email from the order.paid webhook. The order already holds the items and totals to render. Flint keeps sending the other email families unless you turn them off one by one.
Is Flint a good alternative to Stripe for receipts and order history?
Yes, for US businesses selling online in USD that want itemized receipts, a buyer account with order history, and line-item refunds without building them. Flint's published card rate is 3.79% + 35¢, which covers Stripe's processing fees, with receipts included and no monthly fee.
Sources
All sources accessed October 15, 2026.