Google Sheets
Chart a published CSV. Start from the KPI template (Make a copy https://docs.google.com/spreadsheets/d/1Ty5X3LkY2unxTNGbkq36qDzuuYxQMsuywaTNyzL_pac/copy; public CSV https://docs.google.com/spreadsheets/d/1Ty5X3LkY2unxTNGbkq36qDzuuYxQMsuywaTNyzL_pac/export?format=csv&gid=1746689811; downloads /templates/google-sheets.csv and /templates/google-sheets.xlsx).
What you can track
Any numeric column in a CSV tlly can fetch: a published Google Sheet, a shared sheet exported as CSV, or any other HTTPS CSV. One job reads one value column into one series. Run one job per column.
The template columns are Date, Revenue, Signups, Active users, Orders, Pipeline value, with 30 daily rows from 2026-09-27. Download it from this site or copy the founder’s sheet.
Credential
None. The tab has to be readable without signing in.
Where to get it
- Make a copy of the template. The sheet itself is here. A second tab, “How to use”, repeats these steps. The Metrics tab is gid 1746689811.
- Or download /templates/google-sheets.csv or /templates/google-sheets.xlsx and import it (File → Import).
Then either:
1. Share → General access → **Anyone with the link** → Viewer. The CSV tlly can fetch is https://docs.google.com/spreadsheets/d/FILE_ID/export?format=csv&gid=TAB_GID. The template’s public export, checked without sign-in, is https://docs.google.com/spreadsheets/d/1Ty5X3LkY2unxTNGbkq36qDzuuYxQMsuywaTNyzL_pac/export?format=csv&gid=1746689811. 2. Or File → Share → Publish to web, choose the tab and **Comma-separated values (.csv)**, and copy the …/pub?output=csv link. Publish only what you would put on a dashboard. Publish to web.
tlly job
{"series":"revenue","cron":"0 7 * * *","request":{"url":"https://docs.google.com/spreadsheets/d/FILE_ID/export?format=csv&gid=TAB_GID"},"extract":{"format":"csv","date":"Date","value":"Revenue"}}
Repeat with "value":"Signups" (and a new series name) for each column. Header matching ignores case.
A CSV with no extract.date is a snapshot: every row is stamped with the UTC fetch day, and the series keeps the last row for that day. Use that for a one-row sheet of current totals. It does not sum the column. A JSON aggregate that omits date does sum or count the whole list into one point. A history needs the Date column. A blank cell in a named Date column is also stamped with the fetch day. A date that is present but not a date is an error.
Gotchas
- Google can cache a published CSV for several minutes. A shared export link is the faster of the two, and it still is not instant.
- Dates like 2026-09-27 are taken as written. Do not format the Date column as a locale string that is not a date (27/09/26 may parse; a word will not).
- The delimiter is detected (comma, semicolon or tab). The template is comma-separated.
- One value per series per day. Two rows with the same date: the later row wins.
- No Google account credential is stored. tlly only GETs the URL.
Alert ideas
Red when Revenue is below the month’s target. Yellow when Signups are under the trailing week. Pipeline value red below the cover number you agree with the user.
Verification
The template file in the repo matches the public export columns and the 30 dates 2026-09-27 through 2026-10-26. Publish-to-web steps follow Google’s help page linked above. The Make a copy URL is the founder’s sheet, not a guessed link. Date-less CSV stamping is this codebase’s fromCSV.