How to Build Meeting Intelligence Into Your SaaS Product
A practical guide for SaaS founders and engineers on adding meeting bot, transcription, and AI summary features without building the infrastructure yourself. Covers multi-tenant routing, user consent, and data privacy.
Gregnote Team
21 August 2026
Why meeting intelligence is worth adding
The best B2B SaaS products remove work from the user's day. Meeting intelligence — automatically capturing, transcribing, and summarising meetings relevant to your product — removes one of the most labour-intensive workflows in any knowledge work environment.
If you're building a CRM: imagine if every sales call was automatically logged, summarised, and attached to the contact record — without anyone taking notes.
If you're building a project management tool: imagine if every team meeting produced action items that flow directly into the backlog.
If you're building a recruiting tool: imagine if every interview had a timestamped transcript attached to the candidate's profile.
These aren't hypothetical — they're all achievable with a meeting API like Gregnote, a few hundred lines of code, and careful attention to consent and privacy.
The architecture
Adding meeting intelligence to a multi-tenant SaaS product requires four components:
- Meeting bot integration — A way for users to connect their calendar (Google Calendar, Outlook) so bots can join meetings automatically, or a manual "join this meeting" UI.
- Webhook handler — A backend endpoint that receives transcript events from Gregnote, routes them to the correct tenant, and triggers downstream processing.
- Processing pipeline — Takes the raw transcript and produces structured output (summary, action items, CRM fields, etc.) using an LLM.
- Storage and display — Stores the processed output and makes it accessible in your UI.
Step 1: Calendar integration
The best user experience is fully automatic: your bot joins every relevant meeting without the user needing to do anything per-meeting. This requires a calendar integration.
Using the Google Calendar API (or Microsoft Graph for Outlook), you can read the user's upcoming events and their meeting URLs:
// After user grants calendar OAuth scope:
const events = await calendar.events.list({
calendarId: "primary",
timeMin: new Date().toISOString(),
timeMax: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString(),
singleEvents: true,
});const meetingEvents = events.data.items?.filter( e => e.hangoutLink || e.location?.includes("meet.google.com") ); ```
For each upcoming meeting, schedule a bot to join using the Gregnote API.
The multi-tenant consideration: store the bot ID per meeting per user, and include the user's tenant ID in the webhook metadata so you can route the transcript back to the right account.
const bot = await fetch("https://api.gregnote.com/v1/bots", {
method: "POST",
headers: { Authorization: `Bearer ${GREGNOTE_API_KEY}` },
body: JSON.stringify({
meeting_url: event.hangoutLink,
bot_name: `${workspace.botName} Notetaker`,
webhook_url: `https://api.yourapp.com/hooks/gregnote`,
metadata: {
tenant_id: user.tenantId,
meeting_event_id: event.id,
user_id: user.id,
},
}),
});The metadata object is returned as-is in the webhook payload, making multi-tenant routing straightforward.
Step 2: Webhook routing
Your webhook handler needs to:
- Verify the Gregnote signature
- Extract the tenant ID from metadata
- Route the event to the tenant's processing queue
app.post("/hooks/gregnote", async (req, res) => {
verifySignature(req, process.env.GREGNOTE_WEBHOOK_SECRET!);
res.sendStatus(200);const { event, metadata } = req.body; if (event !== "meeting.completed") return;
await processingQueue.add("transcript", { tenantId: metadata.tenant_id, userId: metadata.user_id, meetingEventId: metadata.meeting_event_id, transcript: req.body.transcript, }); }); ```
Step 3: Processing pipeline
The processing step transforms a raw transcript into structured data your product can use. What that looks like depends entirely on your use case.
For a CRM:
``
const prompt =
You are processing a sales call transcript for a CRM.
Extract:
- Deal stage indicators (did they discuss pricing? next steps? objections?)
- Action items (who will do what by when)
- Key topics discussed
- Sentiment (positive/neutral/negative overall)
Format as JSON.
;
For a project management tool:
``
const prompt =
Extract all action items from this meeting transcript.
Each action item should have:
- assignee (person's name, or "team" if unclear)
- task (what needs to be done)
- due_date (if mentioned, in ISO format; null if not mentioned)
Return as a JSON array.
;
Pass the formatted transcript to your LLM of choice and parse the structured output.
Step 4: Consent and transparency
This is not optional. If you're building a product that joins other people's meetings, you have legal and ethical obligations around consent.
Minimum requirements: - The bot must be visible to all participants. Do not name it something deceptive that hides its purpose. "Notetaker" or "[Your Product] Bot" are fine; "Meeting Participant 4" is not. - Users must be able to opt out individual meetings from being recorded. - Participants who are not your customers must have some way to know recording is happening. - Store transcripts only as long as necessary for your product's purpose. Give users the ability to delete them.
Jurisdiction considerations: In many US states, at least one party's consent is sufficient to record a conversation. In the EU, GDPR requires a legitimate interest or explicit consent from all parties. In the UK, PECR and data protection regulations apply. If you're building a product for enterprise use, expect your legal team to have a lot of questions.
The safest approach for a new product: make the recording and transcription optional, clearly labelled, and easily disabled by the meeting organiser.
Step 5: Displaying transcripts in your UI
A few patterns that work well:
Timestamped transcript view: Show the full transcript with timestamps and speaker labels, searchable. Essential for any use case where users need to find a specific quote.
Summary card: A collapsed view with the LLM-generated summary, expanded to full transcript on click. Good for browse-first workflows.
Action items sidebar: A list of extracted action items with checkbox controls, linked to the relevant transcript segment. Best for project management and task-tracking use cases.
Auto-populated fields: For CRMs, use the LLM output to auto-fill deal fields (deal stage, next step, competitor mentioned) that would otherwise require manual entry.
Pricing considerations
Gregnote charges £0.50 per hour of captured audio. For a typical B2B SaaS product where users average 4 hours of meetings per week, that's £2/user/week or ~£8.50/user/month.
You need to decide whether to absorb this cost in your subscription price or pass it through. For products where meeting intelligence is core to the value proposition, absorb it — it's table stakes. For products where it's an optional add-on, consider metering it.
Related reading
For the technical details of webhook handling at scale, see webhook reliability patterns. For what product teams actually find useful from meeting AI, see AI meeting notes for product teams.
Try it yourself
API key in 30 seconds. Free credit on sign-up. No card required.