Perplexity to Google Sheets, Dream 100 prospects ready
Prospecting research gets messy fast. You open 20 tabs, copy names into a doc, lose half the sources, then still aren’t sure you’re targeting the right companies.
This Perplexity Sheets automation hits marketers building outbound lists hardest, but founders validating a niche and consultants hunting “right fit” accounts feel it too. You give it a plain-English ICP brief and it gives you a usable Dream 100 list in a Google Sheet.
Below you’ll see how the workflow works, what you’ll need, what outcomes to expect, and the gotchas that usually trip people up.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Perplexity to Google Sheets, Dream 100 prospects ready
flowchart LR
subgraph sg0["Chat Intake Flow"]
direction LR
n0@{ icon: "mdi:robot", form: "rounded", label: "Research Orchestrator", pos: "b", h: 48 }
n1@{ icon: "mdi:brain", form: "rounded", label: "OpenRouter Dialogue Model", pos: "b", h: 48 }
n2@{ icon: "mdi:play-circle", form: "rounded", label: "Chat Intake Trigger", pos: "b", h: 48 }
n3@{ icon: "mdi:memory", form: "rounded", label: "Session Memory Buffer", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Capture Chat Input", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Repeat Prompt Builder", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route Valid Prompt", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "Fetch First Row", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "Fetch Last Row", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Store First Name", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Sheet Empty", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Sheet Completion", pos: "b", h: 48 }
n12@{ icon: "mdi:robot", form: "rounded", label: "Request More Details", pos: "b", h: 48 }
n13@{ icon: "mdi:robot", form: "rounded", label: "Send Completion Note", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Store Last Name", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Perplexity Research Tool", pos: "b", h: 48 }
n19@{ icon: "mdi:database", form: "rounded", label: "Upsert Sheet Records", pos: "b", h: 48 }
n0 --> n7
n14 --> n10
n3 -.-> n0
n8 --> n14
n9 --> n8
n7 --> n9
n4 --> n6
n6 --> n0
n1 -.-> n0
n19 -.-> n0
n18 -.-> n0
n2 --> n4
n5 --> n6
n10 --> n12
n10 --> n11
n11 --> n5
n11 --> n13
end
subgraph sg1["Utility: Slack Message Flow"]
direction LR
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Utility: Slack Message Trigger"]
end
subgraph sg2["Flow 3"]
direction LR
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Utility: Slack Completion No.."]
end
subgraph sg3["Flow 4"]
direction LR
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Utility: Slack Request Details"]
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n2,n15 trigger
class n0,n12,n13 ai
class n1 aiModel
class n3 ai
class n6,n10,n11 decision
class n7,n8,n19 database
classDef customIcon fill:none,stroke:none
class n15,n17,n16 customIcon
The Problem: Dream 100 research turns into chaos
Creating a Dream 100 list sounds simple until you actually do it. You start with an ICP in your head, then you try to turn that into real companies and decision-makers, and suddenly it’s 2 hours later with a half-finished spreadsheet and a bunch of “maybe” prospects. The worst part is the mental load. You keep re-checking the same criteria, second-guessing what “ideal” means, and reformatting everything so it’s shareable. A list that should help you focus ends up feeling like busywork.
It adds up fast. Here’s where it breaks down in real life.
- You waste about 5 minutes per prospect just finding a credible source, copying details, and cleaning the formatting.
- As you refine your ICP, your earlier rows become outdated, so you redo research you already “finished.”
- Everyone ends up with their own version of the list in Notion, Sheets, or a CRM import file, which makes collaboration painful.
- Manual research encourages shortcuts, so you settle for low-quality prospects that look relevant but won’t convert.
The Solution: Turn an ICP brief into a Dream 100 sheet
This workflow turns your ideal customer description into a structured prospecting pipeline that ends in a clean Google Sheet. It starts with a chat-style intake (in n8n chat, and optionally Slack) where you describe your business and your “dream customer” in normal English. If your prompt is missing details, the agent asks clarifying questions and remembers what you already told it, so you don’t repeat yourself. Once the criteria are solid, the workflow generates targeted research prompts, sends them to Perplexity to search the web, then uses an LLM to format the results into consistent rows. Finally, it upserts those records into a Google Sheets template, so you can share it, filter it, and reuse the structure for the next niche.
The workflow kicks off from a chat intake message. The agent refines your criteria using session memory, then Perplexity gathers prospects from the web. After that, Google Sheets becomes the single source of truth with the latest Dream 100 entries.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you want a Dream 100 list of B2B SaaS companies in a specific niche. Manually, 100 prospects at roughly 5 minutes each is about 8 hours, and that’s before cleanup and deduping. With this workflow, you spend about 10 minutes describing your ICP and answering a couple of follow-ups, then wait while Perplexity research and formatting runs (often around 20 minutes). You’re done with the first pass in under an hour, and the output is already in Google Sheets.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store and share the Dream 100.
- Perplexity for web research and prospect discovery.
- OpenRouter API key (get it from your OpenRouter dashboard)
Skill level: Intermediate. You’ll connect a few accounts, paste API keys, and copy a Google Sheets template.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Chat intake starts the run. You send a short description of your business and the kind of company you want on your Dream 100 list. This can happen through the built-in chat trigger, and there are optional Slack nodes if you want to run it from Slack.
The agent checks if your brief is “good enough.” A switch routes valid prompts forward, and session memory keeps context across the conversation so the agent can ask for missing details without starting over.
Perplexity researches, then the LLM formats. The workflow generates a set of search prompts, calls Perplexity as the research tool, then uses the chat model to turn messy text into consistent fields you can actually sort and use.
Google Sheets becomes the output. The workflow checks the template’s first and last rows, decides whether the sheet is empty or complete, then upserts records so your Dream 100 stays tidy instead of turning into duplicates and half-rows.
You can easily modify the prospect fields to match your outreach process based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Chat Trigger
This workflow begins when a user sends a chat message into the system.
- Add and open Chat Intake Trigger.
- Keep Options → Response Mode set to
responseNodes(already configured). - Connect Chat Intake Trigger to Capture Chat Input as shown in the flow.
Step 2: Capture and Route the Incoming Message
These nodes store the user message and route it into the research flow.
- In Capture Chat Input, set the assignment User Chat Message to
{{ $json.chatInput }}. - Open Route Valid Prompt and keep both rules that check non-empty values:
{{ $json['Retrigger Chat'] }}and{{ $json['User Chat Message'] }}. - Ensure Route Valid Prompt outputs into Research Orchestrator (both output routes connect to the same node).
- In Repeat Prompt Builder, keep Retrigger Chat set to the full prompt string that requests the next batch of 10 prospects.
Step 3: Set Up the AI Research Orchestrator
The agent coordinates the chat model, research tools, and data writes.
- Open Research Orchestrator and set Text to
{{ $json['User Chat Message'] }} {{ $json['Retrigger Chat'] }}. - Verify Research Orchestrator uses the built-in system message that defines Dream 100 criteria (already configured).
- Open OpenRouter Dialogue Model and connect it as the language model for Research Orchestrator via the existing AI language model connection.
Credential Required: Connect youropenRouterApicredentials. - Open Session Memory Buffer to keep conversation context; no credentials needed. This memory connects to Research Orchestrator and should remain linked.
- Open Perplexity Research Tool and keep Model set to
sonar-deep-research.
Credential Required: Connect yourperplexityApicredentials.
Note: This tool is used by Research Orchestrator, so credentials are added here but consumed by the agent. - Open Upsert Sheet Records and keep Operation set to
appendOrUpdatewith Matching Columns set toProspect ID.
Credential Required: Connect yourgoogleSheetsOAuth2Apicredentials.
Note: This tool is invoked by Research Orchestrator, so ensure it stays connected as an AI tool.
Step 4: Connect Google Sheets for Prospect Tracking
The workflow checks the sheet for completion and appends or updates rows.
- In Fetch First Row, set Document to your sheet ID (replace
[YOUR_ID]) and Sheet toSheet1(gid=0). - Keep the filter in Fetch First Row set to Prospect ID =
1.
Credential Required: Connect yourgoogleSheetsOAuth2Apicredentials. - In Fetch Last Row, set the same Document and Sheet values and keep the filter Prospect ID =
100.
Credential Required: Connect yourgoogleSheetsOAuth2Apicredentials. - In Store First Name, set Prospect 1 to
{{ $json['Prospect Name'] }}. - In Store Last Name, set Prospect 100 to
{{ $json['Prospect Name'] }}. - Verify the execution flow: Research Orchestrator → Fetch First Row → Store First Name → Fetch Last Row → Store Last Name → Check Sheet Empty.
Step 5: Configure Conditional Logic and Chat Responses
These nodes handle empty or partially completed sheets and continue research cycles.
- In Check Sheet Empty, keep both conditions checking for empty values:
{{ $('Store First Name').item.json['Prospect 1'] }}and{{ $('Store Last Name').item.json['Prospect 100'] }}. - In Request More Details, set Message to
{{ $('Research Orchestrator').item.json.output }}and keep Wait User Reply set tofalse. - In Check Sheet Completion, keep the logic that checks
Prospect 1exists andProspect 100is empty. - Ensure Check Sheet Completion routes to Repeat Prompt Builder (for continuing research) and to Send Completion Note when the sheet is complete.
- In Send Completion Note, update the Message field from
=to a real completion message before production use.
=, the chat response will be blank. Replace it with a real confirmation string.Step 6: Configure Slack Utility Nodes (Optional)
These utility nodes can be used to request more details or notify completion in Slack.
- Open Utility: Slack Message Trigger and select the Channel ID you want to listen to.
- Open Utility: Slack Request Details and configure the message payload you want to send.
- Open Utility: Slack Completion Notice and configure the completion message content.
Step 7: Test and Activate Your Workflow
Validate the end-to-end flow before enabling it in production.
- Click Execute Workflow and send a sample chat message through Chat Intake Trigger.
- Confirm that Capture Chat Input populates User Chat Message and that Route Valid Prompt sends data to Research Orchestrator.
- Verify Fetch First Row and Fetch Last Row read from your sheet, and that Upsert Sheet Records writes or updates rows.
- Check that Request More Details or Send Completion Note posts a chat response based on sheet status.
- When everything works, toggle the workflow to Active to run it in production.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check the Google connection in n8n’s Credentials and confirm the spreadsheet is shared with the right Google account first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes if your APIs and Google account are ready.
No. You’ll mostly connect accounts, paste API keys, and copy the Google Sheets template.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Perplexity and OpenRouter usage, which depends on how many runs you do and how long your prompts are.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s the main reason this workflow is useful. You change the criteria in the chat intake, and the agent will generate different research prompts automatically. If you want stricter control, tweak the “Repeat Prompt Builder” and “Capture Chat Input” fields to force required items like region, company size, or tech stack. Many teams also adjust the Google Sheets columns to include an owner, status, and a first-touch message draft.
Most of the time it’s expired credentials or the wrong Google account connected in n8n. Reconnect Google Sheets in the Credentials section, then confirm the template sheet exists in that same Drive. Also check sharing settings if you copied a template from someone else. If failures happen only on bigger runs, it can be temporary API throttling, so rerun after a short pause.
A Dream 100 is the common target, and that’s well within reach on most setups.
Often, yes, because the “agent + memory + branching” logic is the whole point here, and n8n handles that kind of flow without turning it into an expensive pile of steps. You also get a real self-host option, which is handy if you plan to run research frequently or want more control over data handling. Zapier or Make can work if you only want a lightweight “send prompt, get response, write to sheet” setup, but you’ll usually lose the clarifying questions and the sheet-state checks that keep the output clean. Frankly, those details matter once you rerun the workflow a few times. Talk to an automation expert if you want help choosing the simplest option for your process.
A Dream 100 list should create momentum, not another research project. Set this up once, rerun it whenever your ICP shifts, and keep your team working from one clean sheet.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.