Set the refund policy per event — full refund up to N days before, partial % up to M days before, none after. The confirmation email carries a "Manage booking" link. Attendees see their eligible amount computed live, submit a request, done. Admin approves in the refunds queue. Zero support inbox, zero back-and-forth.
One JSON blob per event. Defaults are 7 / 1 / 50, override per event.
full_refund_dayspartial_refund_dayspartial_percentAny paid event that sells more than 200 tickets will get a refund cluster in the final week. Attendee falls sick, work meeting shifts, kid has a school event, mother-in-law flies in. On our biggest ticket volume client, the pattern was clear: 40 refund WhatsApps between Thursday and Sunday for a Monday event. Each one required checking the payment, computing the refund amount against a policy that lived in someone's head, initiating the refund on Razorpay dashboard, replying with confirmation. 40 conversations × ~10 minutes each = the ops person's entire Friday.
Half those conversations were also arguments: "your policy said 50%, why am I only getting 40%?" — because someone had computed with the wrong days-to-event. The audit trail was a WhatsApp thread. Chargebacks followed.
So we made the policy a JSON blob on the event. The days-to-event computation happens server-side. The attendee sees the eligible amount before they even click submit — no argument possible. The refund lands in the refunds queue with a full audit trail. Admin approves in one click. Razorpay refund API fires. Attendee gets an email confirmation.
The ops person got their Friday back. Chargebacks went to zero because attendees stopped feeling ambushed by the number.