All articles

Sales

Take a Deposit on Stripe Terminal

Push a deposit charge to a paired Stripe Terminal reader from a work order — same reader your store uses for invoices.

Take a Deposit on Stripe Terminal

The same paired Stripe Terminal reader your store uses for invoice payments also works for deposits on work orders. Customer comes in for a custom-job consult → leaves a deposit on their card → the deposit posts straight to the work order’s invoice and reduces the balance due.

If you haven’t paired a reader yet, see Pair a Stripe Terminal Reader first.

How it differs from invoice charging

WhereWhat it pays toward
/orders/[id]Charge with TerminalAn existing invoice, from the invoice page
/work-orders/[id]Charge via TerminalA deposit on the work order (posts to the work order’s invoice)

Mechanically identical from the customer’s perspective — same reader, same tap/insert/swipe flow. Either way the money lands on an invoice.

How to charge

  1. Open the work order. Find the Deposits card.
  2. If your store has paired reader(s), a Charge via Terminal sub-form appears above the manual deposit form.
  3. Enter the amount + pick a reader (auto-picked if only one paired).
  4. Charge via Terminal.

A blue banner replaces the form: Charging $X on [reader] — Waiting for the customer to tap, insert, or swipe their card. JavaScript polls every 2 seconds until the charge resolves.

When the customer pays

  • Approved — banner flips to green: ”✓ Deposit collected — $X on [reader]”. The payment posts to the work order’s invoice and the balance updates when the page refreshes. The banner auto-dismisses after 3 seconds.
  • Declined / cancelled / timed out — banner flips red with the reason. Click Dismiss and try a different method.

What happens server-side

  1. JT creates (or reuses) the work order’s invoice, then creates a stripepaymentlinks row pointing at that OrderID with Source='terminal'.
  2. createPaymentIntent on your Stripe Connect account + processPaymentIntentOnReader pushes to the device.
  3. Customer taps card. Stripe fires payment_intent.succeeded webhook.
  4. JT’s webhook records a normal order payment — a payments row (StripeChargeId etc.) plus a paymentdetails row applying it to the invoice — and flips the link to completed.
  5. recomputeOrderPaymentStatus updates the invoice balance (and auto-finalizes if it hits zero).
  6. UI polling sees the flip → invalidates the page → the new balance shows.

Refunds

A Terminal deposit is a payment on the work order’s invoice, so refund it from the invoice’s refund flow.

Important caveat: JT doesn’t push the refund to Stripe automatically — you also need to refund the charge in your Stripe dashboard manually.

See also

  • Take a Deposit on a Work Order — the broader deposit model (cash / check / Stripe / etc.)
  • Charge a Card on the In-Store Reader — invoice-side Terminal flow
  • Pair a Stripe Terminal Reader — initial setup