Promo seeker: Auto-find promo codes with SerpAPI, Gemini & Telegram
Go to WorkflowDescription
Never pay full price from ignorance again. Promo Seeker finds, verifies, and delivers active promo codes via Telegram or email using SerpAPI + Gemini (OpenRouter). A 2-hour manual hunt becomes a 5-minute query, with results deduplicated into an n8n Data Table for instant reuse.
Last updated: September 2026.
Why Use This Workflow?
Time Savings: Manual promo hunting drops from 2 hours to 5 minutes per query.
Cost Reduction: Less need for paid scraping tools or manual services. Potential savings of $50–$200/month.
Error Prevention: Cross-referenced sources plus a 30-day recency filter cut expired-code hits by ~60% versus single-source checks.
Scalability: Hundreds of queries per day with Data Table upserts and optional scheduling for continuous discovery.
Ideal For
Marketing / Growth Managers:** Quickly surface competitor or partner discounts to feature in campaigns.
Customer Support / Operations:** Answer code requests with verified promos via Telegram or email.
Affiliate / Content Teams:** Maintain a clean promo feed for newsletters or site widgets.
How It Works
Trigger: Incoming request via Webhook, Telegram message, Google Form submission, or scheduled run.
Data Collection: The LangChain agent uses SerpAPI search results and Gemini (OpenRouter) to locate recent promo codes.
Processing: Filter for recency (last 30 days), extract code, value, terms, and expiry.
Intelligence Layer: Gemini 2.5 Pro (OpenRouter) + LangChain agent structure and verify results, outputting standardized JSON.
Output & Delivery: If a code exists in the Data Table, notify the requester via Telegram and Gmail; otherwise, return results and upsert them into the Data Table.
Storage & Logging: Results stored and upserted in an n8n Data Table to prevent duplicates and enable fast lookups.
Setup Guide
Prerequisites
| Requirement | Type | Purpose |
|-------------|------|---------|
| n8n instance | Essential | Execute the workflow. Import the JSON and begin configuration |
| SerpAPI account | Essential | Web search results for promo code discovery |
| OpenRouter (Gemini) account | Essential | Language model (Gemini 2.5 Pro) for extraction and verification |
| Telegram Bot (BotFather) | Essential | Receive queries and send promo notifications |
| Gmail OAuth2 | Essential | Send rich email notifications |
| n8n Data Tables | Essential | Store and deduplicate promo code records |
Installation Steps
Import the JSON workflow into your n8n instance.
Configure credentials (use n8n's Credentials UI — do NOT paste keys into nodes):
SerpAPI: paste your SerpAPI API Key from your SerpAPI dashboard.
OpenRouter API: paste your OpenRouter API Key (for Gemini 2.5 Pro).
Telegram API: create bot via @BotFather, then add Bot Token to Telegram credentials.
Gmail OAuth2: use n8n's Gmail OAuth2 credential flow and authorize the account.
Update environment-specific values:
Webhook path: /v1/promo-seeker (configured in the Webhook node) or replace with your preferred path.
Data Table ID: point to your own Data Table
Form/webhook recipient fields (email/chatId mappings).
Customize settings:
Adjust the LangChain agent prompt (Promo Seeker Agent) for different recency windows or regional focus.
Change max results/limit on the Data Table node (default limit = 3).
Test execution:
Trigger via Telegram or a POST to the webhook with sample payload:
{ "platform":"example.com", "email":"[email protected]" }
Confirm notifications arrive and Data Table rows are upserted.
Technical Details
Core Nodes
| Node | Purpose | Key Configuration |
|------|---------|-------------------|
| SerpAPI | Fetch web search results | Provide credential; adjust search params in agent prompt |
| Gemini 2.5Pro (OpenRouter) | Extract & verify promo details | Use OpenRouter credential; model google/gemini-2.5-pro |
| Promo Seeker Agent (LangChain) | Orchestrates search + parsing | System prompt enforces 30‑day recency & result format |
| Structured Output Parser | Validates agent output | JSON schema example for platform/code/value/terms/validUntil |
| Data Table (Get row(s)) | Lookup existing promos | Filters by platform; limit = 3 |
| If (Code Exist?) | Branching logic | Checks existence of platform field |
| Data Table (Upsert row(s)) | Insert or update promo | Mapping from agent output to Data Table columns |
| Telegram Trigger / Telegram | Receive queries & notify users | Webhook-based trigger; parse_mode = HTML for messages |
| Gmail | Send rich HTML emails | Uses Gmail OAuth2 credential |
| Webhook / Form Trigger | Alternate inputs | Webhook path /v1/promo-seeker and Form trigger for manual submissions |
Workflow Logic
On trigger, the Platform Set node normalizes the incoming query and receiver.
Get row(s) checks Data Table for existing promos.
If found: notify via Telegram and send Gmail (email template included).
If not found: the Promo Seeker Agent runs SerpAPI searches, parses structured output, then Upsert row(s) saves results and notifications are sent.
Structured Output Parser enforces correct JSON to avoid bad upserts.
Customization Options
Basic Adjustments
Recency window: change the agent prompt to 7/14/30 days.
Result limit: increase Data Table Get limit or change Upsert batch size.
Advanced Enhancements
Add Slack or Microsoft Teams notifications (moderate complexity).
Add caching layer (Redis) to reduce repeated SerpAPI calls (advanced).
Parallelize searches across multiple search engines (higher API usage & complexity).
Performance & Optimization
| Metric | Expected Performance | Optimization Tips |
|--------|----------------------|-------------------|
| Execution time | 8–30s per new search (depends on SerpAPI + LM response) | Reduce SerpAPI page depth; cache recent results |
| API calls | 3–10 SerpAPI calls per complex query | Batch queries; use higher-quality search params |
| Error handling | Agent retries on malformed output | Use retry nodes and set onError strategy for downstream nodes |
Troubleshooting
| Problem | Cause | Solution |
|---------|-------|----------|
| No results returned | Query too vague or rate-limited API | Improve query specificity; check SerpAPI quota |
| Gmail send fails | OAuth scope not granted or token expired | Reconnect Gmail OAuth2 credential in n8n |
| Telegram webhook not firing | Incorrect bot token or webhook setup | Recreate Telegram credential and check bot permissions |
| Duplicate rows | Upsert mapping mismatch | Ensure promoCode mapping in Upsert matches structured output |
| Agent returns malformed JSON | LM prompt too permissive | Tighten the agent system prompt and validate with Structured Output Parser |
Quick Answers
How fresh are the codes?
Results pass a 30-day recency filter, cutting expired-code hits by ~60% versus single-source checks.
Do I get duplicates?
No. Every result is upserted into a Data Table keyed for deduplication and fast lookup.
How do I ask for codes?
Via Telegram message, Google Form, webhook POST, or scheduled runs. Answers come back on Telegram and Gmail.
Made by: khmuhtadin
Category: Marketing Automation
Tags: promo-codes, coupons, serpapi, telegram, gmail, openrouter, data-tables
Need custom workflows or help adapting this template? Contact me
Additional info
Built with n8n. Need an assessment on your business? Feel free to reach out at https://khmuhtadin.com/consultation/
This workflow was created by Khairul Muhtadin and shared publicly on the n8n community template library. n8nFind indexes it for discovery — the workflow remains the property of its original creator.