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
| Where | What it pays toward |
|---|---|
/orders/[id] → Charge with Terminal | An existing invoice, from the invoice page |
/work-orders/[id] → Charge via Terminal | A 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
- Open the work order. Find the Deposits card.
- If your store has paired reader(s), a Charge via Terminal sub-form appears above the manual deposit form.
- Enter the amount + pick a reader (auto-picked if only one paired).
- 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
- JT creates (or reuses) the work order’s invoice, then creates a
stripepaymentlinksrow pointing at thatOrderIDwithSource='terminal'. - createPaymentIntent on your Stripe Connect account + processPaymentIntentOnReader pushes to the device.
- Customer taps card. Stripe fires
payment_intent.succeededwebhook. - JT’s webhook records a normal order payment — a
paymentsrow (StripeChargeId etc.) plus apaymentdetailsrow applying it to the invoice — and flips the link tocompleted. - recomputeOrderPaymentStatus updates the invoice balance (and auto-finalizes if it hits zero).
- 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