Spreadsheet export

Every group can expose its data as live CSV feeds made for spreadsheets: paste one formula into Google Sheets and the sheet keeps itself up to date. No code, no OAuth — a single revocable link.

Getting the link

Ask the assistant in your group chat — for example “give me the spreadsheet export link” — or use the group settings on the web. Organizer role required. The reply contains per-feed URLs of the form:

https://team-up.tgmbot.com/export/<your-link>/attendance.csv

In Google Sheets, put a feed URL into IMPORTDATA:

=IMPORTDATA("https://team-up.tgmbot.com/export/<your-link>/attendance.csv")

Google refreshes imported data roughly hourly; the feeds themselves are cached for five minutes.

Feeds

All feeds are tidy, long-format tables with stable English snake_case headers — that is the public contract. New events only ever add rows; columns never move, so your formulas and pivots keep working.

FeedContentsColumns
events.csvOne row per event: id, date, title, whether it finished, confirmed sign-up count.event_id, date, title, finished, confirmed_count
attendance.csvOne row per sign-up: who registered for which event and with what status.event_id, event_date, user_id, player, status
stats.csvOne row per player per logged event type: goals, assists, aces — whatever the group tracks.user_id, player, type_id, label, count
dues.csvmoneyOne row per dues entry: how much each player owes and has paid per event.event_id, event_date, user_id, player, amount, paid, status
ledger.csvmoneyOne row per cash-ledger entry: the group treasury in and out.date, kind, label, amount, event_id

Feeds marked money exist only on links created with money access — the assistant asks the organizer explicitly. Without it, those URLs return 404.

Security model

The link slug is the credential — anyone holding the URL can read the feeds (Google fetches them server-side, so there is no session to present). Accordingly:

  • One live link per group; requesting it again returns the same link.
  • Revoking (“revoke the export link”) kills every copy of the URL immediately, including formulas already pasted into sheets. The next request mints a fresh link.
  • Unknown, revoked and permission-blocked feeds are indistinguishable from outside — all return 404.
  • Requests are rate-limited per IP.