Take a Deposit on Stripe Terminal
The same paired Stripe Terminal reader your store uses for invoice payments now works for pre-invoice deposits on work orders. Customer comes in for a custom-job consult → leaves a deposit on their card before any invoice exists → the deposit auto-applies as a credit when the invoice is created at completion.
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 |
/work-orders/[id] → Charge via Terminal | A pre-invoice deposit on the work order |
Mechanically identical from the customer’s perspective — same reader, same tap/insert/swipe flow.
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]”. A
repair_depositsrow materializes in the list below. 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
- Action creates a
stripepaymentlinksrow withRepairIDset +OrderIDnull +Source='terminal'. - createPaymentIntent on your Stripe Connect account + processPaymentIntentOnReader pushes to the device.
- Customer taps card. Stripe fires
payment_intent.succeededwebhook. - JT’s webhook detects the deposit context (RepairID set, OrderID null) and creates BOTH a
paymentsrow (StripeChargeId etc.) AND arepair_depositsrow (PaymentMethod=stripe_terminal, Status=collected). - The link flips to
completedwith DepositID stamped. - UI polling sees the flip → invalidates the page → deposit appears.
Auto-apply on invoice creation
When the work order is later invoiced (status → ready_for_pickup), the deposit’s payments row gets a paymentdetails row linking it to the new Order. The deposit status flips to applied. Customer’s outstanding balance on the invoice reflects the deposit.
Refunds
To refund a Stripe-collected deposit, click Refund on the deposit row. JT marks the deposit refunded and voids the underlying payments row.
Important caveat for v1: JT doesn’t currently push the refund to Stripe automatically from the deposit-refund flow. You also need to refund the charge in your Stripe dashboard manually. (Auto-Stripe-refund from the deposit-refund button is on the polish list.)
For deposits that have already been applied to an invoice, refund through the invoice’s standard refund flow instead.
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