Refund a Stripe Payment
Money only. This article covers the per-row Refund button on a Stripe payment row in an invoice’s Payments tab. It refunds the customer’s card via Stripe and records a matching negative-amount row on the same invoice. It does not return items to inventory. If the customer is returning items, see Returns and Exchanges — that flow uses a new invoice with
Source = Previously Purchased+ negative quantity, which restores inventory line-by-line and updates reports correctly.
When to use this Refund button
- The customer paid by Stripe (link or terminal) and wants their money back without exchanging or returning items — kept-for-store-credit refund, restocking-fee adjustment, etc.
- The customer wants to swap payment methods (paid by card, switching to check). Refund the Stripe charge, then
+ Record Paymentwith the new method.
How to refund
- Open the invoice that has the original Stripe payment.
- Switch to the Payments tab.
- Find the row in the payments table. The Refund button appears next to the row on Stripe-paid charges (
stripe_linkorstripe_terminal). Cash, check, store-credit, and gift-card rows don’t have it — those undo via Remove or via a return invoice. - Click Refund.
- In the modal:
- Amount to refund defaults to the remaining refundable on the charge (original minus any prior refunds). Type a smaller number for a partial refund.
- If the row has already been partially refunded, an amber “Refundable now: $X.XX — prior refunds recorded on this charge” line appears under the original-payment label so you know the cap is lower than the original total.
- Reason picks from Stripe’s enum: Requested by customer, Duplicate, or Fraudulent.
- Click Refund. The Stripe API issues the refund; a negative-amount row appears in the payments table within a couple seconds.
What appears after a refund
- A new payments row with negative amount, stripe_refund method, red text. Linked to the original via the same Stripe charge ID.
- The invoice balance recalculates (Paid amount drops; Balance Due rises).
- The audit log captures
stripe_refund_recorded.
Partial refunds
You can refund less than the full amount as many times as you want, up to the original total. Each partial refund creates its own negative row. When the running net hits zero, the Refund button on the original row is replaced with a muted Fully refunded badge — no further refund is possible on that charge.
What the buttons do (and don’t do)
| Row type | Refund button | Remove button |
|---|---|---|
| Stripe charge (positive, refundable) | Yes — issues a real Stripe refund | No — Stripe rows can’t be locally deleted, only refunded |
| Stripe charge (fully refunded) | No — replaced with “Fully refunded” badge | No |
| Stripe refund (negative row) | No | No — refunds stay as audit history |
| Cash / check / store credit / gift card | No | Yes — these are pure book entries |
Once a Stripe charge is recorded in JewelTrak, you cannot silently delete it. The only correct way to undo it is Refund (which returns the money to the customer’s card and records the negative row). This keeps JewelTrak and Stripe in sync — every dollar that left the customer’s card has a JewelTrak row pointing at it.
Refunds initiated from the Stripe dashboard
If you issue a refund directly in Stripe (rather than from JewelTrak), Stripe sends a charge.refunded webhook to JewelTrak. The same negative-amount row appears in the payments table without any action on the JewelTrak side. Either path is fine; use whichever is faster for you.
Disputes (chargebacks)
If a customer disputes the charge with their bank, Stripe sends a charge.dispute.created event and JewelTrak surfaces a red dispute banner at the top of the affected invoice’s Payments tab. The banner includes a Submit evidence in Stripe → link that takes you straight to Stripe’s dashboard to upload supporting documentation. Evidence submission lives entirely in Stripe; JewelTrak just keeps the audit trail and shows the banner until the dispute is closed.
See also
- Returns and Exchanges — the customer-return / exchange flow (new invoice + Source = Previously Purchased + negative qty). Inventory comes back here, not via this Refund button.
- Charge a Card on the In-Store Reader — the Phase 2 in-person flow whose payments are refundable here
- Send a Stripe Payment Link — the Phase 1 customer-paid-online flow whose payments are also refundable here
- Applying Payments — the broader payments model