by Ejaz
How it works Run workflow on schedule** fires on a set interval to pull Reddit accounts from a Google Sheets spreadsheet (filtered to exclude shadowbanned accounts) Smart action calculator* randomly selects 3–8 accounts and decides whether each should *post* or *comment**, respecting cooldown timers (1–3hr gap for posts, 30–120min gap for comments) and only operating during active hours (midnight–noon) IP validation loop** routes each account through a proxy, verifies the IP against the account's creation IP using httpbin, and skips if there's a match (to avoid fingerprint overlap) Multilogin browser profile launch** opens an anti-detect browser session per account via the Multilogin API, then connects to the browser's DevTools WebSocket AI Agent (DeepSeek + Browser MCP)** autonomously navigates Reddit, reads subreddit rules, scans recent posts, and either creates a new text post or writes a context-aware comment — all with human-like scroll behavior and natural language Post-action processing** parses the AI's output to extract karma stats, permalinks, and success/failure status, then updates the Google Sheet with timestamps, karma totals, and links Profile cleanup** closes the Multilogin browser profile after each account finishes, then loops to the next account Setup steps ~20 minutes** to configure all credentials and services Connect your Google Sheets service account and point it to your Reddit accounts spreadsheet (columns: multilogin_profile_id, proxy_provider, shadowban?, account_id, account_password, creation_ip, karma, posts_made_today, comments_made_today, time_of_post, time_of_comment, last_allocated_ip, posts_links, comments_links, row_number) Set up your Multilogin API bearer token credential and update the folder ID in the "Open Multilogin Profile" node URL Add your DeepSeek API credential for both AI Agent model nodes Install the Browser MCP community node (n8n-nodes-browser-mcp) and ensure the MCP server is running at the configured baseUrl Update the proxy URL in the "Get Proxy Exit IP" HTTP Request node with your actual proxy credentials Adjust the Run workflow on schedule interval to your desired frequency Review the sticky notes inside the workflow for detailed logic explanations
by Panth1823
Stop manually checking dozens of career pages. This workflow runs every morning, hits the public APIs of 8+ ATS platforms and job boards, normalizes every listing into a single clean schema, and syncs everything to Supabase and Google Sheets deduplicated and ready to query. Who it's for Job seekers, recruiters, or career platforms that want a consolidated, up-to-date feed of openings from specific companies without scraping, without API keys, and without paying for a jobs aggregator. How it works A Schedule Trigger fires daily at 8 AM IST A Company List code node defines all sources grouped by ATS type (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, RemoteOK, and board APIs like Remotive, Himalayas, Arbeitnow, Jobicy) A Prepare Request node builds the correct API URL and headers for each source, including multi-page pagination for SmartRecruiters (up to 500 jobs via offset) and Himalayas (up to 500 via page param) An HTTP Request node fetches all sources in batches of 5 A Parse + Enrich + Filter node normalizes all divergent JSON structures into a unified schema — resolving ISO country codes, Indian city detection, salary parsing across all formats, and domain-based filtering Deduplicated results are upserted to a Supabase (Postgres) table and written to Google Sheets ATS platforms supported Greenhouse, Lever, Ashby, Workable, SmartRecruiters, RemoteOK, Remotive, Himalayas, Arbeitnow, Jobicy Normalized output schema job_id, title, company, location, country, salary, job_type, apply_url, posted_at, source_ats Setup Open the Company List node and edit the sources array — add or remove companies and their ATS slugs Update ALLOWED_DOMAINS in the Parse node to filter by location or job type relevant to you Add your Supabase credentials in the Postgres node and confirm your table name and schema match the output fields Connect your Google Sheets credentials and set the target spreadsheet and sheet ID (Optional) Adjust pagination limits per source in the Prepare Request node Requirements Self-hosted or cloud n8n instance Supabase project with a jobs table Google Sheets with headers matching the normalized schema No external API keys required — all sources use public endpoints
by Utkarsh Kapoor
Quick overview This workflow receives a company name via webhook, runs three Tavily web searches (company info, recent news, and key people), uses Groq (Llama 3.3 70B) to synthesize a structured lead profile, optionally appends the results to Google Sheets, and returns the enriched profile in the webhook response. How it works Receives a POST webhook request containing a company name and an optional domain. Queries the Tavily Search API for company overview details, then searches Tavily again for recent news and key executives/leadership. Sends the combined search results to a Groq LLM agent to generate a sales-ready lead enrichment profile as strict JSON (company details, products, signals, news, pain points, and outreach angles). Parses the AI output, extracts valid JSON if possible, and flattens key fields into a single row-friendly structure. If parsing succeeds, appends the enriched lead data to a Google Sheets spreadsheet and returns the full profile in the webhook response. If parsing fails, returns an HTTP 422 error response with the raw AI output for troubleshooting. Setup Create a Groq API key, add it as an n8n Groq credential, and select it in the Groq LLM node. Create a Tavily API key and replace YOUR_TAVILY_API_KEY in all three Tavily HTTP Request nodes. (Optional) Add Google Sheets OAuth2 credentials, set the Google Sheet document ID (replace YOUR_GOOGLE_SHEET_ID), and ensure the target sheet (named “Leads”) has matching column headers for the flattened fields.
by Shinji Watanabe
Quick Overview This workflow watches a Google Sheets vocabulary list for new German words, looks up synonyms via OpenThesaurus, and uses an OpenAI chat model to generate a JSON-formatted example sentence with metadata, then writes the results (or a “not found” note) back to the same sheet. How it works Triggers every minute when a new row is added to the selected Google Sheets worksheet. Sends the new row’s vocabulary value to OpenThesaurus to retrieve the headword and available synonyms. Checks whether OpenThesaurus returned any terms and, if none are found, updates the row in Google Sheets with a “類義語が見つかりませんでした。” message. If terms are found, prompts an OpenAI chat model (via an AI Agent) to output strict JSON containing a natural German example sentence using a synonym, the part of speech, a Japanese translation, and a CEFR level estimate. Extracts the JSON fields and updates the matching Google Sheets row with the generated sentence, part of speech, translation, and level. Setup Connect your Google Sheets OAuth credentials and select the target spreadsheet and worksheet for both the trigger and update steps. Ensure your sheet has columns named vocabulary, Similar Examples sentence, part_of_speech, translation_ja, and level, and that vocabulary can be used to match/update rows. Add OpenAI credentials (or an OpenAI-compatible connection) for the OpenAI Chat Model used by the AI Agent, and confirm the model name is available in your account. Enter new German words in the vocabulary column to test, and verify the OpenThesaurus lookup returns terms for your input words.
by Aziz dev
Description This workflow automates the daily reporting of Google Ads campaign performance. It pulls click and conversion data from the Google Ads API, merges both datasets, and stores the results into Notion databases and Google Sheets. It includes a campaign-level log and a daily performance summary. The workflow is triggered automatically every day at 08:00 AM, helping marketing teams maintain a consistent and centralized reporting system without manual effort. How It Works Scheduled Trigger at 08:00 AM The workflow begins with a Schedule Trigger node that runs once per day at 08:00. Set Yesterday’s Date The Set node defines a variable for the target date (yesterday), which is used in the API queries. Query Google Ads API – Clicks & Cost The first HTTP request pulls campaign-level metrics: campaign.id, campaign.name metrics.clicks, metrics.impressions, metrics.cost_micros Query Google Ads API – Conversions The second HTTP request pulls conversion-related data: metrics.conversions, segments.conversion_action_name Split and Merge Both responses are split into individual campaign rows and merged using: campaign.id segments.date Store Campaign-Level Data Stored in Notion database: "Google Ads Campaign Tracker" Appended to Google Sheets tab: "Campaign Daily Report" Generate Daily Summary A code node calculates daily totals across all campaigns: Total impressions, clicks, conversions, cost Unique conversion types The summary is stored in: Notion database: "Google Ads Daily Summary" Google Sheets tab: "Summary Report" Setup Steps 1. Schedule the Workflow The workflow is triggered using a Schedule Trigger node Set the schedule to run every day at 08:00 AM Connect it to the Set Yesterday Date node 2. Google Ads API Access Create a Google Ads developer account and obtain a developer token Set up OAuth2 credentials with Google Ads scope In n8n, configure the Google Ads OAuth2 API credential Ensure HTTP request headers include: developer-token login-customer-id Content-Type: application/json 3. Notion Database Setup Create two databases in Notion: Google Ads Campaign Tracker** Fields: Campaign Name, Campaign ID, Impressions, Clicks, Cost, Conversion Type, Conversions, Date Google Ads Daily Summary** Fields: Date, Total Impressions, Total Clicks, Total Conversions, Total Cost, Conversion Types Share both databases with your Notion integration 4. Google Sheets Setup Create a spreadsheet with two tabs: Campaign Daily Report → for campaign-level rows Summary Report → for daily aggregated metrics Match all column headers to the workflow fields Connect your Google account to n8n using Google Sheets OAuth2 Output Summary Notion Databases: Google Ads Campaign Tracker: stores individual campaign metrics Google Ads Daily Summary: stores daily totals and conversion types Google Sheets Tabs: Campaign Daily Report: per-campaign data Summary Report: aggregated daily performance
by Richard Nijsten
Generate Google Spreadsheets Testscript with AI using Pega Agile Studio When working as a functional Pega Software tester, this workflow will create a Google Spreadsheet with acceptance criteria and testcases based on the Pega Agile Studio userstory provided. This improves speed and efficiency while working in sprints on new functionalities. Who's it for If you are working as a software tester using the Pega Platform including Pega Agile Studio. How it works When the user chats an userstory in the format "US-1234", a HTTP Request will be made to Pega Agile Studio to retrieve the Userstory and commence creating a Google Spreadsheet. It will add the acceptance criteria on a seperate sheet for traceability. Next the AI will create testscases based on the Userstory provided. In the end, a small cleanup will be performed to remove duplicate rows/data created by the AI. You will have a Google Spreadsheet file in your My Drive containing your testcases! How to set up In the Chat, provide the userstory where you want to create a testscript for, in the format "US-1234". Add you OAuth2 Api for Agile Studio, so you can access the Pega Agile Studio through API calls. Requirements Access to Pega Agile Studio OAuth2 Api. AI API. Access to Google Cloud for the Google API's
by Triple 8 Labs
Quick overview Send an article brief via webhook and get back a fully-written WordPress draft — complete with SEO metadata, a generated featured image, and a Slack notification to your team — using Anthropic Claude, Google Imagen, Rank Math SEO and Slack. How it works Initialise: A CONFIG node holds your site-specific settings — WordPress URL, author, default category, Slack channel, image style prompt, tone guide, and style guide. A token validator secures the endpoint before processing begins. Create article: The brief is combined with the TONE_GUIDE and STYLE_GUIDE (set in CONFIG, overridable per request) and sent to Anthropic Claude which returns a structured JSON payload containing: the article body as HTML, an excerpt, suggested tags, a focus keyword, an SEO title, a meta description, and an image subject line. Create featured image (optional): If ENABLE_IMAGE_GENERATION is true, the image subject from Claude's output is prefixed with IMAGE_STYLE_PROMPT and sent to Google Imagen 4. The resulting image is uploaded to the WordPress media library, and assigned alt text derived from the focus keyword. Create draft WordPress post: Creates or collects the IDs of the suggested tags from WordPress, and creates a post in draft status via the WordPress REST API with the generated HTML body, excerpt, category, author, tags, and featured image attached. Customise SEO (optional): Updates the draft post with Rank Math SEO meta fields (focus keyword, SEO title, and meta description) via the WordPress REST API. This requires the Rank Math plugin plus a small config change in WordPress to expose those fields to the REST API (this can be easily done by adding the script below as a mu-plugin) Notify on completion: A Slack message is sent to your configured channel with the draft title, a direct edit link, the assigned tags, and any affiliate notes. The webhook returns a JSON response containing the post ID and draft URL. Setup Link credentials in the relevant nodes: - Anthropic API → GENERATE ARTICLE CONTENT - Google AI (PaLM) API → GENERATE IMAGE (the credential is labelled "PaLM" in n8n but supports Imagen 4) - WordPress Application Password → UPLOAD IMAGE, UPSERT TAG, CREATE POST, SET RANK MATH SEO - Slack OAuth2 → SLACK NOTIFICATION Update the CONFIG values for your WordPress site URL, default category ID, author ID, and (optionally) a Slack channel ID. If you want featured images, keep image generation enabled and ensure your Google AI project has access to the configured Imagen model. If you want Rank Math fields to be written via the REST API, install Rank Math and update your WordPress configuration to expose the Rank Math meta fields on posts (see code below). Skip if you don't use Rank Math. Activate the workflow, then copy the webhook URL from the article-publisher node and send a POST request { "prompt": "Write an article about building n8n automation pipelines" } Requirements n8n (self-hosted or cloud) Anthropic API key — console.anthropic.com WordPress with Application Password enabled (Settings → Users → Application Passwords) Google AI API key with Imagen 4 access — aistudio.google.com (optional — only needed if image generation is enabled) Slack app with OAuth2 (optional — only needed for Slack notifications) Rank Math plugin + custom configuration (optional — only needed for programmatic SEO fields) Customization Adjust tone and structure per article** — Pass tone_guide and style_guide in the webhook body to override the CONFIG defaults for a single request. Useful for guest posts, different content categories, or multilingual sites Disable image generation** — Set ENABLE_IMAGE_GENERATION to false in CONFIG. The workflow skips the Imagen step entirely and creates the draft without a featured image. Change the image style** — Enable image generation and update IMAGE_STYLE_PROMPT in CONFIG. This prefix is prepended to the image subject Claude suggests, so you control the visual style globally while Claude picks the subject per article. Customise the Rank Math SEO fields** — include the config change below on your WordPress site to register the necessary meta fields for setting the focus keyword, SEO title, and meta description via REST API. Create a file called rank-math-rest.php with the content below in the wp-content/mu-plugins/ folder for WordPress to load it automatically. true, 'single' => true, 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', 'auth_callback' => function () { return current_user_can( 'edit_posts' ); }, ] ); } } ); Additional info Background For more information on how the system works and how to use it for content creation, see building an automated wordpress publishing pipeline with n8n and claude Who's it for Content teams and solo publishers who want to go from article brief to reviewable WordPress draft in seconds, not hours Developers and technical bloggers who want to keep their own voice and structure while automating the grunt work Agencies managing multiple WordPress sites who need a repeatable, prompt-driven drafting pipeline
by Rahul Joshi
📊 Description: Streamline supplier sourcing and decision-making with this AI-powered price comparison automation 🤖. This workflow intelligently researches multiple suppliers in real-time, extracts pricing, delivery timelines, and MOQ data 🔍, and ranks the best options using advanced scoring logic. It also generates ready-to-send negotiation messages 📧 and flags anomalies for smarter procurement decisions. Perfect for teams looking to automate vendor analysis and reduce sourcing time while maximizing cost savings 💳. What This Template Does: 📋 Triggers when a new product request is added to Google Sheets. 🗺️ Validates input and plans supplier navigation using MCTS logic. 🤖 Scrapes and analyzes data from multiple supplier websites. 📊 Extracts price, MOQ, delivery time, and stock availability. 🧠 Performs AI self-critique to validate and score data quality. 🏆 Ranks suppliers based on price, delivery, and overall score. ✍️ Generates a negotiation email for the best supplier. 📒 Creates a detailed comparison report in Notion. 🔔 Sends a summary and insights to Slack for the team. ⚠️ Detects anomalies and alerts the team if needed. ✅ Updates Google Sheets with final results and status. Key Benefits: ✅ Fully automated supplier research and comparison ✅ Real-time data extraction with AI validation ✅ Smarter procurement decisions with ranking logic ✅ Built-in anomaly detection for risk reduction ✅ Instant negotiation message generation ✅ Centralized reporting and team collaboration Features: Google Sheets trigger-based workflow AI-powered supplier research (Agent Q with GPT-4o) HTTP scraping for live supplier data extraction MCTS-based navigation planning for accuracy Self-critique scoring and anomaly detection Automated Notion reporting dashboard Slack alerts with rich summaries Dynamic negotiation message generation Requirements: Google Sheets account (for request tracking) OpenAI API key (for Agent Q intelligence) Notion account (for report generation) Slack account (for alerts and summaries) Internet access for supplier website scraping Target Audience: 🏢 Procurement and sourcing teams 🛒 E-commerce and wholesale businesses 🚀 Startups optimizing vendor selection 🤖 Automation agencies building AI procurement systems
by Incrementors
Description A natural conversational AI chatbot that collects lead information (Name, Phone, Email, Message) one question at a time without feeling like a form. Uses session-based memory to track conversations, intelligently asks only for missing details, and saves complete leads to Google Sheets automatically. What this workflow does This workflow creates a human-like booking assistant that gathers lead information through natural conversation instead of traditional forms. The AI chatbot asks ONE question at a time, remembers previous answers using session memory, never repeats questions, and only saves data to Google Sheets when all four required fields (Name, Phone Number, Email Address, User Message) are confidently collected. The conversation feels natural and friendly—users engage with the bot as if chatting with a real person, dramatically improving completion rates compared to static forms. Perfect for booking systems, consultation requests, event registrations, customer support intake, or any scenario where you need to collect contact information without friction. Key features One question at a time: The AI never overwhelms users with multiple questions. It asks for Name, then Phone, then Email, then Message—sequentially and naturally, based on what's still missing from the conversation. Session-based memory: Uses timestamp-based session tracking so the AI remembers the entire conversation context. If a user says "My name is John" in message 1, the AI won't ask for the name again in message 5. Smart field detection: The AI automatically detects which details have been collected and which are still missing. It adapts the conversation flow dynamically instead of following a rigid script. Natural language processing: Handles variations in user input ("John Doe", "I'm John", "Call me John") and validates data intelligently before saving. Complete data guarantee: Only writes to Google Sheets when all 4 required fields are present. No partial or incomplete leads clutter your tracking sheet. Webhook-based integration: Works with any website, app, or platform that can send HTTP requests. Integrate with chatbots, contact forms, booking widgets, or custom applications. Instant responses: Real-time conversation with sub-second response times. Users get immediate replies, maintaining engagement throughout the lead collection process. How it works 1. User initiates conversation via webhook A user sends a message through your website chat widget, contact form, or booking interface. This triggers a webhook that passes the message along with query parameters (name, email, phone, message, timestamp, source) to n8n. 2. AI Agent analyzes conversation state The Conversational Lead Collection Agent receives the user's message and checks the current state: Which fields are already collected (from previous messages in this session)? Which fields are still missing? What should be asked next? The AI uses the system prompt to understand its role as a booking assistant for "Spark Writers' Retreat" and follows strict conversation rules. 3. Session memory tracks context The Buffer Window Memory node uses the timestamp from the webhook as a unique session ID. This allows the AI to: Remember all previous messages in this conversation Access previously collected information (name, phone, email) Never ask the same question twice Maintain conversation continuity even if the user takes breaks 4. One question at a time Based on what's missing, the AI asks exactly ONE question in natural, friendly language: If Name is missing → "Hi! What's your name?" If Phone is missing → "Great! And what's your phone number?" If Email is missing → "Perfect! Could you share your email address?" If Message is missing → "Thanks! How can I help you today?" The AI adapts its language based on previous conversation flow—it doesn't sound robotic or repetitive. 5. Data validation and collection As the user responds, the AI: Validates input (checks if phone number looks valid, email has @ symbol, etc.) Extracts the information from natural language responses Stores it temporarily in session memory Continues asking until all 4 fields are complete If the user provides unclear input, the AI politely asks again: "I didn't quite catch that. Could you share your phone number?" 6. Save to Google Sheets (when complete) Critical rule: The AI only uses the Google Sheets tool AFTER all four details are confidently collected. This prevents partial or incomplete leads from cluttering your database. When all fields are present, the AI: Writes exactly ONE row to Google Sheets Maps data: Name → Name, Phone → Phone No., Email → Email, Message → Message Uses Timestamp as the unique identifier (matching column) Updates existing rows if the same timestamp appears again (prevents duplicates) 7. Confirmation message After successfully saving, the AI sends a polite thank you: "Thank you! 🙏 We've received your details and our team will get back to you shortly." The AI never mentions Google Sheets, tools, backend systems, or automation—it maintains the illusion of human conversation. 8. Response delivery The final AI response is sent back to the user via the webhook response. Your website or app displays this message in the chat interface, completing the conversation loop. Setup requirements Tools you'll need: Active n8n instance (self-hosted or n8n Cloud) Google Sheets with OAuth access for lead storage OpenAI API key (GPT-4.1-mini access) Website or app with chat interface (or any platform that can send webhooks) Estimated setup time: 15–20 minutes Configuration steps 1. Connect Google Sheets In n8n: Credentials → Add credential → Google Sheets OAuth2 API Complete OAuth authentication Create a Google Sheet for lead tracking with these columns: Timestamp (unique session identifier) Name Phone No. Email Message Open "Save Lead to Google Sheets" node Select your Google Sheet and the correct sheet tab Verify column mapping matches your sheet structure 2. Add OpenAI API credentials Get API key: https://platform.openai.com/api-keys In n8n: Credentials → Add credential → OpenAI API Paste your API key Open "OpenAI GPT-4.1 Mini Language Model" node Select your OpenAI credential Ensure model is set to gpt-4.1-mini 3. Copy webhook URL Open "Receive User Message via Webhook" node Copy the Webhook URL (format: https://your-n8n.cloud/webhook/[webhook-id]) This is the endpoint your website or app will send messages to 4. Integrate with your chat interface You need to send HTTP POST/GET requests to the webhook URL with these query parameters: GET https://your-n8n.cloud/webhook/[id]?name=[name]&email=[email]&phone=[phone]&message=[user_message]×tamp=[unique_timestamp]&source=[source] Query parameter details: name: User's name (empty string if not yet collected) email: User's email (empty string if not yet collected) phone: User's phone number (empty string if not yet collected) message: Current user message (required) timestamp: Unique session ID (use ISO timestamp or UUID) source: Source identifier (e.g., "website_chat", "booking_form") Example integration (JavaScript): const sessionId = new Date().toISOString(); const userMessage = "Hi, I want to book a retreat"; fetch(https://your-n8n.cloud/webhook/[id]?message=${encodeURIComponent(userMessage)}×tamp=${sessionId}&name=&email=&phone=&source=website_chat) .then(res => res.json()) .then(data => { // Display AI response in your chat UI console.log(data.output); }); 5. Customize the AI assistant Open "Conversational Lead Collection Agent" node and edit the system message to: Change the business name (currently "Spark Writers' Retreat") Modify conversation tone (formal vs. casual) Adjust the fields being collected Change the final thank you message 6. Test the workflow Activate the workflow (toggle to Active at the top) Send a test message to the webhook URL Verify the AI responds appropriately Continue the conversation by sending follow-up messages with the same timestamp Check that: AI asks for missing fields only Session memory persists across messages Lead saves to Google Sheets when all 4 fields are collected Thank you message appears after saving Use cases Booking and reservations: Hotels, retreat centers, event venues, or appointment-based businesses collect guest details conversationally instead of long booking forms. Higher completion rates mean more confirmed bookings. Lead generation for services: Agencies, consultants, coaches, or freelancers capture qualified leads through natural conversation. Users are more likely to complete the process when it feels like chatting instead of form-filling. Customer support intake: Support teams collect issue details, contact information, and problem descriptions through chat before routing to the right agent. All data automatically logged in Google Sheets for ticketing. Event registration: Conference organizers, workshop hosts, or webinar providers gather attendee information without friction. The conversational approach encourages sign-ups even from mobile users who hate forms. Sales qualification: Sales teams use the chatbot to qualify leads by collecting basic information and understanding requirements before human handoff. Complete context stored in Google Sheets for CRM integration. Consultation requests: Professional services (legal, medical, financial) collect client details and initial consultation requests through friendly conversation, reducing no-show rates by building rapport early. Customization options Change collected fields Open "Conversational Lead Collection Agent" node and modify the system message: Add new fields (e.g., Company Name, Budget, Preferred Date) Remove optional fields (e.g., make Message optional) Update the field names and data mapping Then update the Google Sheets node to include the new columns. Adjust conversation tone In the system message, change conversation style: Formal:** "May I please have your full name?" Casual:** "What's your name?" Friendly:** "Hey! What should I call you?" Add validation rules Enhance the system prompt with specific validation: Phone format (e.g., 10 digits, US format) Email domain restrictions (e.g., only business emails) Name length requirements Message minimum word count Connect to CRM or email After "Save Lead to Google Sheets" node, add: HTTP Request node** to send data to your CRM API Email node** to notify sales team of new leads Slack/Discord node** for real-time team alerts Webhook node** to trigger other workflows Multi-language support Modify the system prompt to respond in the user's language: Add language detection logic Translate questions and responses Update thank you message for each language Add conversation analytics Insert a Set node before saving to track: Number of messages per lead Time to completion Drop-off points Source performance Troubleshooting AI repeats questions already answered Memory not persisting:* Verify the *"Session Memory with Timestamp"** node is using the correct timestamp from the webhook query params. Timestamp changing:** Ensure your chat interface sends the SAME timestamp for all messages in one conversation. Generate it once and reuse it. Memory window size:** Increase the buffer window size in the memory node if conversations are very long. Leads not saving to Google Sheets Partial data:** The AI only saves when all 4 fields are collected. Check your test conversation actually provided all required information. OAuth expired:** Re-authenticate Google Sheets credentials. Sheet permissions:** Verify the connected Google account has edit access to the sheet. Column names mismatch:** Ensure sheet column names exactly match the mapping in the Google Sheets node (case-sensitive). AI saves incomplete data System prompt not followed:** Review the "Tool usage (VERY IMPORTANT)" section in the system message. Ensure it clearly states to only use Google Sheets after all fields are collected. Validation too lenient:** The AI might be guessing missing fields. Strengthen validation rules in the system prompt. Webhook not receiving messages URL incorrect:** Double-check the webhook URL in your integration code matches the n8n webhook URL exactly. CORS issues:** If calling from a browser, ensure n8n allows cross-origin requests or use server-side integration. Query params missing:** Verify all required parameters (message, timestamp) are included in the request. AI responses too slow OpenAI API latency:** GPT-4.1-mini typically responds in 1-3 seconds. If slower, check OpenAI API status. Network delays:** Verify n8n instance has good connectivity. Memory lookup slow:** Reduce buffer window size if storing hundreds of messages. Session memory not working Timestamp format inconsistent:** Use ISO format (e.g., 2026-01-28T14:38:23.720Z) and ensure it's identical across messages. Memory node misconfigured:* Check the session key expression in *"Session Memory with Timestamp"** node references the correct webhook query param. Resources n8n documentation OpenAI GPT-4 API Google Sheets API n8n Webhook node n8n AI Agent Buffer Window Memory Support Need help or custom development? 📧 Email: info@incrementors.com 🌐 Website: https://www.incrementors.com/
by vinci-king-01
Subscription Renewal Reminder – Telegram & Supabase This workflow tracks upcoming subscription expiry dates stored in Supabase and automatically sends personalized renewal-reminder messages to each customer via Telegram. It is designed to be triggered by an HTTP Webhook (manually or on a schedule) and ensures that customers are notified a configurable number of days before their subscription lapses. > Community Template Disclaimer > This is a community-contributed n8n workflow template. It is provided “as-is” without official support from n8n GmbH. Always test thoroughly before using in production. Pre-conditions/Requirements Prerequisites n8n instance (self-hosted or n8n.cloud) Supabase project with a subscriptions table (id, customer_name, expiration_date, telegram_chat_id, notified) A Telegram Bot created via @BotFather Outbound HTTPS access from n8n to api.telegram.org and your Supabase project REST endpoint Required Credentials Supabase Service Role Key** – Full access for reading/writing the subscriptions table Telegram Bot Token** – To send messages from your bot n8n Webhook URL** – Auto-generated when you activate the workflow (ScrapeGraphAI API Key is *not* required for this non-scraping workflow.) Specific Setup Requirements | Environment Variable | Example Value | Purpose | |----------------------|--------------|---------| | SUPABASE_URL | https://xyzcompany.supabase.co | Base URL for Supabase REST API | | SUPABASE_KEY | eyJhbGciOiJI... | Service Role Key | | TELEGRAM_TOKEN | 609012345:AA... | Bot token obtained from BotFather | | REMINDER_DAYS | 3 | Days before expiry to notify | How it works This workflow tracks upcoming subscription expiry dates stored in Supabase and automatically sends personalized renewal-reminder messages to each customer via Telegram. It is triggered by an HTTP Webhook (manually or via external scheduler) and ensures that customers are notified a configurable number of days before their subscription lapses. Key Steps: Receive Trigger (Webhook)**: External call fires the workflow or an internal Cron node can be added. Set Static Parameters**: The Set node calculates “today + REMINDER_DAYS”. Query Supabase**: Fetch all subscriptions expiring on or before the calculated date and not yet notified. Branch Logic (If node)**: Check if any subscriptions were returned. Loop & Dispatch (Code + Telegram nodes)**: Iterate over each customer row, compose a message, and send via Telegram. Flag as Notified (Supabase Update)**: Update each processed row to prevent duplicate reminders. Respond to Webhook**: Return a concise JSON summary for logging or downstream integrations. Set up steps Setup Time: 15–20 minutes Create Telegram Bot a. Open Telegram and talk to @BotFather → /newbot b. Copy the given bot token; paste it into n8n Telegram credentials. Prepare Supabase a. Create a table named subscriptions with columns: id (uuid), customer_name (text), expiration_date (date), telegram_chat_id (text), notified (bool, default false) b. Obtain the Service Role Key from Project Settings → API. Import the Workflow a. In n8n, click Templates → Import and select “Subscription Renewal Reminder – Telegram & Supabase”. b. Replace placeholder credentials in the Supabase and Telegram nodes. Define Environment Variables (Optional but recommended) Add SUPABASE_URL, SUPABASE_KEY, TELEGRAM_TOKEN, and REMINDER_DAYS in Settings → Environment Variables for easy maintenance. Activate the Workflow Copy the production webhook URL and (optionally) set up a cron job or n8n Cron node to hit it daily. Node Descriptions Core Workflow Nodes: Webhook** – Entry point; triggers the workflow via HTTP request. Set (Calculate Target Date)** – Defines targetDate = today + REMINDER_DAYS. Supabase (Select)** – Retrieves expiring subscriptions that haven’t been notified. If (Rows > 0?)** – Determines whether to continue or exit early. Code (For-Each Loop)** – Iterates through each returned row to send messages and update status. Telegram** – Sends a personalized renewal reminder to the customer’s chat. Supabase (Update)** – Flags the subscription row as notified = true. Respond to Webhook** – Returns a JSON summary with counts of sent messages. Sticky Notes** – Inline documentation for maintainers (non-executable). Data Flow: Webhook → Set → Supabase (Select) → If → Code → Telegram → Supabase (Update) → Respond to Webhook Customization Examples Send Slack Notifications Instead of Telegram // Replace Telegram node with Slack node const message = Hi ${item.customer_name}, your subscription expires on ${item.expiration_date}.; return [{ text: message, channel: item.slack_channel_id }]; Notify 7 Days & 1 Day Before Expiry // In Set node items[0].json.reminderOffsets = [7, 1]; // days return items; Data Output Format The workflow outputs structured JSON data: { "totalSubscriptionsChecked": 42, "remindersSent": 13, "timestamp": "2024-05-27T09:15:22.000Z" } Troubleshooting Common Issues No messages sent – Check the If node; ensure REMINDER_DAYS is set correctly and the Supabase query returns rows. Telegram error 403 – The user hasn’t started a chat with your bot. Ask the customer to click “Start” in Telegram. Performance Tips Batch database updates instead of row-by-row when dealing with thousands of records. Cache Supabase responses if you expect multiple workflows to query the same data within seconds. Pro Tips: Use the Cron node inside n8n instead of external schedulers for a fully self-contained setup. Add an Email node after the Telegram node for multi-channel reminders. Store template messages in Supabase so non-developers can update wording without editing the workflow.
by Lucio
Instagram Video Backup to Google Drive Automatically backup all your Instagram videos to Google Drive with a searchable metadata catalog in JSON format. What It Does This workflow provides a complete backup solution for your Instagram video content with intelligent caption parsing: Fetches your Instagram account ID and videos (VIDEO and REELS types) Parses captions into structured fields: Title: Everything before the first hashtag Description: Everything after the first hashtag (includes all tags) Tag List: All hashtags extracted as an array Description Full: Complete original caption text Downloads videos in maximum available quality from Instagram Uploads videos to a designated Google Drive folder Creates/updates a JSON metadata file with all video details Prevents duplicates using n8n Data Tables with account-level filtering Key Features Account-Level Tracking: The Data Table includes accountId so you can use the same table across multiple Instagram accounts. Each account's videos are tracked separately. Smart Caption Parsing: Automatically splits Instagram captions into title (before first #) and description (all hashtags and text after), with full text preserved in descriptionFull. Portable Catalog: The JSON file is stored in Google Drive alongside your videos, making it accessible anywhere without needing n8n. Maximum Quality: Uses Instagram Graph API's media_url field for highest available quality. Hashtag Extraction: Automatically extracts all hashtags into an array for easy filtering and analysis. Workflow Architecture Section 1: Fetch & Filter Get Instagram Account Info → Configuration → Fetch Media → Split Out Items → Filter Videos Only Get Instagram Account Info**: Fetches your Instagram account ID and username Configuration**: Stores account ID, Google Drive folder ID, and settings Fetch Media**: Gets up to 100 media items from Instagram Split Out Items**: Separates each media item for individual processing Filter Videos Only**: Keeps only VIDEO and REELS types (skips images) Section 2: Process Videos Check If Backed Up → IF Not Backed Up → Wait → Parse Caption → Download → Upload → Extract Metadata → Save Record → Aggregate For each video: Check If Already Backed Up: Queries Data Table by postId to avoid duplicates IF Not Already Backed Up: Skips if video already exists Wait: 5-second delay between downloads (prevents API rate limits) Parse Caption: Splits caption into title, description, tagList, descriptionFull Download Video: Downloads video file from Instagram to memory Upload to Google Drive: Uploads video to configured folder Extract Metadata: Creates structured metadata object with all fields Save Backup Record: Stores accountId, postId, googleDriveFileId, backedUpAt in Data Table Aggregate: Collects all new video metadata for JSON update Section 3: Update JSON Catalog End Loop → Download Existing JSON → Update JSON → Upload Updated JSON After all videos processed: Download Existing Metadata JSON: Gets current JSON file from Google Drive (if exists) Update Metadata JSON: Appends new video metadata to existing catalog Upload Updated Metadata JSON: Saves updated JSON back to Google Drive Setup Steps 1. Create Google Drive Folder Go to Google Drive Create a new folder named Instagram Video Backups (or any name you prefer) Open the folder and copy the Folder ID from the URL: https://drive.google.com/drive/folders/1ABC123xyz... ^^^^^^^^^^^ This is your Folder ID 2. Create n8n Data Table Create a Data Table for deduplication tracking with account-level support: Table Name: Instagram Video Backups Schema: | Field Name | Type | Description | |------------|------|-------------| | accountId | string | Instagram account ID (allows multi-account use) | | postId | string (Primary Key) | Instagram post ID | | googleDriveFileId | string | Google Drive file ID for the video | | backedUpAt | string | ISO timestamp of backup | Why accountId? This allows you to use the same Data Table for multiple Instagram accounts. Each account's videos are tracked separately, preventing conflicts. 3. Configure Credentials You'll need two credential sets: Instagram Graph API (HTTP Bearer Auth) In n8n, create new credential: HTTP Bearer Auth Set header name: Authorization Set header value: Bearer YOUR_INSTAGRAM_ACCESS_TOKEN Name it: Instagram Graph API Getting Instagram Access Token: Follow Meta's Business Account setup guide Required permissions: instagram_graph_user_media Tokens expire after 60 days (requires manual refresh) Google Drive OAuth2 In n8n, create new credential: Google Drive OAuth2 API Follow OAuth flow to authorize your Google account Name it: Google Drive Account 4. Update Configuration Node In the workflow, open the Configuration node and update: { "googleDriveFolderId": "PASTE_YOUR_FOLDER_ID_HERE", "maxVideosPerRun": 100, "waitBetweenDownloads": 5, "metadataFileName": "instagram-backup-metadata.json" } Settings Explained: googleDriveFolderId: The folder ID you copied in step 1 maxVideosPerRun: Max videos to process per run (100 is safe for API limits) waitBetweenDownloads: Seconds to wait between downloads (prevents rate limits) metadataFileName: Name of the JSON catalog file in Google Drive Note: accountId and accountUsername are automatically populated from Instagram API. 5. Test & Activate Click Manual Trigger to test the workflow Check Google Drive folder for: Video files named instagram_{postId}.mp4 JSON file named instagram-backup-metadata.json Verify Data Table has records with accountId and postId Activate the Schedule Trigger for daily automatic backups Metadata JSON Structure The JSON file stored in Google Drive has this structure: { "lastUpdated": "2026-02-01T10:00:00Z", "totalVideos": 42, "videos": [ { "accountId": "17841400123456789", "instagramId": "123456789", "permalink": "https://instagram.com/p/ABC123", "title": "Amazing sunset at the beach!", "description": "#travel #nature #sunset", "tagList": ["travel", "nature", "sunset"], "descriptionFull": "Amazing sunset at the beach! #travel #nature #sunset", "timestamp": "2026-01-15T08:30:00Z", "mediaType": "VIDEO", "googleDriveFileId": "1ABC123xyz...", "googleDriveFileName": "instagram_123456789.mp4", "backedUpAt": "2026-02-01T10:00:00Z" } ] } Field Descriptions accountId**: Instagram account ID (from Graph API /me endpoint) instagramId**: Instagram post ID (unique identifier) permalink**: Direct link to Instagram post title**: Caption text before the first hashtag description**: Caption text from first hashtag onward (includes all tags) tagList**: Array of hashtags without the # symbol descriptionFull**: Complete original caption (preserves full text) timestamp**: When the video was originally posted to Instagram mediaType**: VIDEO or REELS googleDriveFileId**: Google Drive file ID (use to access file via Drive API) googleDriveFileName**: Filename in Google Drive (instagram_{postId}.mp4) backedUpAt**: When the video was backed up (ISO timestamp) Caption Parsing Logic The Parse Caption Code node splits Instagram captions intelligently: Example Caption: "Amazing sunset at the beach! 🌅 #travel #nature #sunset" Parsed Fields: title**: "Amazing sunset at the beach! 🌅" description**: "#travel #nature #sunset" tagList**: ["travel", "nature", "sunset"] descriptionFull**: "Amazing sunset at the beach! 🌅 #travel #nature #sunset" Edge Cases: No hashtags**: Entire caption becomes title, description is empty Hashtag at start**: title is empty, entire caption becomes description Multiple lines**: Preserves all line breaks in descriptionFull Multi-Account Usage Using the same Data Table for multiple accounts: Import this workflow multiple times (once per Instagram account) Configure each workflow with different Instagram credentials Use the same Data Table name in all workflows: Instagram Video Backups Each workflow automatically filters by its own accountId Benefits: Single deduplication table for all accounts Easy to query all backups across accounts Prevents conflicts between accounts with same post IDs Querying specific account backups: // In Data Table or external script const accountBackups = allBackups.filter( backup => backup.accountId === "17841400123456789" ); API Quotas & Limits Instagram Graph API Rate Limits**: 200 calls/hour per user token (standard) This Workflow**: 2 calls total (1 for account info, 1 for media fetch) Impact**: Can run safely within free tier limits Google Drive API Rate Limits**: 1,000 requests per 100 seconds per user This Workflow**: 2 calls per video (upload video + final JSON update) Impact**: 100 videos = ~200 calls, well within limits Recommended Schedule Daily (midnight)**: Default, safe for most accounts Weekly**: Good for accounts with infrequent posting Manual**: On-demand backups when needed Troubleshooting No videos are being backed up Check Instagram credentials: Open "Get Instagram Account Info" node Click "Execute Node" Look for error messages about authentication Verify account has videos: Instagram Graph API only returns VIDEO and REELS Won't backup images or carousels (by design) accountId is empty in Data Table Account info fetch failed: Check Instagram credentials have correct permissions Verify token hasn't expired (60-day limit) Test "Get Instagram Account Info" node separately JSON file has wrong title/description Caption parsing issue: Open "Parse Caption" Code node Check the output to see parsed fields Verify caption has hashtags (if no hashtags, entire caption becomes title) Custom parsing logic: Edit the "Parse Caption" Code node to adjust splitting logic: // Current: splits at FIRST hashtag const firstHashtagIndex = caption.indexOf('#'); // Alternative: split at specific word const splitWord = 'DESCRIPTION:'; const splitIndex = caption.indexOf(splitWord); Duplicate videos in Google Drive Data Table issues: Verify table name is exactly: Instagram Video Backups Check table has postId as primary key Verify accountId field exists Workflow execution failed mid-run: If workflow fails after upload but before saving to Data Table, video won't be tracked Safe to delete duplicate video in Google Drive and re-run Rate limit errors Instagram rate limits: Reduce maxVideosPerRun to 50 or 25 Increase waitBetweenDownloads to 10 seconds Google Drive rate limits: Unlikely with default settings If occurs, reduce maxVideosPerRun Caption has special characters (emojis, line breaks) Emojis preserved: All emojis are preserved in descriptionFull May appear in title or description depending on position Line breaks: Line breaks are preserved in descriptionFull May affect title/description split if hashtags are on new lines Advanced Customization Change Backup Folder Update googleDriveFolderId in Configuration node to any Google Drive folder ID. Change Schedule Edit the Schedule Trigger node: Daily midnight: 0 0 * * * (default) Every 12 hours: 0 */12 * * * Weekly Sunday: 0 0 * * 0 Custom: Use crontab.guru to generate expression Organize Videos by Date To create monthly subfolders (e.g., 2026-02/video.mp4): Before "Upload to Google Drive" node, add "Google Drive - Create Folder" node Folder name: ={{ $now.format('yyyy-MM') }} Parent folder: ={{ $('Configuration').item.json.googleDriveFolderId }} Update upload node to use created folder ID Download Videos Locally Too To keep local copies in addition to Google Drive: After "Download Video" node, add Write Binary File node File path: /path/to/backup/{{ $('Extract Metadata').item.json.googleDriveFileName }} Connect in parallel with "Upload to Google Drive" Custom Caption Parsing To use different title/description split logic: Option 1: Split at specific keyword const splitKeyword = 'DESCRIPTION:'; const splitIndex = caption.indexOf(splitKeyword); if (splitIndex === -1) { title = caption.trim(); description = ''; } else { title = caption.substring(0, splitIndex).trim(); description = caption.substring(splitIndex + splitKeyword.length).trim(); } Option 2: Use first sentence as title const sentenceEnd = caption.match(/[.!?]/); const endIndex = sentenceEnd ? caption.indexOf(sentenceEnd[0]) + 1 : -1; if (endIndex === -1) { title = caption.trim(); description = ''; } else { title = caption.substring(0, endIndex).trim(); description = caption.substring(endIndex).trim(); } Filter by Account in JSON To create separate JSON files per account: Update "Update Metadata JSON" Code node to filter by accountId Change metadataFileName to include account username: instagram-backup-{{ $('Configuration').item.json.accountUsername }}.json Use Cases Search Videos by Hashtag Download the JSON file from Google Drive, then: // Load JSON const metadata = require('./instagram-backup-metadata.json'); // Find all #travel videos const travelVideos = metadata.videos.filter(v => v.tagList.includes('travel') ); console.log(Found ${travelVideos.length} travel videos); Find Videos by Date Range const startDate = new Date('2026-01-01'); const endDate = new Date('2026-01-31'); const videosInRange = metadata.videos.filter(v => { const videoDate = new Date(v.timestamp); return videoDate >= startDate && videoDate <= endDate; }); Generate Reports Import JSON into Google Sheets or Excel to analyze: Most used hashtags Videos per month Backup coverage percentage Videos by account (if using multi-account setup) Migrate to Another Platform The JSON catalog includes permalinks and timestamps, making it easy to: Re-upload to YouTube, TikTok, etc. Generate video sitemap for website Create video archive with searchable metadata Known Limitations Only videos: Doesn't backup images or carousel posts (by design) Token expiration: Instagram tokens expire after 60 days, requires manual refresh Storage limits: Google Drive free tier is 15GB No analytics: Doesn't track views, likes, or comments Single folder: All videos in one folder (can be customized, see Advanced Customization) Caption parsing: Assumes first hashtag splits title/description (customizable) Data Privacy Videos are downloaded to n8n temporarily, then uploaded to Google Drive n8n doesn't permanently store video files Metadata JSON contains only public Instagram data Google Drive files are private to your account Instagram access token is encrypted by n8n credentials system Account ID is public data from Instagram Graph API Version History v1.0** (2026-02-01): Initial release Daily automatic backups Google Drive storage JSON metadata catalog with smart caption parsing Multi-account support via accountId Deduplication via Data Tables Title/description/tagList extraction Related Workflows Upload from Instagram to YouTube**: Cross-post videos to YouTube with metadata Instagram to X**: Share posts to Twitter/X Instagram Account Information Tracker**: Track follower metrics and insights over time Additional Resources Instagram Graph API Documentation Google Drive API Documentation n8n Data Tables Guide Instagram Access Token Setup Support If you encounter issues: Check Troubleshooting section above Review n8n execution logs for error details Verify all credentials are active and have required permissions Test with Manual Trigger before relying on Schedule Trigger Check "Parse Caption" node output if title/description is incorrect
by Siddharth Gupta
Analyze up to 100 URLs in one run and export key on-page SEO data to CSV automatically. This n8n workflow accepts URLs from chat input, fetches each page’s HTML and HTTP headers, extracts 27+ SEO elements such as title tags, meta tags, canonical, hreflang, headings, Open Graph tags, Twitter tags, meta robots, X-Robots-Tag, and status code data, then returns a downloadable CSV link when the run is complete. How it works Submit up to 100 URLs through the chat input. The workflow cleans, normalizes, validates, and deduplicates the URL list before processing begins. Each URL is fetched with an HTTP Request node that captures both the HTML response and the page headers. The workflow checks for failed requests, non-200 status codes, and common fetch or compliance issues before extraction continues. Valid pages are parsed to extract important on-page SEO elements such as title, meta description, canonical, hreflang, OG tags, Twitter tags, headings, and robots directives. The final dataset is structured into a clean CSV file and uploaded to a temporary file host so the user can download it directly from chat. What problem does this solve? Manual on-page SEO audits are repetitive, slow, and hard to scale when multiple URLs need to be reviewed at once. Common use cases Bulk on-page SEO audits for landing pages, category pages, blog posts, or service pages. Pre-launch QA checks for staging URLs before deployment. Hreflang, canonical, meta robots, and X-Robots-Tag audits. Title tag, meta description, and heading reviews for content optimization. Competitor page analysis at scale. Indexability and crawlability checks using header and meta directives. Set up steps Import the workflow JSON into n8n. Make sure the n8n instance can send HTTP requests to external URLs. Optionally adjust the URL limit, user agent, extraction fields, or output destination. Run the workflow from chat by pasting a list of URLs. Download the generated CSV from the link returned in chat. Notes This workflow is optimized for reliability over speed, so it processes URLs sequentially. A 100-URL run can take around 25 to 30 minutes depending on the server, network, and target sites. Pages protected by aggressive bot mitigation such as CAPTCHA, WAF rules, or anti-bot services may still block requests. The CSV download link is temporary because the file is uploaded to a temporary hosting service.