- You are signed in to the CMS with an organisation selected.
- Your membership role for that organisation is lodge-admin or treasurer.
- The organisation has Stripe Connect set up.
- The order has already been charged — authorised-only orders cannot be refunded here.
- The order belongs to the organisation you are currently working in.
Step by step
- Open 'Give money back' from the top menu
In the office header, open the 'Set up / Manage' menu (not the 'Do it now' menu). Under the Finance group you will find 'Give money back'. Click it to open the refund page.
- Wait while the server checks your role
Before drawing any form, the page confirms your organisation is selected and that your membership carries lodge-admin or treasurer. If no organisation is selected you will see a prompt to choose one. If your role is not sufficient the page explains why and names the organisation instead of showing the form.
- Enter the order number and click 'Find it'
Type the order reference exactly as it appears — for example, ORD-1-20261005-00047 — into the Order number field, then click 'Find it'. The button stays disabled until there is something in the field. The server re-checks your role, looks up the order for your organisation, and loads up to 200 line items.
- Read the order card before acting
The card shows the order reference, the customer's name, and a summary line: how much was taken, how much has already been given back, and how much is still refundable. If the full order has already been refunded the card says so and no refund controls are shown. Otherwise the line items and refund buttons appear.
- Optionally type a reason, then press a refund button
The 'Why' field is optional but the reason is saved on the order and is useful for your records. To refund one line, click 'Give this line back' next to it. To refund everything remaining in one go, click 'Give back the rest (£N)' at the foot of the form. Buttons disable while the request is in progress and the whole-order button shows 'Sending…'.
- Let the server action validate your request
The server action reads your session and organisation from the cookie, extracts the order id, which line (if any), and your reason, then passes everything to the refund service. A whole-order submission is treated as refunding the full remaining balance; a line submission targets that specific item.
- The service enforces rules and works out the amount
The service checks your role again independently of the UI. It confirms the order belongs to your organisation, that it was charged (not just authorised), and that money remains to be returned. For a line refund it checks the line belongs to the order and its value does not exceed what is left. If any check fails, nothing is sent to Stripe.
- A replay guard prevents double refunds
Before calling Stripe the service checks whether this exact scope — the whole order or this specific line — already appears in the order's refund history. If it does, the original outcome is returned silently with a replay flag and nothing is sent to Stripe a second time.
- The refund is sent to Stripe
The service resolves the Stripe account connected to this order and calls Stripe with the payment intent, the scope, and the calculated amount. If Stripe rejects the call, the error is recorded on the order but no refund row is written, so you can try again. Nothing is recorded until Stripe confirms success.
- The order record is updated
On a successful Stripe response the service appends a refund row to the order — scope, amount, Stripe refund ID, timestamp, who actioned it, and your optional reason. The order's running refunded total is increased by Stripe's confirmed figure. If that total now equals the full amount received, the order status moves to 'refunded' and a closed date is set.
- Read the confirmation and optionally look again
The form shows a plain-English confirmation with the amount given back and, if money remains, how much is still refundable. A 'Look again' button re-fetches the order so the figures on screen reflect the latest state.
What happens next
Stripe issues the refund for the amount you chose — either the full remaining balance or one order line's exact value. The order record gains a new entry in its refund history showing the scope, the amount Stripe confirmed, the Stripe refund ID, the time, and who actioned it. Your optional reason is stored alongside it.
The order's refunded total is updated immediately. If the cumulative amount returned now matches everything that was originally received, the order status changes to 'refunded' and a closed date is recorded automatically. The confirmation on screen tells you the amount given back and, if a balance remains, how much is still refundable.
Good to know
Only orders that have been fully charged can be refunded here. Orders that were authorised but never captured are refused at the service level, not just in the UI. If Stripe rejects a refund call the error is noted on the order but the refundable balance is unchanged, so you can attempt the refund again without risk of a duplicate.
The replay guard means clicking a refund button twice, or resubmitting the form, will not charge the customer twice. The service compares the scope of the requested refund against what is already recorded and returns the earlier result if it finds a match.
Daviah — Step-by-step guide for lodge admins and treasurers to issue a full or partial refund against a charged online order through Stripe.