# Grain recap queue: draft, send, and log call follow-ups

> One screen your reps and CSMs open after every customer call to see what still needs a recap, draft it, send it, and file it on the CRM record.

- Workflow type: app
- Services: Grain, Gmail, HubSpot
- Categories: Sales, Customer Support
- Published: 2026-08-22

## What it does

- Shows a queue of your recent customer calls that still have no recap sent, newest first, with the call title, who was on it, and the summary and highlights from the recording
- Puts the customer context right next to the call: the matched CRM contact, their company, and any open deals, plus the full transcript in a side panel
- Writes the recap for you when you hit Draft recap, covering what was agreed, the open questions, and the next step with a date, and leaves it in your email drafts to review
- Lets you edit the draft in the app and send it, then files the same recap on the customer's CRM contact and deal so the record matches what they actually received
- Hides internal-only calls by default and flags anything older than a few days as overdue so nothing quietly slips

## What you'll need

- A Grain account that records your customer calls
- A Gmail account for the reps and CSMs who will send the recaps
- A HubSpot login with access to contacts, companies, and deals
- Optional: a Grain Business or Enterprise plan for AI summaries and highlights. On other plans the app works from the transcript instead

## Prompt

Build me an app that my sales reps and customer success managers open after every customer call to get the recap out the door. Think of it as a recap desk, not an automation: the person opens it, works the queue, and leaves when the queue is empty.

The main view is a queue of recent Grain recordings that still have no recap sent, newest first. Build the queue from Grain List Recordings, following the cursor pagination to cover the last 30 days, and enrich each row with Grain Get Recording. Each row shows the call title, the date and duration, the external attendees, and the AI summary and highlights from Grain. Grain only returns the enrichment fields (AI summary, highlights, participants) on Business and Enterprise plans, so when they come back empty fall back to Grain Get Transcript and derive a short summary and the speaker list from the transcript, so a row is never blank.

Clicking a row opens a side panel with the full transcript from Grain Get Transcript, laid out with speaker names and timestamps and searchable within the panel, so the rep can check exactly what was said before the recap goes out.

Match each call to a person in HubSpot by attendee email. For each external attendee, try HubSpot Get Contact with idProperty set to email; if that misses, fall back to HubSpot Search Contacts on the email address and then on the email domain. Once a contact is matched, pull its company with HubSpot Get Company and its open deals with HubSpot Search Deals filtered to deals that are not closed, and show the company name plus each open deal with its stage, amount, and close date right beside the call. If nothing matches confidently, show an unmatched state with a search box that runs HubSpot Search Contacts so the rep can pin the correct contact to the call by hand.

Every row has a Draft recap button that kicks off a background agent. The agent reads the full transcript along with the Grain summary and the HubSpot context, then writes a short client-ready email in plain language covering three things: what was agreed, the open questions, and the next step with a specific date. It places the result in Gmail with Create a Draft, addressed to the external attendees on the call, and writes the draft id and the draft body back into the app so the row flips to Drafted and the body appears in an editable box in the row. Show the agent as running on that row while it works, and surface an error state on the row if it fails so the rep can retry.

The rep edits the recap inside the app. Saving edits pushes the change to Gmail with Update a Draft so the draft in their mailbox always matches what is on screen. Sending uses Gmail Send a Draft. Re-running Draft recap on a row that already has a draft should replace the existing Gmail draft rather than creating a second one.

Sending also files the same recap on the matched HubSpot contact and deal using HubSpot Create Note, associated to the contact, the company, and the open deal, so the CRM record matches what the customer actually received. The note body is the recap that was really sent, not the original generated version. Once the note is filed, the row flips to done and drops out of the default queue view, with a Sent tab where the rep can see recent sends.

Two rules shape the queue. Internal-only calls, meaning calls where every attendee uses the workspace's own email domain, are filtered out by default with a toggle to show them. And any call older than three days that still has no recap sent gets an Overdue flag with clear visual weight, with the threshold configurable in a small settings area along with the internal domain list. Add a filter for call owner so each person sees their own calls by default with a show all toggle, plus a search box over call title and matched company.

Persist per recording: the status (needs recap, drafting, drafted, sent), the Gmail draft id, the generated body and the edited body, the matched HubSpot contact, company and deal ids, the sent timestamp, and who sent it. The status is shared across the team so two people never send the same customer two recaps, and the queue is correct the moment someone reopens the app.

## How to customize

- Change how many days a call can sit before it gets flagged as overdue
- Adjust the recap email structure and tone, for example adding a recap of pricing discussed or dropping the open questions section
- Decide where the recap gets filed in the CRM, on the contact only or on the contact and the open deal
- Set which email domains count as internal so the right calls stay out of the queue

## FAQ

### Will it email customers without me seeing it first?

No. The app always writes the recap into your drafts and shows it to you in the app. Nothing goes out until you edit it if you want and press send.

### Do I need a paid Grain plan for this to work?

Recordings and transcripts are available on every Grain plan, so the queue and the recap drafting work either way. AI summaries, highlights, and the attendee list need a Business or Enterprise plan. When they are not available the app reads the transcript instead and shows a short summary it builds from that.

### How does it know which customer a call belongs to?

It matches the external attendee email address to a contact in HubSpot, then pulls that contact's company and open deals into the row. If there is no confident match you can search HubSpot from the row and pin the right contact yourself.

### What counts as an internal call?

A call where everyone on it uses your own company email domain. Those are hidden from the queue by default, and there is a toggle to show them when you want.

### Can a whole team work out of the same queue?

Yes. Each person sees their own calls by default and drafts land in their own mailbox, but the sent status is shared so two people never send the same customer two recaps.

Use this prompt in General Input: https://www.generalinput.com/prompts/grain-recap-queue-draft-send-and-log-call-follow-ups