← All work

Nonprofit · Internal tool

The sign-in sheet, retired.

A nonprofit delivering care across dozens of homes had no reliable record of who showed up where. We built the check-in that fits on a phone and the dashboard that makes the month payroll-ready.

Client
Community care nonprofit
Role
Product, design and engineering
Built on
Google Apps Script and Sheets
Status
Live · second release

Purpose

The work happens in other people’s homes.

This organisation runs on people rather than paperwork: a small office staff, and a much larger group of caregivers working across dozens of client homes and community locations rather than one building.

Attendance had always been kept by hand — a paper sign-in sheet, or a manager holding it in their head. That works until it does not. A payroll dispute arrives and there is no record to check. Nobody can see a month’s pattern. And when someone checks in somewhere that does not match where they were scheduled, nothing catches it.

The constraints were as firm as the problem. It had to be run day to day by a non-technical office manager. Caregivers in the field had to use it from a phone in seconds. And it could not require buying software or standing up hosting, because the budget for both was nothing.

The interface today

One tap for them. A desk for the manager.

The current release, in the client’s own palette and type. Employee names are invented; the client’s wordmark is stood in for.

Care Team
Attendance
Time off

Check in

Good Morning, Clare

Tuesday, September 29, 2026

Now8:56 AM Not checked in
I am in WFH In the field
Add a note for your manager (optional)⌄
Care Team, Inc.  |  by Isaac and Co. Consulting
Check-in, second passThe same one-tap promise, with a third answer. WFH joined I am in and In the field once it turned out the office/field split did not describe how everybody actually worked.

Care Team
Attendance

CBClare Bennett
Jump to…⌘K

Your day

Today

Month

Time Off Requests3

Your team

Employees

Reports

Setup

Settings

by Isaac and Co. Consulting

Today

Tuesday,
September 29

11 of 18 in · 5 items need review

Jump to a name ListTableBoard

In today

11 of 18

includes 1 in the field

Not in yet

3

no entry yet today

Out

4 out

2 PTO · 1 sick · 1 WFH

Needs review

5

time-off requests

Needs review (5)

Marsh, PriyaPTOFri, Sep 25Pending approvalApproveEdit
Okonjo, DanielSickTue, Sep 29Pending approvalApproveEdit
Doyle, KevinPendingTime off · Fri, Oct 2 · Dr. Appt.ApproveDeny
Sato, MeiPendingTime off · Oct 12 → Oct 16ApproveDeny
Today, rebuilt around the decisionThe first version listed the roster and left the manager to read it. This one leads with the four numbers that answer “is today fine?”, then hands over a queue of things waiting on a yes or no — time-off requests included, which the first version could not handle at all.

Care Team
Attendance

CBClare Bennett
Jump to…⌘K

Your day

Today

Month

Time Off Requests3

Your team

Employees

Reports

by Isaac and Co. Consulting

Month

‹September 2026› Only items needing review Add field day Export this month (CSV)

Time off

Alvarez, RosaSep 23 → Nov 2 · Out of Town/WFHApproved
Nasser, AmiraSep 28 → Oct 5 · OffApproved
Doyle, KevinFri, Oct 2 · Dr. Appt.Pending
M1T2W3T4F5S6S7M8T9W10T11F12S13S14M15T16W17T18 Alvarez, Rosa8:309:11FLD8:56HOLFLDPTO8:409:349:078:318:378:159:22 Bennett, Clare8:539:449:048:12HOL8:189:318:288:10SICK8:499:27FLD9:37 Doyle, KevinPTO8:089:589:03HOLABS9:39FLD8:009:118:588:498:349:28 Marsh, Priya8:449:239:588:11HOL8:128:028:25FLD8:098:188:138:488:06 Nasser, Amira8:199:018:518:29HOLABS9:28ABS9:36FLD9:128:588:149:57 Okonjo, DanielFLD8:448:139:26HOL9:34ABS8:068:11PTO8:309:018:238:40 Sato, Mei8:119:32SICK9:00HOLFLD8:029:409:229:479:328:349:498:26 Whitfield, Tom8:48FLD8:35FLDHOL9:498:599:249:518:189:179:449:179:14
Month: times, not just ticksEvery employee down, every day across — but each cell now carries the actual arrival time, with HOL, PTO, FLD, SICK and ABS where there is no time to show. Approved and pending time off sits above the grid, and the month exports to CSV from the same screen.

The rules

The vocabulary is the product.

Most of the design work went into deciding what a day can be called, and who gets to call it that.

PresentConfirmed by a manager, or self-reported and since reviewed.
UnverifiedEvery self-submitted entry starts here. Not an accusation — a queue.
ExcusedPTO, sick and holiday, each configurable as counting or not. Requests now approve or deny in the app.
AbsentScheduled to work, no entry, no excuse recorded.
Away, but workingWFH and field days, added in the second release once the office/field split proved too narrow.

Three rules hold the whole thing together. Nothing blocks a check-in — an entry from outside the office radius is flagged, never refused, because a caregiver standing in a client’s driveway should not be arguing with a form. Voiding is separate from editing — correcting a legitimate entry and erasing one made in error are different actions with different consequences, so they are different buttons. And everything captures a reason, which builds the audit trail without anyone setting out to build one.

Where it started

The first version, kept for comparison.

What shipped first, and what 30 days of testing, onboarding, and using it argued for changing.

Four things drove the second pass. Time off had no home — requests arrived by text and lived in somebody’s memory until payroll, so they became a first-class queue with an approve or deny on it. The office/field split was too narrow, and WFH had to stop being filed as an exception. The month needed times, not verdicts: knowing somebody was present is thinner than knowing they arrived at 9:42, and the grid was throwing that away. And the manager was doing the reading — scanning a roster to decide whether the day was fine — so the day now opens with the four numbers that answer it.

The check-in screen barely moved. One tap, one question, no login. That part was right the first time.

Check in

Good morning, Dana

Tuesday, 22 September

Where are you today?

I am in In the field
Add a note (optional)
Location is checked once, at the moment you tap. Never tracked continuously.
Version one, check-inTwo answers only: in, or in the field. The shape of the screen survived into the current release almost unchanged, which is the best thing that can be said about a first draft.
TodayMonthEmployeesSettings

Today — Tuesday, 22 September

14 active employees · 11 checked in · 2 need review

Needs review

Marcus T. checked in 1.2 miles outside the configured office radius. Priya S. self-reported at 7:41a, unverified.

Roster

Dana R.8:52aPresentEdit
Marcus T.9:04aUnverifiedConfirm
Priya S.7:41aUnverifiedConfirm
Lena O.—PTOEdit
Jordan K.—Not inMark in
Amara B.8:37aPresentEdit
Tomas V.—SickEdit
Version one, TodayA roster and a review queue, with the manager reading down the list to work out whether the day was fine. The current release answers that question before the list starts.
TodayMonthEmployeesSettings

September — every employee, every day

Totals calculated against each person’s configured workdays and the organisation’s holiday calendar.

1234567891011121314151617181920
Dana R.21 / 22
Marcus T.19 / 22
Priya S.22 / 22
Lena O.18 / 22
Jordan K.20 / 22
Amara B.22 / 22
Tomas V.17 / 22
Ruth E.21 / 22
Ken A.20 / 22
Version one, MonthPresent, absent or excused as a block of colour. Legible at a glance, but it could not tell you that somebody arrived at 9:42 rather than 8:55.

Workflow

From a tap in a driveway to a payroll file.

01

Tap the link

A personal link on the home screen. No install, no login, no roster to scroll.

02

Say where

In the office or in the field, with an optional note, and location checked once at that moment.

03

Land as unverified

The entry arrives in the manager’s queue rather than straight into the record.

04

Review with a reason

Confirm, edit or void. Every change captures why, and a 10-second undo covers the wrong-person case.

05

Export the month

A CSV straight from the month view, replacing the manual reconciliation that used to eat month-end.

In our words

What the screenshots do not show.

The ask sounded like a time clock. What the organisation actually needed was a record it could defend — in a payroll dispute, in a funder’s audit, in a difficult conversation with a caregiver. That reframing set almost every decision that followed.

The one we thought hardest about is treating self-reported data as provisional. Every entry an employee submits lands as Unverified until a manager confirms it. That is not distrust; it is the difference between a claim and a record, and drawing the line explicitly is what makes the confirmed data worth relying on. The corollary is that the flag never blocks anything. A check-in from outside the office radius still goes through, still counts, and simply arrives with a note attached. Software that argues with someone standing in a client’s driveway does not get used.

Underneath, the logic deciding what counts as present, absent or excused — weekends, holidays, each person’s own schedule — lives in its own module with its own test suite, forty tests, independent of any screen. It runs identically whether the manager dashboard is asking or the check-in page is. Attendance rules are exactly the kind of thing that quietly drifts apart when the same logic gets written twice.

The hardest problem was not in our code. The dashboard originally gated access on a Google account allowlist, which is clean until a manager’s Google account sits on a different domain than the owner’s — a genuine, under-documented limit of the platform rather than a bug. Rather than paper over it, we added a second path: a scoped, revocable link that sits alongside the account check and lets a manager grant full access to whoever needs it without fighting Google’s identity model.

The documentation shipped as part of the product, not after it. Two branded PDF guides, one for managers and one for employees, plus a personalised onboarding packet for every single person — a cover page with their name and a QR code straight to their own check-in link, generated from the live roster rather than assembled by hand.

All of it runs on a Google Sheet the organisation already owned. No server, no database, no hosting bill. For a nonprofit, that was not a technical detail; it was the reason the project was possible.

What the second release changed. Thirty days of testing, onboarding, and using it is worth more than any amount of planning, and it argued for four changes. Time off stopped being a text message to a manager and became a queue with an approve or deny on it. WFH stopped being an exception filed under something else. The month grid started showing arrival times instead of verdicts, because present turned out to be a thinner fact than 8:52. And the day now opens with four numbers rather than a roster, so the question the manager was reading the list to answer is answered before they start reading. The check-in screen is the part we changed least, which is the part we are happiest about.

What we would do differently. Apps Script’s identity model was the single biggest source of friction in this build — cheap and infrastructure-free, but it fights you the moment your users are not all on one Workspace domain. For an organisation we knew from day one would have managers across domains, we would design the access-link path in at the start rather than reaching for it after hitting the wall.

Live and in daily useOffice staff and caregivers, with every employee onboarded on their own guide.
No infrastructureRuns on a Google Sheet the organisation already had. No server, no hosting bill.
Rules engine under testForty tests on the present, absent and excused logic, independent of the interface.

Start here

Tell us where the hours are going.

A short call to find out whether there is something worth building. If there is not, we will say so.

Book a call

Or email zuleema@isaacandco.co