← All explainers
Famu · Attendance & Payroll

From attendance
to payslip

Famu has always known what you paid a worker. It has never known what you owed them. Those are different numbers, and the gap between them is the thing people argue about on a farm.

Before UGX 300,000

You worked it out in your head and typed the answer. Famu stored the answer and none of the working. Three weeks later Grace says you still owe her for two days — and nothing in the app can settle it.

After 22 days · 2 half days

The days are written down as they happen. The wage is derived from them. Now the number can be checked — by you, by Grace, by anyone reading the records a year later.

0 Set once, per worker

First: how is this person paid?

Everything below depends on the answer, and there are only two.

Monthly the default UGX 350,000 / month

A flat figure agreed once — the same whether February is 28 days or March is 31. This is how most farm workers are paid, and it is what a new worker gets unless you say otherwise. Their attendance is still recorded, but it is a record: marking them absent never changes what they are paid.

Day rate casuals UGX 10,000 / day

Paid for the days actually worked. These are the rows the grid turns into money, so the days have to be marked. This is the seasonal hand, the picker, the person who came for a fortnight.

Set it from the pencil beside a worker's name on the Attendance tab. Piece work is paid on top of either.

1 During the month · /attendance

Mark who was there

The only part that costs anyone effort — and only day-rate workers depend on it.

Each row is a worker, each column a day. Tapping a cell moves it on one step — present, half day, absent, blank — and saves on its own. There is no Save button on purpose: a screen full of unsaved taps is a screen of work lost when the phone sleeps in a shirt pocket.

Peter is salaried, and he is in the grid anyway. That is on purpose: you still want the answer to \u201cwas he here on the 14th?\u201d. Mark him absent all week and watch his payslip below — it does not move.

Mon 1 – Sun 7 September Tap any cell
Worker Mon1 Sep Tue2 Sep Wed3 Sep Thu4 Sep Fri5 Sep Sat6 Sep Sun7 Sep Days
P Present — a full day ½ Half day — half the rate A Absent — nothing, but recorded · Not marked

Change anything above and watch the payslips in step 2 move with it. The arithmetic on this page is the same code the app runs.

Not everyone is paid by the day

Some work is paid by how much was done, not how long it took. That is piece work, recorded on the same page — quantity × rate:

  • Grace picked 48 kg then 61 kg of coffee cherry at 900/kg — 98,100
  • Peter caught 120 birds for a sale at 200 each — 24,000
2 At month end · /payroll

Press one button

Famu adds up what the month already recorded. You read it, then approve.

One payslip per worker, each on its own basis. Grace is on a day rate, so hers is the days off the grid times her rate. Peter is salaried, so his is his monthly figure \u2014 here a week of a thirty-day month, so 350,000 \u00d7 7\u204430. Piece work is added to both, and anything already handed over in the period comes off.

Peter would be on this run even with the grid completely blank. That is what a salary means, and it is the single most important thing on this page: a payroll feature that only paid people whose days were ticked would quietly skip most of the farm.

On Thursday you gave Grace 40,000 as an advance and recorded it on Worker Payments, as normal. It comes straight off what you owe her today.

Draft run · 1 – 7 September Nobody is paid yet
WorkerBasisDaysBase pay PieceEarnedAlready paidPayable
payable = days × rate  +  piece work  −  already paid  +  adjustment

Adjustment is the one column you can type in, and it exists for what the app cannot know — a deduction for a broken panga, a bonus for a hard week. Days, rates and already-paid all come from records, which is exactly what makes the payslip checkable.

3 After · /worker-payments

Approve, and it becomes money

The run stops being a calculation and becomes a record.

Approve & pay writes one Worker Payment per person owed something — categorised Salary, dated the end of the period, noted with the run it came from. Anyone owed nothing gets no row.

After that the run is frozen. It cannot be edited or deleted — not greyed out in the interface, refused by the database — because the money has left the farm. A draft you can throw away freely.

Worker Payments is unchanged and still where money lives. Approving just writes the rows you would have typed yourself.

“Already paid” means everything

Not only payments filed as Advance. If Grace's 40,000 had been tagged Salary or Bonus, it would still come off — money that reached her reached her. This is also why re-running the same week after approving pays 0: the run's own payment now sits inside the period and is netted off by the same rule. No special case.

You never record a wage in payroll

You record work in attendance. Payroll is a calculator with a memory, not a place you enter money. That inversion is the thing most people have to hear twice.

An absence never docks a salary

Famu will not quietly reduce a figure you agreed with someone. An unmarked day is far more often a supervisor who forgot the grid than a worker who stayed home, so absences are shown on the payslip and the deduction is an Adjust — something a person decided, and can be seen to have decided.

Raising a rate doesn't rewrite the past

Every day keeps the rate it was marked at. Give Grace a raise in March and February's payslips still read 10,000 — because that is what February actually cost.

Approving is a separate permission

A supervisor can mark the crew in and build the draft without being able to turn it into money. That stays with an admin — the same line sales and expenses already draw.

! Worth saying out loud

If nobody taps the grid, half of this stops working

The day-rate half rests on step 1

Salaried workers are safe: their payslips come out right whether or not anybody touches the grid. Day-rate workers are not. A run over an empty grid pays them nothing, so for that half the real question is not "is the payroll page good" — it is will a supervisor actually mark attendance.

Everything about the grid is shaped by that risk: one screen for the whole crew, a tap instead of a form, saving instantly, no Save button to forget. If it turns out farms still won't do it, the day-rate path is the part that suffers — and that is worth finding out early rather than defending later.

Earns its keep for

  • Day-rate and casual labour — most smallholder hiring in Uganda and Kenya
  • Crews that change week to week
  • Piece-rate work: picking, weeding, catching
  • Anywhere advances are handed out mid-month
  • Any farm where “how much am I owed?” gets asked

Does little for

  • A flat monthly salary that never varies
  • A farm with one permanent worker and no advances
  • Anyone who won't record days as they happen

Numbers on this page are computed with the same rules as app/src/lib/payroll.js — day factors of 1 / 0.5 / 0, a monthly salary pro-rated by calendar days, rounding once at the payslip total, and every payment in the period counted against payable.

The staging demo farm seeds this exact shape, with the second week deliberately left unpaid.

The steps, one page each

This explains how it works. These say exactly what to tap.

Try it on your own farm →