Source: raw/I_Built_an_AI_System_That_Automates_My_Proposals_n8n_+_Gamma.md, raw/How_I_INSTANTLY_Generate_Proposal_Decks_with_n8n_AI_Agents.md
Nate Herk (UpAI) walks through an n8n workflow that turns a finished sales call into a polished Gamma slide-deck proposal. Fireflies records the call, n8n logs the meeting, a Slack human-in-the-loop step asks whether to draft a deck, and an AI agent rewrites the transcript into a structured proposal that Gamma renders into shareable slides. The two videos cover the same system at different depths — the longer details every node, prompt, and Gamma API parameter; the shorter is a faster walkthrough of the same flow.
Key Takeaways
- Two-workflow split, not one monolith. Workflow 1 logs the meeting; workflow 2 generates the deck on demand. Herk argues this scales better — meeting-end events can route to different downstream paths (proposal, minutes, follow-up email) without entangling deck logic.
- Fireflies is the transcript source. The webhook fires on
transcription complete, but the body only contains a meeting ID and event type. A second Fireflies API call retrieves the transcript plus AI-summary fields. - Polling loop handles AI-summary lag. Fireflies’ AI summary (gist, action items, bullets) finishes after the raw transcript. Wait → fetch → IF check → loop until the gist exists.
- Human approval via Slack. A
Send and Waitnode asks “Generate a proposal?” before any AI tokens are spent. Yes routes to the agent; no updates the Sheet status togeneration declined. - Gamma renders the deck. One HTTP POST to Gamma’s
/generateendpoint withtext_mode: preserve, a custom theme ID, and the agent’s output asinput_textproduces a shareable deck and emails the link. - 90% draft, not 100%. Herk explicitly says: never auto-send. Charts misalign, road-map weeks are guessed, case-study slots need manual fill.
- Standardization layer. A “set” node consolidates variables (transcript, meeting ID) from either the auto path or a manual form-submission path so downstream nodes reference one source.
The Pipeline
Workflow 1 — Meeting logger (auto-triggered):
- Fireflies webhook — paste the n8n production URL into Fireflies developer settings, toggle
transcription complete. Fires when a call ends. - Wait node — buys time for Fireflies’ AI summary to finish.
- Fireflies HTTP request — GET meeting by ID. Returns sentences array (the transcript), title, host email, keywords, and AI-generated summary fields (gist, bullet points, action items, overview).
- IF node — checks whether
summary.gistexists. If false, loops back to the wait node (polling pattern). If true, proceeds. - Code node — speakers cleanup — extracts a deduplicated array of speakers from the sentences JSON. Herk’s method: paste incoming JSON into Claude, ask it to write the n8n code node, iterate until it works.
- Google Sheets append — writes a new row: date, title, attendees, AI gist, status (
NA), meeting ID.
Workflow 2 — Deck generator (triggered on new sheet row OR manual form submission):
- Trigger — Google Sheets row-added event, OR an n8n form node where you paste a meeting ID manually (covers “I declined earlier but now I want one”).
- Fireflies HTTP request — re-fetch full meeting info. A
limitnode keeps only the last item as a guardrail against simultaneous meeting endings. - Code node — transcript cleanup — outputs
Speaker Name: lineformatted text, only printing the speaker label when it changes. - Set node — variable standardization — consolidates
transcriptandmeeting_idfrom whichever upstream path actually executed. Herk calls this the “C node” that abstracts over A or B. - Slack
Send and Wait— “Your meeting [title] just concluded. Generate proposal?” Yes proceeds; no updates sheet status togeneration declined. - Proposal agent — system prompt establishes the agent as “expert senior AI solutions consultant and sales engineer.” Constraints: client-facing, no follow-up questions, never mention AI/automation, confident assumptions when data is missing, placeholders for unknowns. Required output structure: title page → executive summary → problem & challenge → proposed solution → ROI → soft/intangible benefits → implementation roadmap → success metrics → “Why choose [agency]” advocacy.
- Gamma HTTP POST to the
/generateendpoint. Headers:X-API-KEY,Content-Type: application/json. Body fields:input_text(agent output, with a JS replace stripping newlines/quotes that would break JSON),text_mode: preserve(don’t let Gamma re-summarize),theme_id(copied from Gamma’s UI via “copy theme ID for API”), text amount/tone/audience filters, image source/model filters,share_settingsfor auto-emailing the link. - Slack notification — “Your gamma deck is being generated.”
- Google Sheets update — match on meeting ID, set status to
generated.
The output deck includes ROI numerics (Herk’s demo: “350+ hours saved annually, $28K cost savings, 0% error rate”), a with/without-automation comparison graphic (sometimes broken — needs human edit), an implementation roadmap (week counts are guessed), and a closing case-study slide Herk suggests wiring to a project database for true personalization.
Try It
- Map the prompt to your service. The proposal structure (exec summary → problem → solution → ROI → roadmap → metrics → why-us) is generic to consultancy work. For a dental marketing agency, swap in: marketing audit → program (SEO, ads, content, video) → projected lead/case lift → 90-day rollout → KPIs → why-us with case studies.
- Replace Fireflies with Zoom if calls record there — Zoom’s API exposes transcripts via
recordings_list, and the same polling-for-AI-summary pattern applies. - Pre-load case studies into a Google Sheet or vector DB and let the agent retrieve the most relevant ones for the closing slide. Herk flags this as the highest-impact next step.
- Always edit before sending. Road-map week counts and ROI deltas are agent guesses; charts sometimes mislabel. Build a human review step into the SOP.
- WEO Marketly fit: strong for first-draft proposals after discovery calls — the structure maps cleanly onto dental marketing engagements. Risk is the AI inventing numbers (case-acquisition lift, hours saved). Use it for structure and tone; fill numbers manually from real WEO case data.