Skip to content

Square vs Stripe for restaurants

Square vs Stripe for restaurant software, and the API built for the check.

The usual answer is Square for a restaurant running Square’s point of sale and Stripe for a team building its own restaurant software. Both leave the software team work: Square’s Orders API adds 1% per transaction when another processor takes the payment and its Refunds API doesn’t support itemized refunds, and Stripe has no order or check object, so modifiers, tabs, tips, and split checks are your code. Flint Pay is the third option for online ordering and QR pay-at-table: the check is an order with priced modifiers, open tabs, server-computed tips, split checks with the tip shared to the cent, service charges, and 86-ing from stock, with cards processed on Stripe.

3.79% + 35¢ on cards · no monthly fee · free sandbox · no credit card

last reviewed 2026-10-15 · sources

01The options

Three options for teams building restaurant software.

Ranked for a team that writes its own ordering or pay-at-table product and takes payments online. Each figure is from the vendor's own page, linked under Sources.

  1. 01

    Flint Pay

    Restaurant software that takes card-not-present payments: online ordering, QR pay-at-table, and payment links, with the check modeled for you.

    Check model
    order, modifiers, tabs, tips, splits
    Cards
    3.79% + 35¢
    Monthly
    no monthly fee
  2. 02

    Square APIs

    Software for restaurants that already run Square's point of sale and take Square payments.

    Plans
    $0, $49, $149 per location/mo
    Orders API, other processor
    1% per transaction
    Itemized refunds, API
    not in Refunds API
  3. 03

    Stripe

    Teams that will build the check, the modifiers, and the split logic themselves.

    Order or check object
    your database
    Tipping features
    Terminal readers
    Refund
    an amount

02Side by side

Square, Stripe, and Flint for restaurant software, need by need.

The middle column is what Square's and Stripe's own docs say today, each linked under Sources. The Flint column is what a Flint order does, with the API name behind it.

The checkSquare APIs, or Stripe: Square: an Orders API order, with a 1% fee per transaction when another processor takes the payment. Stripe: no order object since stripe-node 11.0.0 (2022); its fulfillment guide leaves saving line items to your code. Stripe Orders APIFlint: An order with line items, priced modifiers, charges, tax, and tips, totaled by Flint on every change.POST /v1/orders
Open tabsSquare APIs, or Stripe: Stripe: with no order object, each round and the running total live in your database.Flint: Leave the order open and append each round. The response is the whole check with totals recomputed.POST /v1/orders/{order_id}/line-items
TipsSquare APIs, or Stripe: Square: tips are set per payment, and the order’s tip fields are read-only sums. Stripe: on-reader and on-receipt tipping are Terminal features. Tips on Stripe CheckoutFlint: Request a tip as a percent on the order. Flint computes the amount, and hosted checkout shows a tip picker.requested_tip
Split checksSquare APIs, or Stripe: Square: in Square's app, splitting one item into portions, such as a third of a bottle of wine, needs Square for Restaurants Plus or Premium. Stripe: one PaymentIntent per card, with the balance tracked by your code.Flint: One payment leg per guest, settled in one call. Flint shares the tip across the cards in proportion to each, to the cent.payment_intent_allocations
Refund one dishSquare APIs, or Stripe: Square: “The Refunds API doesn’t support itemized refunds.” Stripe: a refund is an amount against a Charge or PaymentIntent. Square item refundsFlint: Refund the dish by line item. Its share of tax goes back with it; the tip stays.line_item_allocations
86 an itemSquare APIs, or Stripe: Stripe: the fulfillment guide leaves updating inventory or stock records to your code. Stripe inventory trackingFlint: Stock per location. Hold the last portions while a guest pays; if the stock is gone at payment, the payment fails before money moves.POST /v1/inventory-reservations

03What you build

What does restaurant software build on top of Stripe?

Stripe's unit is an amount. Each box on the left is code and data your team writes so a check behaves like a check. On Flint each job is a field or an endpoint on the order.

On a payments API, you build

payment_intent.succeededyour database
  1. Modifiers

    A modifiers table, price deltas, and tax flags

    re-priced by your code before every charge

  2. Open tabs

    A tabs table and a running total

    recomputed after every round

  3. Tips

    Tip math and a tip ledger

    18% of which subtotal, asked vs collected

  4. Service charges

    Fees faked as line items

    discounted by accident when a promotion lands

  5. Split checks

    Several charges and a balance you reconcile

    penny rounding, stale totals, paid-twice guards

  6. 86-ing

    A counter you decrement

    oversold when two guests order the last one

  7. Refund one dish

    Refund arithmetic by hand

    the dish, its modifiers, its share of tax

7 systems to build and keep in sync

On Flint, the order carries it

ord_1kmn0aExampleGET /v1/orders/{order_id}
  1. Modifiers

    modifier_total_moneyline_items[].modifiers
  2. Open tabs

    running_balance_moneyPOST /v1/orders/{order_id}/line-items
  3. Tips

    requested_tipsettled_tip_money
  4. Service charges

    charges[]POST /v1/orders/{order_id}/charges
  5. Split checks

    outstanding_moneyPOST /v1/orders/{order_id}/pay
  6. 86-ing

    available_quantityPOST /v1/inventory-reservations
  7. Refund one dish

    refunded_quantityPOST /v1/refunds

1 order · 1 API key · 1 webhook stream

Payments for restaurant tech →Does Stripe have an Orders API? →

04Split checks

How does a split check with a tip work on Flint?

Two guests, one $36.48 check with an 18% tip. Your code picks each guest's amount; Flint settles both cards in one call and shares the $5.21 tip between them, 261 and 260 cents.

Settle both legs
# both cards are on the table: settle both legs in one call
curl -X POST \
  https://api.withflintpay.com/v1/orders/ord_7g2TableTwelve/pay \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: table-12-close" \
  -d '{
    "action": "confirm_payment_intents",
    "payment_intents": [
      {
        "payment_intent_id": "pi_1kmn0aExample",
        "token": "pm_1kmn0aExample"
      },
      {
        "payment_intent_id": "pi_2bqr7dExample",
        "token": "pm_2bqr7dExample"
      }
    ],
    "expected_outstanding_money": {
      "amount": 3648,
      "currency": "USD"
    },
    "completion_behavior": "complete_order"
  }'

expected_outstanding_money rejects the payment before any card is charged if the check changed since the guests saw it.

The check after
{
  "data": {
    "order_id": "ord_7g2TableTwelve",
    "status": "closed",
    "payment_status": "paid",
    "tips": [
      {
        "order_tip_id": "tip_1kmn0aExample",
        "status": "settled",
        "settled_amount_money": { "amount": 521, "currency": "USD" },
        "payment_intent_allocations": [
          {
            "payment_intent_id": "pi_1kmn0aExample",
            "amount_money": { "amount": 261, "currency": "USD" }
          },
          {
            "payment_intent_id": "pi_2bqr7dExample",
            "amount_money": { "amount": 260, "currency": "USD" }
          }
        ]
      }
    ],
    "settlement_amounts": {
      "settled_tip_money": { "amount": 521, "currency": "USD" },
      "paid_money": { "amount": 3648, "currency": "USD" },
      "outstanding_money": { "amount": 0, "currency": "USD" }
    }
  }
}

Each card's share of the tip is on the tip itself, so a server's tip report reads it instead of computing it.

Tips and charges guide →Payments for restaurant tech →

05Included

What else does a Flint order handle for restaurant software?

QR pay-at-table, modifiers, tabs, charges, and the kitchen's webhooks, all on the same order your app already holds.

A guest scans a QR code on the check and pays the open order on their own phone, with a tip picker.

POST /v1/checkout-sessions

Modifier sets price each add-on and print kitchen notes on the ticket but not the receipt.

POST /v1/modifier-sets

Each round appends to the open order, and the activity trail returns a running balance.

running_balance_money

Service, delivery, and packaging charges sit beside line items, so a promotion never shrinks them.

charges[]

A stale total is rejected before any card is charged.

expected_outstanding_money

The kitchen and guest screens follow one webhook stream, and the check closes once.

order.paid

See every restaurant flow →

06Who Flint is for

Flint is built for teams building online restaurant software in the US.

If that describes your product, the check model above is running the day you create your account.

Card-not-present

Online ordering, QR pay-at-table on the guest's phone, payment links, and the dashboard's virtual terminal. Card readers and tap to pay aren't available, so in-person card payments stay on your current reader.

US restaurants

Flint onboards businesses in the US and pays out in USD to each restaurant's own bank account. Guests can pay from anywhere with a card, Apple Pay, or Google Pay.

The whole check

Modifiers, open tabs, tips, split checks, service charges, line-item refunds, and stock per location on one order.

Developers and agents

A public OpenAPI spec, Node and PHP SDKs, a CLI, llms.txt, and MCP servers a coding agent can read.

07Switching

How do you build a restaurant check on Flint?

Five calls from menu to closed check. Each one runs in a sandbox with Stripe's test cards before you switch to live keys.

  1. Load the menu

    POST /v1/products

    Create each dish with its variants and attach modifier sets, so add-ons are priced by the catalog and kitchen notes print on the ticket.

  2. Open the check

    POST /v1/orders

    Create an order with the first round and leave it open. Append later rounds to the same order.

  3. Let the table pay

    POST /v1/checkout-sessions

    Create a checkout session for the open order with tipping on, and print its URL as a QR code on the check.

  4. Split when the table asks

    POST /v1/orders/{order_id}/pay

    Create one payment leg per guest and settle them in one pay call with the expected outstanding amount. Flint shares the tip across the cards.

  5. Close it everywhere

    order.paid

    Listen for order.paid, which fires once when the whole check is covered, and update the kitchen and guest screens from it.

Read the restaurant tech page →

08Start

From a sandbox key to a paid test order in ten minutes.

Node

npm install @flintpay/node

CLI

npm install -g @flintpay/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.

Sources

Where each claim comes from.

  • No transaction fee for orders paid with Square payments; 1% per transaction with a non-Square payments provider. Square: Payments pricing

    developer.squareup.com · checked 2026-10-15
  • The Refunds API doesn't support itemized refunds. Square: Refunds and exchanges

    developer.squareup.com · checked 2026-10-15
  • Tips are recorded per payment with tip_money; the order's tip fields are read-only and calculated by Square. Square: Take payments

    developer.squareup.com · checked 2026-10-15
  • Splitting individual items into portions, such as a third of a bottle of wine, and recombining them is available only for Square for Restaurants Plus or Premium subscribers. Square Support: Split a check by item or seat

    squareup.com · checked 2026-10-15
  • Square Free $0, Square Plus $49, and Square Premium $149 per location per month. Square press release: unified plans and pricing

    squareup.com · checked 2026-10-15
  • The fulfill_checkout function must handle repeat and concurrent calls, retrieve the session with line items, check payment_status, perform fulfillment, and record fulfillment status. Saving payment details and line items in your own database and updating inventory or stock records are listed as things you might want it to do. Stripe: Fulfill orders

    docs.stripe.com · checked 2026-10-15
  • Orders 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-15
  • A refund names a Charge or PaymentIntent and an amount; no parameter names a line item. Stripe: Create a refund

    docs.stripe.com · checked 2026-10-15
  • On-reader and on-receipt tipping are Terminal features. Stripe: Collect tips

    docs.stripe.com · checked 2026-10-15
  • Terminal: readers and SDKs for a custom POS app or third-party POS integrations, 2.7% + 5¢ per successful US card transaction. Stripe Terminal

    stripe.com · checked 2026-10-15

last reviewed 2026-10-15 · corrections: Flint Help

FAQ

Questions people ask.

Is Square or Stripe better for restaurant software?

Square sells a restaurant point of sale with hardware and monthly plans of $0, $49, or $149 per location, and its Orders API charges 1% per transaction when another processor takes the payment. Stripe sells payments APIs and Terminal card readers and leaves the check, modifiers, tabs, and splits to your code. For a team building online ordering or QR pay-at-table, Flint Pay is the third option: a payments API whose order is already a restaurant check.

Does Stripe have a POS for restaurants?

Stripe's in-person product is Terminal: card readers and SDKs for building your own point-of-sale app or connecting a third-party one, at 2.7% + 5¢ per US card transaction. On-reader and on-receipt tipping are Terminal features. The check itself, with modifiers, open tabs, and split payments, is your software's job: Stripe has no order object, and its fulfillment guide leaves saving line items in your own database to your code.

What is the best payments API for restaurant software?

For online ordering and QR pay-at-table in the US, Flint Pay. The check is an order with priced modifiers and charges, rounds append to an open tab, Flint computes the tip and shares it across split payments to the cent, refunds go back by dish, and stock per location lets you 86 an item. Cards are processed on Stripe. Payments for restaurant tech

Is Flint a good alternative to Square and Stripe for restaurant software?

Yes, for US teams building online ordering, QR pay-at-table, or kiosk ordering that runs in a web browser and takes card-not-present payments. Flint has no monthly fee and one card rate, 3.79% + 35¢, which covers Stripe’s processing fees and the check model. Flint takes card-not-present payments only, so in-person card payments stay on your current reader. Sign up on the web or from the terminal with flint signup.

How are tips shared on a split check?

On Flint, the tip is requested on the order, as a percent or an amount. When several cards settle in one pay call, Flint shares the tip across them in proportion to each card's amount, assigns the odd cents by a fixed rule, and records each card's share on the tip. On Square, tips are set on each payment. On Stripe outside Terminal, a tip is part of the amount your code charges.

Does Flint take in-person card payments?

No. Flint takes card-not-present payments: hosted checkout, QR pay-at-table on the guest's phone, payment links, Stripe Elements on your own web pages, and the dashboard's virtual terminal. Card readers and tap to pay aren't available and have no release date.

Build the restaurant app. The check is already modeled.

Free sandbox, no credit card, no sales call. Open a tab, split it across two test cards with the tip shared to the cent, and refund one dish.

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