Ulsav Docs
Orders

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:

LayerWhat it answers
IdentityWho bought, from which Event, in which currency, with which reference
LinesWhich Pass, how many places, at what price, with which discounts
MoneyThe tax components, the platform fee, and the exact total
EvidenceThe 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

Pass prices at listminus OrganizerDiscountminus CouponDiscountplus organizer tax: CGSTand SGST, or IGSTplus the Ulsav platform feeplus tax on the Ulsav feeGrand total
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.

Order ORD-000123 — two lines, one coupon, GST 18% intra-state
grand total=list subtotal−organizer discount−coupon+tax+fee+tax on fee\text{grand total} = \text{list subtotal} - \text{organizer discount} - \text{coupon} + \text{tax} + \text{fee} + \text{tax on fee}

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:

LineListDiscountCouponBaseTaxFeeFee taxLine 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.

StateWhat it meansMoney
Payment pendingCheckout is open and seats are heldNothing captured
ConfirmedThe provider confirmed the chargeCaptured, and the sale is real
CancelledThe Event was cancelled, or checkout could not startNothing owed
ExpiredThe 15-minute payment window closed unpaidNothing 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.

On this page