Getting started
How Laces works, end to end
A walkthrough of the whole platform on one real race, from creating an account and publishing an event to a runner registering and getting their ticket.
Last updated 23 August 2026 · Laces · 12 min read

Keep a copy of this document
A formatted PDF with a cover page, page numbers and the date you retrieved it.
This is the whole platform in one pass, followed end to end on a real race: Kampala 7Hills Dry-Run, run by Laces Marathon. Every screenshot below is that race, and the entry that appears in the organizer’s dashboard at the end is the one bought a few sections earlier.
It is written to be read by someone deciding whether to put their event on Laces. If you are already set up and want the depth on one topic, read Getting your event live or Taking payments and getting paid instead.
Two things worth knowing before the detail:
- The organizer works in the Admin App, on a phone. There is no laptop version to miss out on.
- The runner never installs anything. They open a link, type their details, approve a mobile-money prompt, and get a ticket.
Part one: the organizer
1. Create an account
Sign up with email and password, Google, or Apple. On Android the Apple button hides itself, so you will see Google and email.
The form asks for your name, email and password, and that is genuinely all. You are not asked for the event yet, or the organization, or anything about money.
2. Open an organization
First sign-in with no organization puts you on a Get started screen with exactly two doors: create an organization, or join one with an invite code from someone who already has it.
Creating one asks for two things:
- A name. What runners will see: “Laces Marathon”.
- A web address. The short name at the end of your link:
laces-marathon.
That address becomes your page at laces.run/laces-marathon and the first half
of every race link you will ever share.

Some rules that are easier to know now than to discover later:
| Rule | What it means |
|---|---|
| 3–30 characters | Lower case, numbers and hyphens. No spaces, no leading or trailing hyphen |
| Globally unique | First organization to take a name keeps it |
| Changeable, slowly | Once every 7 days, and old links keep redirecting |
| Never released | A name you retire is not handed to somebody else |
One account creates one organization. If you run events under two genuinely separate brands, that is two accounts today.
3. Get cleared for payments
This is the step people skip, and it is the one that stops a race selling.
A new organization is not cleared to take money. Laces has to enable it, and until it does, your race page renders in full (distances, prices, route, FAQ, the lot) and the Register button does not work.
You apply from the Earnings tab in the Admin App. Do it early. The race page is worth nothing to you while the pay path is closed, and clearance is a person at Laces making a decision, not a switch you can flip yourself.
Two details that matter:
- Only an owner or admin can apply. Finance sees an explanation instead.
- A rejection is private. It is never published to your race page or shown to a runner.
4. Create the event
A race needs five things before it exists: which organization it belongs to, a name, a web address, a start and an end.
Everything else (description, cover image, venue, terms, waiver, refund policy) is optional and can follow later.
Then you add distances. Each one needs a name and a price, and nothing else is required:
- A price of 0 is valid. Free entry is a supported thing, not a workaround.
- Capacity is optional. Leave it empty and the distance is uncapped. Kampala 7Hills is uncapped, which is why its page shows no “places left” counter.
- A distance does not need a distance. A flat-fee entry with no kilometres attached is fine.
The race web address cannot be changed after creation. The organization’s can, weekly; the race’s cannot. Worth ten seconds of thought.
A race goes live once it has at least one distance to sell. Try to open one with nothing on it and Laces refuses, “This event has nothing to sell yet”, which is the one thing standing between you and a public page with no way in.
5. Share the link
Every race gets two addresses the moment it is created:
laces.run/laces-marathon/kampala-7hills-run the full link
laces.run/e/46k6xK the short link
Both open the same page. The short one is six characters, minted once and never reassigned, and it is what belongs on a poster.
The Admin App’s event Overview tab shows the link on a card. Tap the card to copy it; the share icon beside it opens WhatsApp, SMS, email and the rest.
The race page itself also carries a QR code and both links as selectable text, so anyone can scan or copy from the page without you sending anything.

One caution on the short code: it is case-sensitive. 46k6xK and 46K6XK
are different codes, and it can contain characters that look alike in some
fonts. Send it as a link. Do not read it down a phone.
Part two: the runner
Everything from here is what somebody sees after you send the link. No account, no app, no card.
6. The race page
The page leads with the race and puts registration beside it: visible without scrolling, on a 360px phone as much as a laptop.

The form asks for a name, a phone number, an email twice, and a distance. Next of kin is optional.
The email is asked for twice deliberately. It is where the ticket and receipt go, and a mistyped address means no ticket, no receipt, and nothing that tells anyone it bounced. The second field costs the runner three seconds and removes the most common way an entry goes quietly wrong.
Validation stays quiet until a field has been visited once, then corrects live. Ugandan numbers are checked against real MTN and Airtel prefixes.

The subtotal sits above the button and says “Fees calculated at checkout.” That is honest rather than coy: the fee is computed by the server on the next screen, and the page will not guess at a number it does not own.

7. Checkout
Submitting holds a place for 15 minutes and moves to the payment page.

Every number is itemised before anyone is asked to pay:
| Line | This order |
|---|---|
| Subtotal | UGX 500 |
| Laces service fee | UGX 515 |
| Total | UGX 1,015 |
The fee is UGX 500 plus 2.9% of the entry, and the runner pays it. You receive the full ticket price: the UGX 500 here, not a penny less.
The proportions above are misleading because this is a dry run priced at UGX 500, so a flat UGX 500 more than doubles it. On a realistic entry the fee is a small fraction: a UGX 50,000 entry carries a UGX 1,950 fee, so the runner pays UGX 51,950 and you receive UGX 50,000.
Free entries are free. A zero-priced distance carries no fee at all, not even the flat portion.
Payment is mobile money: MTN MoMo and Airtel Money. The runner types their number and the network is detected from the prefix.

Then a prompt arrives on the handset and they enter their Mobile Money PIN. Nothing leaves their account until they do.

While it settles, Laces watches for the result three ways at once: polling, a live subscription, and a re-check when the runner returns to the tab. Whichever answers first wins, so the page updates the moment the money lands rather than on a fixed timer.
If the prompt is never approved, the page says timed out, not failed. That distinction is deliberate: the charge may still land, so the screen offers to check again rather than to pay again. Paying again is how somebody gets debited twice.
8. The ticket

The runner gets an order code, 3VT4 GZ9H, and a QR, immediately.
The code is eight characters drawn from an alphabet with no O or 0, and no I, 1 or L, because it gets read aloud on support calls and typed at a kit tent in the dark.
Their entry lives at laces.run/o/3VT4GZ9H and works without an account:

Each runner gets their own QR, and it is signed. It verifies offline, which is the point: kit collection happens in a marquee with no signal, and a scanner with no bars still has to work.
The same page carries the receipt and what to bring:

The kit tent can also find an entry from the order code alone if a scanner will not read a cracked screen.
9. The emails
Two emails go out on a successful entry, and they are sent separately rather than as one message with a copy.
The runner receives “You’re in: Kampala 7Hills Dry-Run (3VT4GZ9H)”, with a PDF attached. The PDF holds one page per runner on the order, each with its own QR, ready to print or show.
The organizer receives “New entry, Kampala 7Hills Dry-Run (3VT4GZ9H)”. It goes to the owner, copied to admins, event managers, finance and station leads. Volunteers are deliberately left off, because the notice states revenue.
That separation is not tidiness. The two were once a single message, and one bad address on the copy list bounced the whole thing, costing a runner the confirmation they had paid for. They have been separate envelopes ever since.
If the runner’s own email fails, the organizer’s subject changes to “Entry not delivered”, so you find out from your inbox rather than from the runner at registration.
Part three: the organizer sees it land
Nothing here needs a refresh. The Admin App streams from the same database the checkout writes to, so a paid entry appears while the runner is still looking at their order code.
The two entries below are the ones bought earlier in this guide: both on the Dry run distance, UGX 1,520 each.
On the race
A race opens on four tabs, and each answers a different question.
Overview is the glance: what you have earned, how many kits have gone out,
and the shape of registrations and orders over time. The LIVE badge at the top
is the race’s status, and the short link sits further down the same screen.

The +2 today on the orders chart is the two entries bought earlier in this guide.
Orders is the money view: one row per order, what was paid, and where it got to.

Both entries from this guide are here, NWT357BJ today and 3VT4GZ9H
yesterday, UGX 1,520 each, both PAID.
The amber banner at the top is worth more than it looks. Not every runner finishes paying: a prompt times out, a wallet is short, someone puts their phone down. Laces keeps those orders instead of discarding them, totals what they are worth, and gives you a Nudge button to chase them, and a Send pay link on the individual row. An expired order is a runner who wanted in, not a lost cause, and the money is usually still recoverable.
Runners is the people view: who is coming, on which distance, and whether they have collected their kit. This is the list the kit tent works from, and it is searchable by name, phone, bib or order code.

The two tabs are deliberately separate. One order can carry several runners, a group signing up together pays once, so an order count is not an entry count. Orders answers “what was paid”; Runners answers “who is coming”.
The money
Earnings is the organization-wide view, filterable to a single race.

Four things worth understanding about these figures:
- You see the entry price, not the total charged. Look at the transaction rows: each reads +500, not +1,520. The runner paid UGX 1,520; UGX 500 of that is yours and the rest is the platform fee, which never touches your ledger. The fee is not deducted from you; it was added on top for the buyer.
- Entries are available as soon as they are confirmed. A mobile-money payment taken through Eversend is not held: it lands in Available and you can withdraw it immediately, weekends included. A Pending figure means a payment is still being confirmed, or was taken on the older Flutterwave rail, which holds it for about a day. The two figures are shown separately so you always know which is which.
- The rows marked “Test payment” are not counted. The two entries from this guide were made in test mode, and test money never reaches a balance or a statement: it is listed in the history so it is visible, and excluded from every total. The UGX 5,700 above is real money from earlier activity, not these two orders.
- Withdrawing needs payment clearance: the same approval from step 3, and the first withdrawal per organization is free.
Your first withdrawal is free, once per organization, and Laces absorbs it.
What this costs
| Who | Pays |
|---|---|
| Organizer | Nothing. No setup fee, no monthly fee, no per-race fee |
| Runner | UGX 500 + 2.9% at checkout, shown before they pay |
You receive the full ticket price. The fee is charged to the buyer, on top, and itemised on screen before anyone commits.
Cash at the desk costs nothing. Record a walk-up in the Admin App and they land on the same manifest as everyone else. No money went through the platform, so Laces charges nothing on it.
The honest limits
Things worth knowing before you commit, rather than after:
- Payment clearance gates selling, not just withdrawing. Until Laces enables your organization, the page shows everything and sells nothing. Apply early.
- A race’s web address is permanent. The organization’s can change weekly.
- SMS is not live. The ticket travels by email and the entry page. This is why the form asks for the email twice.
- The short code is case-sensitive. Share it as a link, not as characters read aloud.
- The kit shop is not finished. Distances and entries work; selling t-shirts alongside them does not yet.
The whole thing, in one list
- Sign up with email, Google or Apple
- Create an organization and claim your web address
- Apply for payment clearance from the Earnings tab
- Create the race: name, address, start, end
- Add distances with prices
- Share the link or the QR
- A runner opens it, enters their details, pays with mobile money
- They get an order code, a QR and an emailed ticket
- You get an email, and the entry appears in your dashboard
Questions this did not answer go to support@laces.run.