Pre-call prep board for your next three days of meetings

By General Input

Open one board each morning to see every external meeting coming up, the deal behind it, and everything said the last time you spoke to those people.

Integrations

  • Granola
  • HubSpot
  • Google Calendar

Type

App

Categories

  • Sales
  • Personal Productivity

Build me a pre-call prep board I open every morning before my meetings. It pulls my upcoming external meetings from Google Calendar, pairs each one with the matching HubSpot deal and with the Granola notes from every time I already met those people, and lets me kick off a background agent that writes a prep brief straight back into the app.

Main view: a list of my meetings for the next three days, grouped by day and ordered by start time. Get them with Google Calendar List Events on my primary calendar, using a time window from now to three days out, singleEvents set to true and ordered by start time so recurring meetings expand into real instances. Skip anything that is not a real meeting with other people: cancelled events, all day events, events with no attendees other than me, and event types like out of office, focus time and working location. Then skip internal-only meetings, meaning every attendee email shares my own email domain. My domain should be read from the connected Google account rather than typed in, and there should be a settings field where I can add extra domains that count as internal, for example a sister company or a contractor domain. Each row shows the meeting title, the day and start time, the external attendees with their email addresses, the matched deal, and a count of past meetings with these people.

Deal matching per row: take the external attendee emails, pull out their email domains, and find the account. Use HubSpot Search Companies filtered on the company domain property to find the account, then HubSpot Search Deals to find that company's deals, preferring the most recently updated open deal and falling back to the most recent closed one if there is nothing open. As a fallback when the domain finds no company, use HubSpot Search Contacts on the attendee email addresses and follow the contact's associated company and deals. Show the deal name, stage, amount, close date and owner on the row. Resolve the owner id to a real person's name with HubSpot List Owners, and resolve the stage id to its readable label with HubSpot List Pipelines, both cached for the session so you are not refetching them per row. If nothing matches, say so plainly on the row rather than hiding it.

Meeting history per row: Granola has no search endpoint, so list notes and match app-side. Call Granola List Notes with a created or updated filter covering roughly the last twelve months, paging through with the cursor until there are no more pages, and cache the resulting index for the session so the board does not re-list on every render. For each note, compare the note's attendee email addresses against the external attendees on the calendar row, and count a match when any external attendee overlaps, or when the attendee email domains match the account domain. The row shows that count, for example "4 past meetings", and shows zero clearly when this is a first conversation.

Detail pane: clicking a meeting opens a detail view for that account showing the full conversation history in reverse chronological order. Each past meeting shows its date, title and attendees, with the Granola summary rendered inline from the note's markdown summary. Each one expands to reveal the full transcript, fetched lazily with Granola Get Note passing include=transcript only at the moment I expand it, so opening the pane does not pull every transcript at once. The pane also shows the deal card at the top with stage, amount, close date and owner, and the attendee list for the upcoming meeting.

Every row has a "Prep me" button that starts a background agent for that meeting. The agent reads the matched prior Granola notes with Get Note using include=transcript, reads the HubSpot deal context including the deal properties and any recent notes already logged on the deal, and then writes a brief with four sections: what happened last time, commitments I made that are still open, objections that were raised and how they were handled, and a suggested agenda ending with three specific questions to ask on this call. Every claim in the brief should point at the meeting it came from, with the date, so I can jump to the source. The button shows a running state while the agent works and the brief appears in the detail pane when it lands.

Briefs persist. Store each finished brief in the app's own storage keyed by the calendar event id, along with the account domain, the deal id, the generation timestamp and the ids of the notes it was built from. When I reopen the board, any meeting with a saved brief shows the saved version immediately with its generated date, instead of re-running the agent. There is an explicit "Regenerate" action for when I want a fresh pass, which replaces the stored brief.

A second button, "Log to HubSpot", posts the brief to the matched deal with HubSpot Create Note, associated to the deal, so the rest of the team can see it on the record. Prefix the note body with the meeting title and date so it reads clearly in the deal timeline. Disable the button when there is no brief yet or no matched deal, and once a brief has been logged show when it was posted so I do not log the same brief twice.

Things to respect. Granola is read only, so every write in this app lands in HubSpot. Transcripts are not returned by default, so always pass include=transcript on Get Note when the transcript is actually needed. Granola pages are cursor based with a maximum page size of 30. Granola allows roughly 5 requests per second, so throttle the note fetches and back off exponentially when a 429 comes back. HubSpot search endpoints are limited to about 4 requests per second, so batch and cache lookups rather than firing one search per row. A Granola personal API key only sees the key owner's own notes space, so frame the whole app as "my meetings" rather than promising full team coverage, and say so in the empty state when no notes are found.

Related prompts

Explore more prompts
Turn Mailjet email clicks into ranked HubSpot follow-upsiMessage campaign console with pre-flight checks and delivery boardA searchable RFP answer library your bid team drafts fromSee which target accounts just started advertising on LinkedInFront desk appointment confirmation board for the next 3 daysAccount health board that puts product usage next to your CRMLook up a customer's full chat history mid conversationLusha prospecting workbench with credit-safe revealsWhich companies your LinkedIn ads reach, matched to your CRMLead response desk with a running clock on every new lead