← Back to blog

A Live Sales Dashboard for My Son’s Class Trip

nextjsgoogle-sheetsclass-triplive-data

I built a one-page site for my son’s class trip fundraiser. The Google Sheet is the only place anyone types numbers. The site is the only place anyone looks at them. It took one evening and it is free to run.

What it shows

The page is a progress view for the kids. It shows how much the class has raised toward the 23 000 kr goal, how that breaks down by campaign, a top 10 of who has sold the most, and how much came in when several kids sold together. Below the top 10 it just says “and N more,” so no one is left at the bottom of a full ranking.

The cashier already posts screenshots of her Excel file with the raw list and a total. That is enough for the accounts. The site adds the progress bar, the “how much from cookies,” and the top 10 that the kids actually open. Parents never have to touch the page. They edit the Sheet if they want, or they just look.

How the live read works

The Sheet is shared so anyone with the link can edit the sales tab. On every page load the browser fetches the relevant tabs directly from Google, checks that the expected columns are there, aggregates the rows, and draws the charts. A new sale appears the next time someone refreshes. There is no deploy step and no copy of the data sitting in the repo.

Only first names ever leave the Sheet. The site reads a whitelist of columns and looks up display names from a separate tab. Even if someone pasted a surname into the sales rows, it would not appear on the page.

Why a site instead of just the Sheet

The Sheet is a good place to type. It is a bad place to see how the fundraiser is going. A progress bar, a campaign filter, and a short ranking are the things that make the numbers feel like progress to a group of twelve-year-olds. The site is that view, and nothing else.

The same pattern works for other live numbers that already live in a Sheet: a project status, an open offer, a collection. The input stays where people already edit it. The page is just a clean, always-current picture of it.

What it cost and what I left out

One evening. Hosting is the free Vercel tier. There is no login, no private view of an individual student’s sales, and no connection to the real class account. If the Sheet is in a bad state the page fails quietly instead of showing an error. The money is unaffected either way.

Most of the Sheet is locked. Only the sales rows are open. That stops someone from overwriting a formula or renaming a tab, which is the usual way these things break. The rest is accepted risk. It is a motivation tool, not the books.

That is the whole thing: a shared Sheet, a one-page site that reads it live, and a group of kids who can see the progress bar move. The accounts stay with the cashier. The motivation stays on the phone.