The hours you spent in meetings are the ones you forget to bill
An automatic tracker watches the machine in front of you, which means the ninety minutes you spent on a client call with your laptop shut are invisible to it. Your calendar knows about those ninety minutes. Connect it and BillNotch reads the last two weeks of meetings, throws away everything that was not real work, and offers you the rest on the Review screen to accept or wave away.
calendar.events.readonly · past 14 days · primary calendar
The one request BillNotch makes to Google
It is worth stating precisely, because a calendar is a private thing and “we integrate with Google Calendar” tells you nothing. There is exactly one endpoint in the code — calendars/primary/events — asked for a window that starts fourteen days ago and ends now. Nothing in the future is requested. No other calendar id is ever substituted for primary.
The request sets singleEvents=true, which is Google’s instruction to expand a recurring series into its individual occurrences. That is why a daily standup arrives as ten separate suggestions you can accept and dismiss one by one, rather than one series you would have to reason about. Results come back ordered by start time, 250 at a time, and BillNotch follows the page tokens until Google stops handing them out.
Google’s own fields decide what survives
No heuristics, no title parsing, no guessing from who was invited. Four fields on the event as Google returns it do the whole job, which means you can predict the outcome from inside Google Calendar before you ever open BillNotch.
transparency
Anything marked “show as free” is dropped
Google records that choice as transparency: transparent on the event. BillNotch reads exactly that field, which makes “show as free” the one lever you already have for keeping a slot out of the list.
start.date
All-day events never arrive
Google gives an all-day event a start.date and no start.dateTime. That missing timestamp is what identifies it, so holidays, conference markers and birthdays are discarded before anything is stored.
attendees[].self
Your own response, and only yours
The attendee list is scanned for the one entry Google flags as self, to see whether your responseStatus was declined. Everybody else on the invitation is read past and never written down.
status
Cancelled occurrences disappear
A cancelled instance of a recurring meeting comes back from the API as a tombstone. It is thrown away rather than offered to you as an hour you might have worked.
Two more rules run after those. Anything shorter than five minutes or longer than twelve hours is treated as something other than a meeting and discarded. And a meeting whose slot already overlaps time you tracked is never offered at all, so the desktop app and the calendar can never both claim the same hour — if you sat in a video call with the tracker running, the calendar has nothing to add.
The consent screen, and what Workspace admins control
Open Settings → Calendar and press Connect Google Calendar. Google shows you the account picker and then one consent screen listing read-only access to calendar events and your email address. The authorisation request asks for offline access and forces the consent prompt, which is the part that makes Google issue a refresh token — without it the connection would quietly stop working after an hour and you would have no idea why.
On a Google Workspace domain, whether that consent screen appears at all is your administrator’s call: Workspace can restrict which third-party apps may hold calendar scopes. That is a Google Admin console setting, not a BillNotch permission, and there is nothing to request on our side. Inside BillNotch the connection is personal — every member connects their own account, nobody sees anybody else’s meetings, and no admin role is involved.
What accepting a meeting actually does
It creates a real time entry — not a draft — whose description is the meeting title and whose start and end are the meeting’s own. You can pick a project on the row before you accept. The entry is created non-billable, so putting it on an invoice is a second, conscious decision; a calendar is not evidence of billable work and BillNotch does not pretend otherwise.
Dismissing a meeting removes it from the list permanently and does nothing to your calendar. The accept itself is guarded, so two tabs cannot both turn one meeting into two entries; the loser of that race has its duplicate entry rolled back rather than left behind.
When it reads, and what it keeps
Only when you look. Opening the Review screen triggers a sync, and pressing Sync now forces one, but a connection will not re-read Google more than once every fifteen minutes. There is no background job polling your calendar overnight and no push channel subscribed to it: if you never open BillNotch, BillNotch never reads your calendar.
Four fields per meeting are stored — Google’s event id, the title, the start and the end. Descriptions, locations, attendee lists, organisers and Meet links are not requested and not kept. Of the credentials, only the refresh token is written down, encrypted with AES-256-GCM under a key derived for that single purpose; the short-lived access token is never persisted at all. Revoke access from your Google Account and the Calendar card says so plainly and offers Reconnect, rather than showing a healthy connection that has silently stopped returning meetings.
What it will not do
It will not write a single character back to Google, will not read your upcoming week, and will not touch a calendar other than your primary one. It does not detect Meet or Zoom links, does not know who else was in the room, and does not guess a client from an attendee’s email domain. The AI categorizer does not run on accepted meetings either: a meeting with no project chosen stays without one until you say.
The provider list is short. Outlook and Microsoft 365 are the only alternative; Apple Calendar, CalDAV and subscribed ICS feeds are not supported.
Common questions
- Which Google scope does BillNotch ask for?
- calendar.events.readonly, plus openid and email so the connection can be labelled with the account it belongs to. There is no write scope anywhere in the request, so the consent you give cannot be widened without Google asking you again.
- Which calendars does it read?
- The primary calendar of the account you connected, and nothing else — the request goes to a single endpoint, calendars/primary/events. Secondary calendars, calendars shared with you and subscribed feeds are never touched.
- Can my Google Workspace administrator block this?
- Yes, and that is Google’s design working as intended. Workspace admins can restrict which third-party apps may hold calendar scopes. If your organisation does, the consent screen refuses before BillNotch is ever involved, and the fix is a Google Admin console setting rather than anything on our side.
- How do I revoke it?
- Disconnect in BillNotch, or remove BillNotch from the third-party access list in your Google Account at any time. Either way the pending suggestions go with it; entries you already accepted stay, because by then they are ordinary time entries with no link back to Google.
- Are meetings turned into billable time automatically?
- No, twice over. Nothing becomes a time entry until you click on it, and an accepted meeting is created non-billable with no project unless you choose one on the row. Marking it billable is a deliberate act, never a default.
Recover a fortnight of meetings in one sitting
A 14-day trial, no card, and the connection is read-only. The Outlook version works against Microsoft Graph instead, the automatic tracker covers everything that does happen at the keyboard, and BillNotch for consultants is written for the people whose week is mostly calls.
Start tracking free