Pricing
Offer price, list price, minor units, and why a Pass carries no tax rate of its own
A Pass has one selling price, an optional reference price, and no tax rule. Everything else about money — the currency, the tax, the platform fee — belongs to the Organization and applies to every Event it runs.
That split is why you can copy a Pass between Events without re-deriving GST, and why changing a fee never edits a Pass.
Offer price
What the buyer pays
Per chargeable unit, before any coupon
List price
Optional strike-through
Shown as a saving; the buyer never pays it
Currency
The Organization's
A Pass cannot hold its own
Tax rate
Not on the Pass
It comes from the Organization tax profile
Stored as
Whole minor units
Paise for INR; never a decimal
Ceiling
₹1,000,000,000
100,000,000,000 paise per unit
Offer price and list price
The offer price is the real price: what one chargeable unit costs before any coupon. The list price is optional and purely a reference — the MRP you show struck through so the buyer sees a saving.
The gap between them is the OrganizerDiscount. It needs no code, applies to everyone, and is stored per line on the Order.
No list price means no strike-through and a zero discount. A list price equal to the offer price is discarded, and a list price below it is rejected.
OrganizerDiscount and CouponDiscount are always reported separately. One is a price you set; the other is a code a buyer redeemed, and they have different funding and tax consequences.
Chargeable units are not always entries
One unit is one thing you charge for, and the Pass's pricing basis decides how many units an entry has:
| Pricing basis | Units charged | Typical use |
|---|---|---|
| Per individual | One per Registration | A normal ticket |
| Per team | One per team, whatever the roster size | A flat team fee |
| Per member | One per person on the roster | A per-head team fee |
A five-person team priced per team is one unit. The same team priced per member is five units. Nothing else about the Order changes.
Money is stored in whole paise
Every amount is a whole number of minor units — paise for rupees — paired with a three-letter currency code. ₹1,500 is stored as 150000.
Computers cannot hold 0.1 exactly in decimal fractions, so storing rupees as decimals slowly loses paise when you add, split, and refund. Whole paise never drift, and a total always equals the sum of its parts.
The engine is exponent-aware, so a zero-decimal currency such as JPY and a three-decimal currency such as KWD both compute correctly. Rounding is half-up, always to the nearest whole minor unit.
The platform fee
Ulsav charges the Organization a platform fee: a percentage plus a fixed amount, set once per Organization. The default is 3.5% plus ₹10.00, borne by the buyer.
The percentage leg is charged per line on the line's price after discounts plus its organizer tax. The fixed leg is charged once per chargeable unit.
net is the offer price minus the coupon allocation. fee-bps is hundredths of a percent: 350 means 3.5%.
Discounts shrink the percentage leg and never the fixed leg. That is why the two legs are always shown apart on a receipt.
A worked single Pass
One Day Pass, offered at ₹1,500 with a ₹2,000 list price, sold to one person. The Organization is in Karnataka, the venue is in Karnataka, GST is 18%, and the fee is 3.5% plus ₹10 borne by the buyer.
List price × 1 unit
₹2,000.00
OrganizerDiscount
₹2,000.00 − ₹1,500.00
−₹500.00
Coupon
none redeemed
₹0.00
Taxable base
the offer price the tax applies to
₹1,500.00
CGST 9%
+₹135.00
SGST 9%
+₹135.00
Platform fee
3.5% of ₹1,770.00 = ₹61.95, plus ₹10.00
+₹71.95
GST on the platform fee
18% of ₹71.95
+₹12.95
Buyer pays
₹1,854.90
All values are whole paise. The percentage leg is charged on ₹1,770.00 — the ₹1,500.00 price plus its ₹270.00 GST — not on the price alone.
The buyer sees a ₹500.00 saving, pays ₹1,854.90, and the Order stores every row above separately. If GST were set to inclusive instead of exclusive, the ₹1,500.00 would already contain the ₹228.81 tax and the buyer total would fall accordingly.
Tax is never a Pass field
A Pass has no tax rate, no tax name, and no tax treatment. The Organization tax profile supplies all three for every Event, and the place of supply decides how the amount splits.
Two consequences matter in practice:
- A Pass on an online Event is always intra-state, because online participation is treated as supplied where the Organization is registered.
- A Pass on an in-person Event compares the Organization's state with the venue's state, and a mismatch produces IGST instead of CGST and SGST.
Price changes only apply forward
A confirmed Order keeps the price it was charged, forever. Editing a Pass price would not rewrite it, which is why the edit is refused outright once the Event is published.
A refund reads the stored order line, not today's Pass. Even if you later discount the same Pass to ₹0, a receipt from last month still shows ₹1,500.00 and the GST that went with it.
Failure paths
| What you tried | What happens |
|---|---|
| A negative price | Rejected |
| A price above 100,000,000,000 paise | Rejected |
| A currency other than the Organization's | Rejected |
| A list price below the offer price | Rejected |
| Changing the price after publishing | Rejected as a commercial change |
| A coupon that brings a paid Order to ₹0 | Rejected at checkout; pay a smaller discount instead |
Related
- Passes — the rest of the Pass configuration
- Coupons — the code-driven discount
- Orders — where the price is frozen
- Pricing and tax reference — the normative arithmetic