Product Hunt to Google Sheets, leads ready to contact
Manually digging through Product Hunt is a time sink. You find a promising launch, open five tabs, copy a name, hunt for a founder email, then lose track of what you already checked.
This is where Product Hunt leads automation helps. SaaS founders use it to line up partnerships fast. Agency owners use it to spot brands that just launched and need help. Growth marketers feel it too, because outreach is only “easy” once the list is clean.
This workflow turns daily launches into a structured Google Sheet with real contact fields, deduped and ready. You’ll see how it works, what you need, and what to watch for.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Product Hunt to Google Sheets, leads ready to contact
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare CC", pos: "b", h: 48 }
n1@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger1", pos: "b", h: 48 }
n2["<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/code.svg' width='40' height='40' /></div><br/>Build Config2"]
n3@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Schedule Trigger2", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Fetch Webhook Status2", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Webhook Exists2", pos: "b", h: 48 }
n6["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Create External Webhook2"]
n7@{ icon: "mdi:cog", form: "rounded", label: "Mark Webhook as Created2", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Weekly Run (Monday)2", pos: "b", h: 48 }
n9["<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/code.svg' width='40' height='40' /></div><br/>Combine Run IDs2"]
n10@{ icon: "mdi:cog", form: "rounded", label: "Store Run Data2", pos: "b", h: 48 }
n11["<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/webhook.dark.svg' width='40' height='40' /></div><br/>Receive Apify Webhook2"]
n12@{ icon: "mdi:cog", form: "rounded", label: "Fetch RUNS Data2", pos: "b", h: 48 }
n13["<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/code.svg' width='40' height='40' /></div><br/>Update Run Status2"]
n14@{ icon: "mdi:cog", form: "rounded", label: "Save Updated RUNS Data1", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Extract Dataset IDs2"]
n16@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Switch", pos: "b", h: 48 }
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Run Actor 'Daily Top Product.."]
n18["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Run Actor 'Weekly Top Produc.."]
n19@{ icon: "mdi:database", form: "rounded", label: "Create Daily Log Sheet2", pos: "b", h: 48 }
n20["<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/code.svg' width='40' height='40' /></div><br/>Extract Sheet Info2"]
n21@{ icon: "mdi:cog", form: "rounded", label: "Store Sheet Metadata2", pos: "b", h: 48 }
n22@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Sub Items2", pos: "b", h: 48 }
n23["<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/code.svg' width='40' height='40' /></div><br/>Map Category by Topic2"]
n24["<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/code.svg' width='40' height='40' /></div><br/>Prepare Request Body2"]
n25@{ icon: "mdi:cog", form: "rounded", label: "Get Sheet Metadata2", pos: "b", h: 48 }
n26["<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/code.svg' width='40' height='40' /></div><br/>Parse Sheet IDs2"]
n27@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check if Skipped2", pos: "b", h: 48 }
n28["<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/code.svg' width='40' height='40' /></div><br/>Prepare Error Row2"]
n29["<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/code.svg' width='40' height='40' /></div><br/>Format API Result for Sheet2"]
n30@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Owner Email Exists2", pos: "b", h: 48 }
n31@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Verify Email Sent Successful..", pos: "b", h: 48 }
n32@{ icon: "mdi:database", form: "rounded", label: "Log API Result to Google She..", pos: "b", h: 48 }
n33["<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/code.svg' width='40' height='40' /></div><br/>Summarize Daily Stats2"]
n34@{ icon: "mdi:database", form: "rounded", label: "Log Daily Summary to Sheet2", pos: "b", h: 48 }
n35@{ icon: "mdi:database", form: "rounded", label: "Get Daily Activities to Sheet2", pos: "b", h: 48 }
n36@{ icon: "mdi:cog", form: "rounded", label: "Aggregate Batch Results2", pos: "b", h: 48 }
n37@{ icon: "mdi:cog", form: "rounded", label: "Clear Old Run Data2", pos: "b", h: 48 }
n38["<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/code.svg' width='40' height='40' /></div><br/>Prepare Scraper Payload1"]
n39["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Get Contact Scraper1"]
n40["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>HTTP Request"]
n41@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n42@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If1", pos: "b", h: 48 }
n43@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message", pos: "b", h: 48 }
n44["<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/code.svg' width='40' height='40' /></div><br/>Handle Email Failed"]
n45["<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/code.svg' width='40' height='40' /></div><br/>Handle Email Success"]
n46["<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/code.svg' width='40' height='40' /></div><br/>Handle No Email"]
n47["<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/code.svg' width='40' height='40' /></div><br/>Deduplicate2"]
n48["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Dataset Items2"]
n41 --> n23
n41 --> n22
n42 --> n24
n42 --> n22
n16 --> n15
n0 --> n43
n47 --> n22
n40 --> n41
n40 --> n22
n2 --> n3
n43 --> n31
n46 --> n32
n9 --> n10
n12 --> n13
n26 --> n27
n27 --> n28
n27 --> n29
n1 --> n2
n28 --> n32
n13 --> n14
n20 --> n21
n25 --> n26
n44 --> n32
n15 --> n48
n48 --> n47
n39 --> n42
n45 --> n32
n22 --> n36
n22 --> n40
n5 --> n8
n5 --> n6
n4 --> n5
n24 --> n25
n23 --> n38
n11 --> n2
n33 --> n34
n3 --> n4
n3 --> n19
n3 --> n12
n19 --> n20
n14 --> n16
n36 --> n35
n6 --> n7
n7 --> n8
n38 --> n39
n30 --> n0
n30 --> n46
n8 --> n18
n8 --> n17
n34 --> n37
n29 --> n30
n35 --> n33
n32 --> n22
n17 --> n9
n31 --> n44
n31 --> n45
n18 --> n17
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 n1 trigger
class n3,n5,n8,n16,n27,n30,n31,n41,n42 decision
class n19,n32,n34,n35 database
class n6,n11,n17,n18,n39,n40,n48 api
class n2,n9,n13,n15,n20,n23,n24,n26,n28,n29,n33,n38,n44,n45,n46,n47 code
classDef customIcon fill:none,stroke:none
class n2,n6,n9,n11,n13,n15,n17,n18,n20,n23,n24,n26,n28,n29,n33,n38,n39,n40,n44,n45,n46,n47,n48 customIcon
The Problem: Product Hunt research doesn’t scale
Product Hunt is full of buyer intent, but it’s messy to turn that into outreach. You can scroll the daily list, sure. The painful part comes next: collecting product details, figuring out who built it, and finding a reliable way to contact them without duplicating your work. After a week, your “list” is scattered across bookmarks, notes, and half-filled sheets. Even worse, you message the same maker twice because you didn’t notice you already captured that launch last month.
It adds up fast. Here’s where it breaks down in real life.
- Pulling 50 products a day is doable, but enriching contact details for each one turns into an all-morning task.
- Your spreadsheet gets noisy because people copy slightly different names, URLs, and social handles.
- Manual deduplication is fragile, so teams either delete good leads or keep duplicates and annoy founders.
- Outreach slips, because the list isn’t “ready” until someone cleans it up.
The Solution: Auto-scrape launches, enrich contacts, and export to Sheets
This workflow runs on a schedule (daily at 9 AM, plus a weekly Monday run if you want it) and collects Product Hunt launches automatically. It pulls the latest products, grabs the important launch context (name, tagline, categories, upvotes, maker details, URLs), then enriches each product with contact channels like emails and social profiles. As the data comes back, it gets cleaned and normalized so your output stays consistent. Finally, everything is written into Google Sheets in a structured format, with deduplication logic so your sheet doesn’t slowly rot over time. If you enable the outreach portion, it can even draft and send personalized emails via Gmail API using the product’s details.
The workflow starts with a timed run or webhook-driven processing once scrape jobs finish. It then batches through products, enriches contact fields, and merges results into a single “lead row” per product. Google Sheets becomes your source of truth, and optional Gmail outreach turns the sheet into action.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you want to prospect from 50 launches a day. Manually, even “quick research” is maybe 5 minutes per product to copy details, find a contact, and log it, which is about 4 hours daily. With this workflow, the daily run happens automatically at 9 AM and your only manual step is reviewing the sheet and choosing who to contact, maybe 20 minutes. You get the same lead volume, but your effort shifts from data entry to decision-making.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for the lead list and sharing.
- Apify to scrape Product Hunt and enrich contacts.
- OpenAI API key (get it from the OpenAI API dashboard) for AI enrichment and drafting.
Skill level: Intermediate. You’ll connect accounts, map spreadsheet columns, and tweak a few workflow parameters like “top N” products and batch sizes.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled run kicks it off. At 9 AM, the workflow triggers a scrape for the latest Product Hunt launches, and a separate weekly run can capture the best performers from the prior week.
Scraped data gets normalized. Product names, URLs, maker details, categories, and engagement metrics are shaped into consistent fields so your sheet stays readable.
Contact enrichment happens in batches. The workflow loops through products, calls enrichment steps to discover public contact channels, then uses AI where helpful (for example, to summarize or draft outreach text).
Clean output lands in Google Sheets. Rows are deduplicated, merged, and written into your spreadsheet. If you enable outreach, Gmail API can send personalized messages using your template and the product context.
You can easily modify the scrape volume and filters to target only certain categories or only higher-signal launches. See the full implementation guide below for customization options.
Common Gotchas
- Google Sheets access can fail if the connected Google account loses permission. If rows stop writing, check the n8n credential and the target Sheet sharing settings 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 45 minutes if your Apify and Google accounts are ready.
No. You’ll mostly connect accounts and map fields to your Google Sheet.
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 Apify usage (often around $40 to $60/month) and OpenAI API costs (usually a few dollars unless you draft lots of emails).
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, but you’ll want to do it at the source. Adjust the Apify scraper configuration to filter by category, then keep the same Google Sheets mapping so your columns don’t change. Common customizations include changing “top N” products, switching from daily to twice-daily, and adding a “minimum upvotes” filter so the sheet stays high-signal.
Most of the time it’s an expired Google credential in n8n or the Sheet was moved to a Drive folder the connected account can’t access anymore. Reconnect the Google Sheets credential, then confirm the spreadsheet ID and worksheet tab still exist. If it fails only on bigger runs, you may also be hitting write limits, so batching (and fewer “update row” calls) usually fixes it.
For the default setup, expect about 50 leads per day plus a weekly top-100 capture, so roughly 1,900 rows per month. On n8n Cloud, your limit is tied to your plan’s monthly executions, and the Pro plan supports higher volume. If you self-host, there’s no fixed execution cap, but Apify quotas and your server resources will become the real limit.
Often, yes. This workflow relies on scraping/enrichment, batching, deduplication, and optional AI drafting, which gets expensive or awkward in simpler automation tools. n8n also gives you a self-hosting path, which frankly matters once you’re running daily at scale. Zapier or Make can still be fine for “capture one launch, send one alert” style automations. If you’re unsure, Talk to an automation expert and you’ll get a straight answer for your use case.
Once this is running, your sheet stays fresh without someone babysitting it. The workflow handles the repetitive parts so you can focus on picking the right leads and sending smart outreach.
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.