All work

WORKFLOW TEARDOWN

Outbound Reporting Engine

A form kicks off a 46-node n8n pipeline that pulls campaign data from Instantly or HeyReach, has an LLM write the client report, and delivers it as a Google Doc in Slack.

Scale
46 nodes
Context
Built as internal tooling for FullFunnel, a Boston-based GTM agency
n8nInstantlyHeyReachGeminiOpenRouterGoogle DriveGammaSlack
Workflow · form to delivered report (46 nodes)
Report requestformcampaign + datesPlatform?IF branchInstantly APIcampaigns · analyticsaccounts · leadsHeyReach APIstats · inboxLinkedIn sendersMerge +code shapingone payloadGemini 2.5 Pro9-section reportOpenRouter fallbackGoogleDocGammadeckSlackdeliverycampaign not found → Slack alert

// stage.on.canvas

Personal / outbound-reporting (production)EditorExecutionsForm in, report out.46 nodes in production.Same prompt on both models.A provider outage never skips a report.New Report Requestform triggerWorkflow ConfigsetPlatform?IFInstantly pullscampaigns · analyticsHeyReach pullsstats · inboxMerge Report DatacodeReporting AI Agent9-section reportGemini 2.5 ProOpenRouter fallbackCreate Google DocGamma deckwait + retrySend to SlackExecute workflow
CANVAS RECREATED FROM THE PRODUCTION EXPORT · NODE LABELS GENERALIZED

// stage.it.does

An account manager fills a short form: which platform, which campaign, what date range. That is the whole interface. Everything after the submit button is automation.

The workflow branches by platform. The Instantly branch pulls campaigns, analytics, sending accounts, and leads; the HeyReach branch pulls campaign stats, inbox activity, and LinkedIn sender accounts. A code node merges the raw responses into one structured payload: reply and bounce rates, audience breakdown by title and location, sender-account health, and the sequence steps as actually configured.

A Gemini 2.5 Pro agent turns that payload into a nine-section client report: executive summary, performance scorecard, campaign configuration, sequence review, audience breakdown, sender infrastructure, insights, recommended actions, appendix. The system prompt runs about 2,000 words and encodes the report format and KPI benchmarks, so every report reads the same no matter who requested it.

The finished report lands as a Google Doc, optionally as a Gamma presentation (wait-and-retry loops handle Gamma’s async generation), and the link posts to Slack. If the requested campaign does not exist, a per-platform error path posts a Slack alert instead of producing an empty report.

// stage.engineering.decision

A fallback model wired in from day one

Chose: Duplicate LLM nodes: Gemini 2.5 Pro primary, OpenRouter fallback

Over: One model and a retry loop

Client reporting cannot skip a cycle because one provider has an outage or retires a model. The fallback path runs the same 2,000-word prompt against OpenRouter, so the report still ships. Retries fix transient errors; they do nothing for a deprecated model.

// stage.results

  • One form submission replaces the manual reporting cycle: data pull, analysis, narrative, formatting, delivery.
  • Reports follow one fixed nine-section structure, so clients get comparable reporting period over period regardless of platform.
  • Campaign-not-found errors alert in Slack on a dedicated path per platform; the failure mode is a message, never a wrong report.
Download the starter template (7-node JSON)