The Villagers — User manual

Sports management & prediction platform · Version 1.0

1. Getting started

The system has two halves. The public site needs no sign-in: fixtures, results, the league table, teams, players, photos, news and the prediction page. The back office is where the work is done and needs an account.

Signing in

  1. Go to /login.
  2. Enter your phone number the way you would write it on paper — 0791525931, no country code — and your password.
  3. If you have no password, choose a one-time code. A 6-digit code is sent by SMS. It lasts 10 minutes and can be used once.

Demonstration accounts

These are created by the seed data so each role can be tried out. Type the number exactly as shown. The password for every one of them is password.

Phone (type this)PasswordNameRole
0700000001passwordBrianSuper Admin
0700000002passwordDr. Harriet MalaikaSuper Admin
0700000003passwordMichael WandebaTournament Admin
0700000004passwordFinance OfficerFinance Officer
0700000005passwordMatch OfficialMatch Official
0700000006passwordTeam ManagerTeam Manager
0700000007passwordContent EditorContent Editor
0791525931passwordSample PunterPunter
These accounts must not exist in production They are demonstration logins with a password anyone can guess. The seeder refuses to create them when the system is running in production, and real accounts are made through the back office instead. If you recognise any of these numbers on a live system, tell the developer.
Numbers are stored in full You type 0700000001; the system stores +256700000001. It accepts the number in any of the four forms people write it — 0700000001, 700000001, 256700000001 or +256700000001 — and converts it before looking anything up, so it does not matter which you use.
Five wrong passwords locks the account After five failed attempts within fifteen minutes the account locks and even the right password is refused. Ask a Super Admin to unlock it.

Finding your way

After signing in you land on the Dashboard. It shows only the tiles your role is allowed to act on, and each tile is a link to the screen that clears it. The menu down the left side works the same way — if you cannot see a section, your role does not have it.

2. Who can do what

RoleCan doCannot do
Super Admin Everything, including amending a confirmed result, managing users and changing settings. Edit or delete the audit log. Nobody can.
Tournament Admin Teams, players, squad approvals, tournament structure, fixtures, results and confirmation, prediction events. Approve payouts. Change system settings.
Finance Officer Match payments to slips, approve and release payouts, run financial reports. Confirm results — and cannot approve a payout on a slip whose result they confirmed.
Match Official Enter the result and match events for fixtures they are assigned to. Confirm their own result. An admin does that.
Team Manager Submit and edit their own team's squad. Approve their own squad, or touch another team's.
Content Editor Albums, photos, news posts, static pages. Anything to do with fixtures, results or money.
Punter Submit predictions, check their slips, set their own stake limits, self-exclude. See any part of the back office.
Why a Finance Officer cannot confirm results The person who decides a match score must not also be the person who releases the money that score pays out. The system enforces this — it will refuse the approval and tell you to ask another officer.

3. Teams

Tournament Admin Super Admin

Adding one team

Go to Teams. A team needs a name and a district; everything else — crest, colours, home ground, chairman and coach contacts — can be filled in later.

Importing many teams at once

  1. Prepare a spreadsheet and save it as CSV. The first row must be the column names.
  2. Required column: name. Optional: short_name, abbreviation, district, sub_county, village, home_ground, founded_year, chairman_name, chairman_phone, coach_name, coach_phone.
  3. On Teams, choose the file, optionally give the Season ID to register them all at once, and press Import.

A sample file is in the project at database/samples/teams-sample.csv.

A bad row does not lose the file If row 40 has a problem, rows 1–39 and 41–96 still import. The screen lists exactly which row failed and why, so you fix those and import again — already-imported teams are skipped, not duplicated.

Retiring a team

Teams are archived, never deleted. An archived team disappears from the lists but stays attached to every result it ever played, so old tables and statistics do not break.

4. Players and squads

Registering a player

Tournament Admin On Players, add a first name and surname. A photograph, date of birth, village and identification are all optional but each one makes an eligibility dispute easier to settle later.

Photographs are re-saved by the system, which removes any location data the phone attached to them. Minimum size is 300×300 pixels.

Players under 18 A player under 18 cannot have their profile published, be approved into a squad, or be tagged in a photograph until a guardian's consent is recorded — name, relationship, phone. This is a legal requirement, not a preference, and the system will refuse the approval until it is on file.

Squads

A squad is a team's list of players for one season. Shirt numbers are unique within a squad.

  1. Team Manager submits the squad from My team. It is saved as pending.
  2. Tournament Admin reviews it under Squad approvals and approves or rejects each entry. A rejection asks for a reason, which is sent to the manager.
  3. Only approved players can be named in a match event.

After the season's squad cut-off date, no new players can be added except by a Super Admin — and that override is written to the audit log.

Duplicates

If you register a player whose identification number already exists, the system refuses and names the existing player. If the name and date of birth match someone already registered, you get a warning but can continue — two cousins in one village genuinely can share both.

5. Setting up a tournament

Tournament Admin Super Admin

The structure is four levels deep:

TournamentThe competition itself — "The Villagers Tournament".
SeasonOne running of it — "2026". Only one season is current at a time.
StageA phase within the season: a league, a group stage, or a knockout.
GroupGroup A, Group B… inside a group stage. Each produces its own table.

Knockouts that are not a power of two

96 teams do not divide evenly into a bracket. The Knockout planner on the Tournament screen works it out for you: enter the number of teams and it shows the bracket size, how many teams receive a bye, and every round that follows.

For 96 teams: 32 receive byes, 64 play a preliminary round to reduce to 32, and those 32 plus the 32 byes make the Round of 64 — then 32, 16, quarter-finals, semi-finals and the final.

Making the draw

The draw is made with a seed number. That means the same seed always produces the same pairings, so if anyone questions the draw you can re-run it in front of them and show that it comes out identically. The seed and the resulting pairings are written to the audit log. You can preview a draw before saving it, and optionally keep teams from the same district apart in the first round.

6. Fixtures

Tournament Admin

Creating fixtures

One at a time on the Fixtures screen, or generate a whole stage at once. Generation always shows you a preview first — nothing is saved until you confirm it.

For a league or group stage the generator produces a full round-robin, alternating home advantage so no team is away every week. For a knockout it makes the draw.

Warnings

If a team is already playing within 24 hours of the kick-off you are setting, or the venue is booked within three hours, you get a warning. It does not stop you — a double-header at one ground is sometimes deliberate.

Match officials

Assign a referee, assistants and a commissioner to each fixture. An official sees only the fixtures they are assigned to, and can only file a result for those.

Postponing and rescheduling

Both ask for a reason. The original kick-off is kept in the record. Both teams and every punter holding a slip on that fixture are sent an SMS.

7. Entering and confirming results

Confirmation is the moment everything happens Confirming a result is what updates the league table, advances the knockout bracket, updates the top-scorer list and settles any prediction event waiting on that fixture. Nothing else triggers it. Check the score before you confirm.

Filing a result from the ground

Match Official Open Enter a result on your phone.

  1. Choose the fixture from your list.
  2. Enter the full-time score. Half-time is optional.
  3. Add the goals — scorer and minute — and any cards or substitutions. You can file the score alone, but the goals are what build the top-scorer table.
  4. Press Submit.
Poor signal is expected Everything you type is saved on the phone as you go. If the connection drops, reopen the page and your entry is still there. It only sends when you press Submit.

If the goals you listed do not add up to the score you entered, the system says so before sending — correct one or the other.

Confirming

Tournament Admin Open Results. Everything waiting is listed with its score. Check it, then press Confirm.

An admin who enters a result directly confirms it in the same step, since the admin is the confirming authority.

Correcting a confirmed result

Super Admin only, and a written reason is required. The table, the bracket and the settlement are all recalculated from the corrected score.

Money already paid is not clawed back If the correction reverses a slip that has already been paid out, the system does not take the money back by itself. It raises the case for the Finance Officer to deal with as a human decision.

Walkovers and abandoned matches

A walkover is recorded against whichever team is awarded it, with a reason, and scores 3–0 by default. An abandoned match records the minute and the decision — replay, award, or void. Either way, predictions on that fixture are voided.

8. The league table

The table is never typed. Every figure is calculated from confirmed results, and there is no screen anywhere in the system that lets anyone edit it directly.

Teams level on points are separated in this order:

  1. Goal difference
  2. Goals scored
  3. Head-to-head record between the tied teams
  4. Fewest red cards
  5. Fewest yellow cards
  6. Drawing of lots

That order is configurable per stage.

Points deductions

A deduction is applied to a team's registration with a reason. The table shows the earned points and the deduction separately, with a footnote — so the public can see both what was earned and what was taken away.

9. The prediction game

Free-to-play until the licence is confirmed The system ships with staked predictions switched off. The game runs in full — punters enter, slips are graded, the leaderboard publishes — but no stake is collected and no cash prize is produced. Money is only enabled once The Villagers confirms in writing that it holds an LGRB licence.

Creating an event

Tournament Admin On Prediction events:

  1. Give the event a name — "Teams playing 15th–16th August 2026".
  2. Tick the fixtures from the list. You never type a team name. The fixtures come from the fixtures module, so a slip is always tied to a real match.
  3. Leave the closing time blank to close automatically 30 minutes before the earliest kick-off, or set your own.
  4. Create it, then press Open when you want it live.

How a punter enters

On /prediction they type how many goals each team will score, give their name and Mobile Money number, confirm they are 18 or older, and submit. They immediately get a reference like TVS-4KX9-2026, on screen and by SMS.

If money is switched on, the slip stays pending payment until the money is matched to it. The punter sends the stake to the merchant number quoting that reference.

How slips are graded

By default a slip wins only if every score it predicted is exactly right. Two alternatives can be chosen per event: one correct score is enough, or a points system where an exact score scores more than a correct outcome.

If a listed fixture is postponed or abandoned, that fixture is voided. The event decides what happens next: void the whole slip and return the stake, or grade the fixtures that were played.

Closing and settling

Events close on their own at the closing time, and any slip still unpaid at that moment expires. Settlement runs by itself once the last fixture in the event has a confirmed result. Every punter gets an SMS with their outcome, and winners appear on the public leaderboard by first name and a masked phone number.

The exposure limit

Each event has a ceiling on what it could be asked to pay out. As slips come in, the Exposure button shows how close you are. Once the ceiling is reached the system refuses new slips rather than accepting a liability the organisation cannot cover.

10. Payments and payouts

Finance Officer

Matching money to slips

Reconciliation lists every slip waiting for payment. When a Mobile Money transfer arrives, find the slip by its reference or the punter's number, type the MoMo transaction reference into the row, and press Confirm. The slip goes live and the punter is sent an SMS.

Paying winners

No payout is ever automatic. A winning slip creates an entry in the Payout queue and waits there.

  1. Check the payout. Press Approve — or Reject with a reason.
  2. Large payouts need a second, different officer to approve as well.
  3. Press Pay. Enter the MoMo reference if you sent it by hand, or leave it blank to use the Mobile Money API.

The daily check

The top of the Reconciliation screen shows the day's totals: slips taken, money staked, money paid out, and live exposure. The Dashboard shows Ledger balanced.

If "Ledger balanced" ever says NO Stop and report it. Every movement of money is recorded twice — once where it came from, once where it went — and those two must always agree. A "NO" means something is wrong with the records, not with the display.

11. Photos and news

Content Editor Tournament Admin

Albums

  1. On Media, create an album with a title and date. Copy the album ID it gives you.
  2. Paste the ID into the upload box, choose your photos — as many as you like — and upload.

Photos are shrunk on your device before sending, which matters a great deal on a slow connection, and are re-saved on the server. Thumbnails are made in the background, so a photo may take a few seconds to appear.

Deleting a photo is reversible for 30 days before it is permanently removed.

Tagging

Tagging a photo with a player makes it appear on that player's profile. A player under 18 without recorded guardian consent cannot be tagged.

News and pages

Posts can be drafted, scheduled and published; a scheduled post goes live on its own. The Rules and Responsible Play pages carry a version number and an effective date, so a change to the rules is dated and visible rather than silent.

12. Reports and the audit log

Reports

On Reports, pick one and press Run to see it on screen, or Download CSV to open it in Excel.

Teams / players per districtCoverage across the six districts.
Squad listEvery registered player with shirt number and eligibility.
Fixtures / resultsThe full schedule or every confirmed result.
Top scorersThe goal chart.
Prediction revenuePer event: slips, staked, won, paid out, margin.
PayoutsEvery payout, its status and who approved it.
Daily reconciliationThe figures the Finance Officer signs off each day.

The audit log

Every meaningful change is recorded: who did it, what their role was, when, from which address, and what the values were before and after. You can filter by action or date.

The audit log cannot be edited or deleted by anyone, including a Super Admin. That is deliberate: a record that the most powerful user can rewrite is not evidence of anything.

13. Settings

Super Admin

Settings holds the values you may want to change without a developer: the prediction cut-off, the grading rule, the cap on slips per punter, the threshold above which a payout needs two approvers, and the master switch for staked predictions.

Anything not set here falls back to the shipped default, which is shown on the same screen for reference.

14. If something goes wrong

What you seeWhat it means
The site has no styling — plain text and blue links. The compiled stylesheet is not loading. Ask the developer to run npm run build and delete public/hot.
"Your session expired. Refresh the page and try again." You were signed in for too long. Reload and sign in again.
"The connection is slow. Check your network and try again." The request did not reach the server. Nothing was saved — try again when you have signal.
"You do not have permission to do that." Your role does not include that action. See section 2.
"This account is locked after too many failed attempts." Five wrong passwords. A Super Admin can unlock it.
Signing in appears to work but returns you to the login page. The password was right — the browser was not given a session. The address you are using is missing from SANCTUM_STATEFUL_DOMAINS in .env. Add it, including the port, and restart. The login page now says this outright rather than looking like a wrong password.
A punter says they paid but their slip is still pending. The payment has not been matched yet. Find the slip on Reconciliation and confirm it with the MoMo reference.
The table has not updated after a match. The result has been entered but not confirmed. Check the Results screen.
"Ledger balanced: NO" Stop taking payments and report it immediately.

Who to contact

Tournament and fixture questions: the Tournament Admin. Money questions: the Finance Officer. Anything the system itself is doing wrong: the developer, quoting what you were doing and the exact message on screen.