Orders
What an Order records, how its total is built, and which parts of it never change
An Order is one checkout, frozen. It belongs to one Event, one buyer Account, and one currency, and it holds every number that a receipt, an invoice, a refund, or a settlement will ever need.
If you have ever had to explain a six-month-old purchase, the Order is the thing that still has the answer.
Scope
One Event, one buyer
An Order never spans Events
Currency
One, the Organization's
No conversion, ever
Reference
ORD-000123
Sequential per Organization
Contents
One line per entry
Plus the whole money breakdown
After confirming
Frozen
Corrections are new records, not edits
Who sees it
The buyer and your team
Gated on the orders.read capability
What an Order holds
An Order carries four kinds of information, and it keeps them apart on purpose:
| Layer | What it answers |
|---|---|
| Identity | Who bought, from which Event, in which currency, with which reference |
| Lines | Which Pass, how many places, at what price, with which discounts |
| Money | The tax components, the platform fee, and the exact total |
| Evidence | The terms accepted, the billing details, and the marketing source |
Buyer details are copied from the Account at purchase time and never re-read. Renaming an Account later does not rewrite an old receipt, which is what makes a receipt trustworthy.
Lines are entries
Each line is one Registration. Buying three Day Passes produces three lines of quantity one, each pointing at its own entry, because each entry can be cancelled, refunded, and checked in on its own.
A team line is the exception: one line covers the whole roster, and it stores how many people the roster holds. That count is what per-member pricing multiplies by.
Lines keep their display order, so a refund and an invoice both show the basket the buyer built rather than whatever order the database felt like returning.
The total, step by step
Diagram source
flowchart TD
A[Pass prices at list] --> B[minus OrganizerDiscount]
B --> C[minus CouponDiscount]
C --> D[plus organizer tax: CGST and SGST, or IGST]
D --> E[plus the Ulsav platform fee]
E --> F[plus tax on the Ulsav fee]
F --> G[Grand total]Every step is a whole number of paise, and every step is stored separately. Nothing is recomputed at display time, so a rate change next month cannot alter this Order's numbers.
Here is a real Order from the same Event: a Day Pass at ₹1,500 with a ₹2,000 list price, a Workshop Add-on at ₹2,000, one place each, a 10% coupon, GST at 18% intra-state, and a 3.5% plus ₹10 fee borne by the buyer.
Pass subtotal at list price
₹2,000.00 + ₹2,000.00
₹4,000.00
OrganizerDiscount
Day Pass list ₹2,000.00 less offer ₹1,500.00
−₹500.00
CouponDiscount
10% of ₹3,500.00 across both lines
−₹350.00
Taxable base
₹1,350.00 + ₹1,800.00
₹3,150.00
CGST 9%
₹121.50 + ₹162.00
+₹283.50
SGST 9%
₹121.50 + ₹162.00
+₹283.50
Platform fee
₹55.76 + ₹10.00 + ₹74.34 + ₹10.00
+₹150.10
GST on the platform fee
18% of ₹150.10
+₹27.02
Buyer pays
₹3,894.12
The platform fee's percentage leg is charged on each line's price after discount plus its GST: 3.5% of ₹1,593.00 and of ₹2,124.00, plus ₹10.00 per line.
The same numbers per line, which is what the Order's detail page and the receipt show:
| Line | List | Discount | Coupon | Base | Tax | Fee | Fee tax | Line total |
|---|---|---|---|---|---|---|---|---|
| Day Pass | ₹2,000.00 | −₹500.00 | −₹150.00 | ₹1,350.00 | ₹243.00 | ₹65.76 | ₹11.84 | ₹1,670.60 |
| Workshop | ₹2,000.00 | ₹0.00 | −₹200.00 | ₹1,800.00 | ₹324.00 | ₹84.34 | ₹15.18 | ₹2,223.52 |
Two lines, ₹3,894.12. Every refund and every invoice is derived from these cells, not recalculated.
States
An Order moves through a small set of states, and only one of them means money moved.
| State | What it means | Money |
|---|---|---|
| Payment pending | Checkout is open and seats are held | Nothing captured |
| Confirmed | The provider confirmed the charge | Captured, and the sale is real |
| Cancelled | The Event was cancelled, or checkout could not start | Nothing owed |
| Expired | The 15-minute payment window closed unpaid | Nothing owed |
Draft exists in the database schema but is never produced; every Order starts either confirmed (a free checkout) or payment pending (a paid one).
Cancelling or expiring an Order keeps its lines, prices, and totals. The record of what someone almost bought is still a record.
Free Orders
A free checkout has nothing to pay, so it skips payment entirely: the Order is created already confirmed, capacity is consumed in the same transaction, and no provider order is ever opened.
A free Order has a grand total of zero, no payment reference, and no invoices. It still has a number, a buyer, lines, and accepted terms.
What never changes
Once an Order is confirmed, these are fixed forever:
- the buyer name, email, phone, and billing details
- the lines, their order, and their quantities
- every price, discount, tax component, and fee
- the terms versions the buyer accepted
- the currency
Corrections are new records: a refund, a credit note, or a fresh Order. Nothing edits the original.
Where you work with Orders
The Orders list filters by Event, EventGroup, status, date range, and free text across buyer, Event, coupon code, and Order id. It exports to a spreadsheet with the same columns and the same filters.
Opening an Order gives you six tabs: overview, payment, invoices, refunds, notifications, and timeline. That is deliberately one place per question, rather than one long page.