> ## Documentation Index
> Fetch the complete documentation index at: https://docs.laces.run/llms.txt
> Use this file to discover all available pages before exploring further.

# Fees and totals

> The participant pays the ticket price plus the Laces fee. Show the fees Laces returns, and treat the order total as the amount due.

## Who pays what

**The participant bears all fees.** The organizer's ticket price is never
reduced by fees. A participant pays:

```text theme={null}
total = ticket price + Laces fee
```

The Laces fee depends on the **payment method**. MTN Mobile Money (`momo`)
and Airtel Money (`airtel`) each have their own fee schedule. Card (`card`) is
coming soon and will have its own schedule too.

## Where the numbers come from

[`GET /events/{eventId}`](/api-reference/v1/events/get) returns, for
every ticket type, the figures for **one ticket bought on its own**:

```json theme={null}
{
  "ticket_type_id": "tt_10k",
  "currency": "UGX",
  "price_minor": 50000,
  "laces_fee_minor": 2400,
  "total_minor": 52400,
  "card":   null,
  "airtel": { "laces_fee_minor": 2400, "total_minor": 52400 },
  "is_free": false
}
```

| Field | Meaning |
| - | - |
| `price_minor` | The organizer's price |
| `laces_fee_minor`, `total_minor` | The fee and total by MTN mobile money (`momo`), the default method |
| `airtel` | The same two figures for Airtel Money. `null` if it could not be priced. |
| `card` | `null` while card isn't available to partners (today). Once it is, the same two figures for card, and `card` appears in the event's `payment_methods`. |
| `is_free` | The price is 0. A free order needs no payment and no phone number. |

(Figures here are illustrative, not Laces's real rates.)

<Warning>
  **Never calculate fees yourself.** Fees are computed on the Laces server from
  the live fee configuration and your organization's rates, which can change.
  Display the numbers returned. If `laces_fee_minor` or `total_minor` is
  `null`, the ticket could not be priced: show it as unavailable rather than
  substituting your own figure.
</Warning>

## The order total is authoritative

Part of the Laces fee is a flat amount charged **per order**, not per ticket.
So a cart of three tickets usually costs **less** than `3 × total_minor`.

When you [create an order](/api-reference/v1/orders/create) you choose the
`payment_method`, and the response's `order.total` is the real amount for that
cart and that method. **Show `order.total` as the amount due**, and treat the
event quotes as a display aid for the ticket picker.

```json theme={null}
"order": {
  "currency": "UGX",
  "subtotal": 50000,
  "discount_total": 0,
  "donation_total": 0,
  "laces_fee": 2400,
  "total": 52400
}
```

The payment method is fixed when the order is created. An Airtel order is
priced on the Airtel schedule, so if the buyer switches method, create a new
order. Only use methods listed in the event's `payment_methods`: `card` is
refused with `409 payment_method_unavailable` until it is available. Paying a `momo` order with an
Airtel number (or an `airtel` order with an MTN number) is refused with
`409 reprice_required` for the same reason: pick `payment_method` from the
buyer's network before you create the order.

## Money format

* All amounts are **integers in minor units**. Never floats.
* Always read `currency` from the event or order. UGX has no minor unit, so
  `52400` UGX is fifty-two thousand four hundred shillings.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.