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 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

WhereWhat it pays toward
/orders/[id]Charge with TerminalAn existing invoice
/work-orders/[id]Charge via TerminalA pre-invoice deposit on the work order

Mechanically identical from the customer’s perspective — same reader, same tap/insert/swipe flow.

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]”. A repair_deposits row 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

  1. Action creates a stripepaymentlinks row with RepairID set + OrderID null + 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 detects the deposit context (RepairID set, OrderID null) and creates BOTH a payments row (StripeChargeId etc.) AND a repair_deposits row (PaymentMethod=stripe_terminal, Status=collected).
  5. The link flips to completed with DepositID stamped.
  6. 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