Ulsav Docs

Pricing and Tax

Minor units, platform fee, tax profile, list versus offer price, and the snapshot rules that keep history exact

Every amount is an integer in minor units with an ISO 4217 currency, exponent-aware, with exact equality and no floating point. Zero- and three-decimal currencies both compute correctly.

  • Unit

    Integer minor units

    Paise, cents, yen; never a float

  • Currencies per Order

    Exactly one

    Ulsav never performs FX

  • Currency lock

    First paid Order

    Mutable before it, immutable after

Currency is an Organization fact

An Organization has one preferred currency, INR by default. Every Pass is created in that currency, so every paid Order is denominated in it. One Order has exactly one currency, and Ulsav never performs FX.

Free checkout and complimentary issuance do not read the preferred currency: both write the Order currency as INR today.

The preferred currency is mutable until the Organization's first confirmed paid Order and immutable afterwards. A currency is usable only when enabled globally and supported by the active merchant account; that routing is checked when a payment intent is created.

The totals identity

Grand total
grand_total= pass_subtotal−organizer_discount−coupon_discount+organizer_tax+ulsav_platform_fee+tax_on_ulsav_fee\begin{aligned}\text{grand\_total} =\ & \text{pass\_subtotal} - \text{organizer\_discount} - \text{coupon\_discount} \\ & + \text{organizer\_tax} + \text{ulsav\_platform\_fee} + \text{tax\_on\_ulsav\_fee}\end{aligned}

Every component allocation sums exactly. There is no tolerance band.

Each term is itself a sum over the Order's lines:

Per-line terms
pass_subtotal=∑ilisti×unitsiorganizer_discount=∑i(listi−offeri)×unitsicoupon_discount=∑iallocationi\begin{aligned}\text{pass\_subtotal} &= \sum_i \text{list}_i \times \text{units}_i \\ \text{organizer\_discount} &= \sum_i (\text{list}_i - \text{offer}_i) \times \text{units}_i \\ \text{coupon\_discount} &= \sum_i \text{allocation}_i\end{aligned}

Component allocations sum exactly, with no tolerance band.

List price and offer price

A Pass has an offer price: what the buyer pays per chargeable unit. It may also have a list price (MRP) shown struck through, and the gap is the OrganizerDiscount, computed per line and snapshotted.

It is unconditional, needs no code, and is never collapsed with a coupon: one is a price, the other is a redemption. The list price must be at least the offer price; setting it equal clears it.

Coupons

A coupon is the code-driven, organizer-funded discount, and exactly one applies per Order. Its terms live in an immutable rule version, so editing a coupon publishes a new version and existing redemptions keep the version they redeemed under.

Redemption scope (which Events and Passes a code may be used on) is separate from application (which lines it discounts). Effects are a percentage, a fixed amount, or a fixed price, optionally capped.

Caps — global redemptions, per-buyer uses, discount budget, first-purchase-only — are evaluated when a payment intent is created. A pending redemption row is written with the pending Order, holding the counters until confirmation or release. The cap reads are not serialized by a row lock, so concurrent intents can exceed a cap between the read and the insert.

A coupon applies to the offer price, never to the MRP.

Platform fee

The platform fee is per-Organization configuration: a basis-point rate plus a fixed minor-unit amount, with a bearer.

Platform fee, per line
line fee=round⁡(fee_bps10000×line_base)+fee_fixed×pricing_units\text{line fee} = \operatorname{round}\left(\frac{\text{fee\_bps}}{10000} \times \text{line\_base}\right) + \text{fee\_fixed} \times \text{pricing\_units}

line_base is the line's net selling base after organizer and coupon discounts, plus the organizer tax on it; pricing_units is one per team line, or headcount for per-member pricing.

Two consequences follow. Organizer-funded discounts reduce the proportional leg and the fee tax, never the fixed leg. The bearer is Organization-level and applied per Order as snapshotted:

  • buyer — the fee and its tax are added on top of the buyer total.
  • organizer — they are deducted from the payout.

Neither is ever transferred to the organizer.

Payment processing cost is Ulsav's own cost and never part of a buyer total.

A worked Order

One Pass at a ₹1,200 list price sold for ₹1,000, a 10% coupon, GST at 18% intra-state (CGST 9% + SGST 9%), and a platform fee of 2% plus ₹10 with the fee borne by the buyer. Tax is charged on the discounted base, never on the MRP.

One Pass: ₹1,200 list, ₹1,000 offer, 10% coupon, GST 18% intra-state
grand_total=subtotal−organizer_discount−coupon+tax+fee+tax on fee\text{grand\_total} = \text{subtotal} - \text{organizer\_discount} - \text{coupon} + \text{tax} + \text{fee} + \text{tax on fee}

List price × 1 unit

₹1,200.00

OrganizerDiscount

list price minus offer price

−₹200.00

Coupon, 10% of the offer price

−₹100.00

Taxable base

after discounts, before tax

₹900.00

CGST 9%

+₹81.00

SGST 9%

+₹81.00

Platform fee

2% of the ₹1,062 base + ₹10 fixed

+₹31.24

GST on the platform fee, 18%

+₹5.62

Buyer pays

₹1,098.86

Every value is an integer number of paise. The fee's proportional leg and its tax fall with the discount; the fixed leg does not.

With the fee borne by the organizer instead, the ₹31.24 and its ₹5.62 are deducted from the payout and the buyer total becomes ₹1,062.00 — the same components, a different bearer.

Tax

Tax comes from the Organization commercial profile — country, state, city, tax identifier, rate, and inclusive/exclusive flag. The rate and inclusive flag are Organization-wide; no Event overrides them and no Pass carries a rate.

The Event's venue state selects the place-of-supply split. Admission tax never uses the buyer's location:

CaseRule
In-person or hybridCompare the Organization's state with the Event venue's state
Same stateIntra-state: CGST + SGST, or CGST + UTGST for a Union Territory without a legislature
Different stateInter-state: IGST
Online participationAlways intra-state at the Organization's state

Ulsav's own fee is taxed separately: 18% GST under Ulsav's registration for Indian Organizations, export-zero for foreign Organizations. Non-Indian supply uses a generic engine with the Organization's rate; the component is labelled Tax and the identifier comes from the Organization.

Buyer billing details are collected for the invoice record and never gate checkout.

Snapshots

Every Order and every line snapshots the facts its money columns were computed from.

Snapshotted on the OrderSnapshotted on each line
Fee rate, fixed amount, bearer, tax regime, rule version, inclusive flag, jurisdiction, platform-fee tax componentsThat line's organizer-supply components

Money columns stay authoritative and equal the sum of their components, so a CGST/SGST split, a single VAT, and several local taxes share one shape.

The rate in force when payment intent is created is the rate charged, confirmation never re-prices, and later changes apply to future Orders only.

Every paid Order with a platform fee produces two tax invoices — one from the Organization for admission, one from Ulsav for the platform fee — in their own legal names, tax identifiers, place of supply, and numbering. Refunds issue per-seller credit notes. A receipt renders the same snapshot components and identifies the Order; invoice numbers live on the separate invoice records.

Explicitly unresolved

Place of supply for a hybrid Event's online-attending Registrations follows the hybrid rule today, because the Event has one participation mode and the tax engine reads that mode. Splitting it per attendance mode is an accounting question awaiting sign-off.

Union Territory classification and export treatment are implemented as described above, not left open.

Questions

Can I change the Organization currency later?

Only until the first confirmed paid Order. After that the currency is immutable, because every historical Order, invoice, and credit note is denominated in it.

Is GST charged on the MRP or on what the buyer pays?

On the taxable base after the OrganizerDiscount and any coupon — the same base the proportional platform fee uses. The MRP is presentation, not a tax base.

Does a coupon reduce the fixed part of the platform fee?

No. Discounts shrink the proportional leg and the fee tax; the fixed leg is charged per pricing unit regardless of price paid.

What happens if I change my tax profile after selling?

Confirmed Orders keep the profile they were confirmed under. A new rate applies to future Orders only; confirmation never re-prices an Order.

On this page