Create LinkedIn post drafts from Fireflies meetings with GPT-4o-mini, Drive and Slack
### Description
Connect Fireflies to this workflow once and every meeting you record becomes a LinkedIn post draft automatically. The moment Fireflies finishes transcribing a call, it fires a signal to the workflow ā which fetches the full transcript, extracts real insights, and uses GPT-4o-mini to write a 180ā280 word scroll-stopping post with a hook, key learnings, and hashtags. The finished draft is saved to Google Drive and previewed in Slack so you can review and publish when ready. Built for founders, consultants, and sales leaders who want a consistent LinkedIn presence without spending time writing from scratch after every call.
---
## What This Workflow Does
- **Triggers automatically when a call ends** ā Fireflies sends a signal the moment transcription completes, so no manual input is ever needed
- **Validates every incoming signal** ā Checks that the signal contains a valid meeting ID and silently discards invalid or test pings
- **Extracts real meeting insights** ā Pulls speaker dialogue, Fireflies-detected pricing and question sentences, keywords, overview, and sentiment from the full transcript
- **Writes a structured LinkedIn post** ā GPT-4o-mini produces a hook, a specific insight paragraph, 3ā5 emoji learnings, a closing question, and hashtags ā all grounded in your actual meeting content
- **Saves a complete Google Doc** ā Stores the post alongside meeting reference details, participants, keywords, action items, and a link back to the Fireflies transcript
- **Previews the post in Slack** ā Posts the first 350 characters of the draft to your Slack channel so your team can review before the post goes live
- **Exits cleanly for incomplete transcripts** ā If Fireflies hasn't finished processing yet, the workflow stops silently without errors
---
## Setup Requirements
### Tools Needed
- n8n instance (self-hosted or cloud)
- Fireflies.ai account with webhook access
- OpenAI account with GPT-4o-mini API access
- Google Drive (one folder where posts will be saved)
- Slack workspace with OAuth2 app configured
### Credentials Required
- Fireflies API key (pasted directly into **5. Set ā Config Values**)
- OpenAI API key
- Google Drive OAuth2
- Slack OAuth2
**Estimated Setup Time: 15ā20 minutes**
---
## Step-by-Step Setup
1. **Import the workflow** ā Open n8n ā Workflows ā Import from JSON ā paste the workflow JSON ā click Import
2. **Activate the workflow and copy the webhook URL** ā Toggle the workflow to Active ā click on node **1. Webhook ā Fireflies Transcript Done** ā copy the webhook URL shown
3. **Register the webhook in Fireflies** ā Log in to fireflies.ai ā go to Settings ā Developer Settings ā Webhooks ā paste the webhook URL ā save
4. **Get your Fireflies API key** ā In Fireflies, go to Settings ā Integrations ā copy your API key
5. **Fill in Config Values** ā Open node **5. Set ā Config Values** ā replace all placeholders:
| Field | What to enter |
|---|---|
| `YOUR_FIREFLIES_API_KEY` | Your Fireflies API key from step 4 |
| `YOUR_GOOGLE_DRIVE_FOLDER_ID` | The folder ID from your Google Drive URL (the string after `/folders/` in the URL when you open the folder) |
| `#content-team` | Your Slack channel name including the `#` |
| `YOUR FULL NAME` | The author's full name (used in the post sign-off) |
| `YOUR JOB TITLE` | The author's job title (e.g. CEO, SEO Consultant) |
| `YOUR COMPANY NAME` | Your company name (used in the AI prompt) |
6. **Connect OpenAI** ā Open node **11. OpenAI ā GPT-4o-mini Model** ā click the credential dropdown ā add your OpenAI API key ā test the connection
7. **Connect Google Drive** ā Open node **13. Google Drive ā Save LinkedIn Post** ā click the credential dropdown ā add Google Drive OAuth2 ā sign in with your Google account ā authorize access
8. **Connect Slack** ā Open node **14. Slack ā Send Post Preview** ā click the credential dropdown ā connect your Slack workspace via OAuth2 ā invite the n8n bot to your channel in Slack (`/invite @n8n`)
> ā ļø **The workflow must be Active before registering the webhook in Fireflies.** An inactive workflow will not receive signals from Fireflies. Activate first, then paste the URL.
---
## How It Works (Step by Step)
**Step 1 ā Webhook: Fireflies Transcript Done**
This step listens for a signal from Fireflies. Every time Fireflies finishes transcribing a meeting, it sends a POST request to this webhook URL containing the meeting ID. No manual trigger is needed ā it fires automatically after every recorded call.
**Step 2 ā Code: Extract Meeting ID**
The meeting ID is extracted from the incoming signal. Fireflies can send the payload in several different formats, so this step checks all possible locations and pulls the ID safely. If no meeting ID is found at all, a flag is set to mark the signal as invalid.
**Step 3 ā IF: Valid Meeting ID?**
This is the first gate check. If a valid meeting ID was found (YES path), the workflow continues to fetch the transcript. If the signal was invalid or contained no meeting ID (NO path), the workflow routes to **4. Set ā Invalid Webhook Skip** and stops cleanly.
**Step 4 ā Set: Invalid Webhook Skip**
This step handles the invalid signal case. It sets a brief message confirming the webhook was skipped and the workflow ends here for that trigger.
**Step 5 ā Set: Config Values**
Your Fireflies API key, Google Drive folder ID, Slack channel, author name, author title, and company name are stored here. The validated meeting ID from step 2 is also carried forward so the transcript fetch can use it directly.
**Step 6 ā HTTP: Fetch Transcript**
A request is sent to the Fireflies API using your API key and the meeting ID. It retrieves the complete transcript including all sentences with speaker labels, AI-detected pricing and task sentences, keyword summary, overview, gist, bullet points, and sentiment percentages.
**Step 7 ā Code: Process Transcript Data**
The raw transcript is processed into clean, usable fields. All sentences are combined into a readable text block (limited to 5,000 characters for GPT efficiency). Fireflies-flagged pricing sentences, question sentences, and task sentences are extracted separately. Sentiment percentages, keywords, action items, and overview are all pulled out. A formatted document title is generated automatically using the meeting name and date. If the transcript is empty or not yet available, a flag is set for the next gate check.
**Step 8 ā IF: Transcript Ready?**
This is the second gate check. If transcript data is available (YES path), the workflow moves to AI post writing. If Fireflies hasn't finished processing the transcript yet (NO path), the workflow routes to **9. Set ā Transcript Not Ready Skip** and stops cleanly without errors.
**Step 9 ā Set: Transcript Not Ready Skip**
This step handles the not-ready case. It logs the meeting ID and a message confirming the transcript was skipped. The workflow ends here for that run.
**Step 10 ā AI Agent: Write LinkedIn Post**
GPT-4o-mini receives the author details, meeting context, Fireflies summary, bullet points, keywords, action items, questions raised in the call, and the transcript excerpt. It writes a 180ā280 word LinkedIn post following a fixed structure: a scroll-stopping hook (not starting with "I" or "We"), a specific insight paragraph in first person, 3ā5 emoji key learnings pulled from real transcript content, a closing question or call to action, and 4ā5 hashtags. A sign-off with the author's name and title is added at the end.
**Step 11 ā OpenAI: GPT-4o-mini Model**
This is the language model powering the writing step. It runs at temperature 0.8 for creative, varied output and is capped at 700 tokens to keep the post within the target word count.
**Step 12 ā Code: Build Doc and Slack Message**
The AI-generated post is assembled into a complete Google Doc with the post text at the top, followed by meeting reference details: title, date, duration, participants, Fireflies transcript link, keywords, and action items. A Slack preview is also built here ā the first 350 characters of the post plus meeting details and a link back to the Fireflies transcript.
**Step 13 ā Google Drive: Save LinkedIn Post**
The complete document is saved to your specified Google Drive folder. The file is named automatically using the meeting title and date (e.g. "LinkedIn Post ā Client Strategy Call ā 14 Apr 2025").
**Step 14 ā Slack: Send Post Preview**
The preview message is posted to your Slack channel at the same time the Google Doc is being saved. Your team sees the post hook and first paragraph instantly, with the full document link available in Drive for review before publishing.
---
## Key Features
ā
**Fully automatic ā zero manual trigger** ā Fireflies fires the workflow the moment any call transcript is ready, no human action needed
ā
**Two validation gates** ā Invalid webhook signals and unready transcripts both exit cleanly without causing errors or empty posts
ā
**Grounded in real content** ā The AI prompt feeds actual transcript sentences, keywords, bullet points, and action items so posts are specific, not generic
ā
**Fixed post structure every time** ā Hook, insight paragraph, emoji learnings, closing CTA, hashtags, and sign-off are enforced on every run
ā
**Auto-named Google Docs** ā Files are named by meeting title and date automatically so your Drive folder stays organized without any manual renaming
ā
**Slack preview before publishing** ā Your team sees the draft before it goes live ā one review step, no surprises
ā
**Handles all Fireflies payload formats** ā The extraction step checks every possible payload structure so the webhook never silently fails due to a format change
ā
**Temperature tuned for creative writing** ā GPT runs at 0.8 so each post has a natural, human tone rather than a repetitive AI pattern
---
## Customisation Options
**Change the post length target** ā In node **10. AI Agent ā Write LinkedIn Post**, edit the instruction from "180 to 280 words" to a different range. Also adjust `maxTokens` in node **11. OpenAI ā GPT-4o-mini Model** accordingly (e.g. set to 900 for longer posts).
**Add a second post format** ā After node **10. AI Agent ā Write LinkedIn Post**, add a second AI Agent step with a different prompt structure (e.g. a short 3-sentence insight post or a carousel-style numbered list) to generate two post options per call instead of one.
**Route posts by meeting type** ā In node **5. Set ā Config Values**, add a `postCategory` field. Then add an IF check after step 7 that reads the meeting title ā if it contains "demo" or "sales", use a sales-focused prompt; if it contains "team" or "internal", use a thought leadership prompt.
**Save to a dated subfolder in Drive** ā In node **12. Code ā Build Doc and Slack Message**, generate a folder path string using the meeting date (e.g. `2025/April`) and use the Google Drive step to create or find that subfolder before saving, keeping your Drive organized by month automatically.
**Add a Notion database entry** ā After node **13. Google Drive ā Save LinkedIn Post**, add a Notion API HTTP request to create a new row in a content calendar database with the post title, meeting date, status (Draft), and Google Drive link for content planning visibility.
---
## Troubleshooting
**Workflow not triggering when a call ends:**
- Confirm the workflow is Active before expecting Fireflies to fire it ā inactive workflows do not receive webhooks
- Log in to Fireflies ā Settings ā Developer Settings ā Webhooks ā confirm the webhook URL is saved correctly and matches the URL from node **1. Webhook ā Fireflies Transcript Done**
- Check that your Fireflies plan includes webhook support ā some plans restrict this feature
**Fireflies API key error or empty transcript:**
- Confirm `YOUR_FIREFLIES_API_KEY` in node **5. Set ā Config Values** is replaced with your actual key ā not the placeholder text
- Get your key from fireflies.ai ā Settings ā Integrations ā API Key
- If the transcript returns empty, the call may not have been processed yet by Fireflies ā the workflow exits cleanly via **9. Set ā Transcript Not Ready Skip** in this case
**OpenAI not generating the post:**
- Confirm the API key is connected in node **11. OpenAI ā GPT-4o-mini Model** and your account has available credits
- Check the execution log of node **10. AI Agent ā Write LinkedIn Post** for the raw error message
- If the post is under 50 characters, node **12. Code ā Build Doc and Slack Message** catches this and outputs a failure message instead of a broken doc
**Google Drive not saving the file:**
- Confirm the Google Drive OAuth2 credential in node **13. Google Drive ā Save LinkedIn Post** is connected and not expired ā re-authorize if needed
- Check that `YOUR_GOOGLE_DRIVE_FOLDER_ID` in node **5. Set ā Config Values** is the folder ID from your Drive URL, not the full URL ā copy only the string after `/folders/`
- Make sure the Google account you authorized has write access to the target folder
**Slack preview not arriving:**
- Confirm the Slack OAuth2 credential in node **14. Slack ā Send Post Preview** is connected and authorized
- Check that the channel name in node **5. Set ā Config Values** includes the `#` prefix and matches your Slack channel exactly
- Type `/invite @n8n` in the target Slack channel to ensure the bot has permission to post
---
## Support
Need help setting this up or want a custom version built for your team or agency?
š§ Email: [[email protected]]([email protected])
š Website: [https://www.incrementors.com/](https://www.incrementors.com/)