Let's talk
operations

The field task list held every check missed since March

A long campaign turned the phone's task list into a backlog nobody read, while boards with no live campaign got no task at all. How we made it short.

·

A field worker on a road holding a phone showing the short task list in the Sazinga AdBoard field app.

The client’s rule is simple: every board is visited twice a week, whether or not anything is booked on it. The field team’s phone is meant to say which boards are due.

Two things went wrong with that list. On a long campaign, every monthly check that had ever been missed stayed on it, so a board watched since March carried dozens of overdue items, and a list like that stops being read. And a board with no live campaign produced no task at all, even though under the client’s rule it still owed two visits that week.

On a Tuesday it was worse. Every board read “Mon-Wed due, Thu-Sat due”, asking for work nobody could do for two more days. Nobody can photograph last March, and nobody can photograph Thursday on Tuesday.

What was actually going on

The report and the to-do list want different things from the same schedule. The report needs every gap, because a client asking whether their board was photographed monthly deserves an honest list of the misses. The person standing at a board needs exactly one thing: the check they can do now.

The phone’s home screen was also built from campaigns outward. It fetched every active campaign, then asked about each one separately, which is one request per campaign on Indian mobile data. A board with no campaign simply produced nothing.

The schedule itself had a trap. A weekly schedule on a campaign with no end date expanded against a far-future placeholder and ran to the expander’s limit of 400 dates, which buried the completeness view. And the status word “open” only meant “not missed”, which is why a window that had not started read as due.

A third fault sat in the rules for late entry. Campaigns entered after they began were charged with misses for the days before anyone had entered them.

What we changed

Monitoring got its own start and end dates, following the campaign’s unless set. For a campaign with no end, a rolling three-month horizon stands in. The report stays complete; a separate “due now” window carries the single check that can be done today.

One call now returns the whole week for every board the user holds, driven from boards rather than campaigns, so a board with nothing booked still appears. A new “upcoming” status, judged on the Indian calendar, stops Thursday’s window reading as due on Tuesday.

Nothing is expected before the day a campaign was entered. On real data that removed 23 of the 39 checks expected to date. Forty-eight of the 51 campaigns in the test copy had been entered after they started. The weekly quota is worked out when it is read and is never stored as rows, so it cannot drift from the rule.

What it did not fix

A missed week stays in the report and produces no task, by design. If a board was not visited in March, the record says so and the phone does not ask anyone to go back.

The rule that nothing is expected before entry also means a campaign entered late shows fewer misses than happened. That is by design, and the report reflects it.

The pattern, for anyone who runs field visits

Write down what each person needs from the same list. The person who audits wants every gap. The person on the ground wants one action.

If your app shows a backlog to the second person, they will stop opening it, and then the audit list will be full of things nobody saw.

Where this ends up

The site-driven week on the phone belongs to AdBoard, the system that runs for Gold Sign Media, an outdoor media operator. A field user now opens one short list built from the boards they hold, with the check they can make today at the top.

This came out of building Sazinga AdBoard

Every site, every booking, every invoice — in one place. The problem above is one we met while building it, and what we did about it is in the product.

If you run something like this, there is one thing you can do without a call: tell us your board count.