Code workflows
1,006 results — all source-linked n8n references
Build multi-touch attribution reports with Supabase multi-model MTA
Quick Overview This workflow ingests marketing touch events, stores them in Supabase, stitches identities by shared email, and calculates first-touch, last-touch, linear, and time-decay multi-touch attribution credit per channel, outputting a side-by-side model comparison. How it works Runs when triggered manually (or can be adapted to receive real touch events via a webhook). Loads configuration such as the channel list and the time-decay half-life window. Generates a batch of synthetic multi-touch customer journeys for the demo run. Writes all touch events to a Supabase table via the Supabase REST API. Reloads the stored touches from Supabase and merges visitors into a single identity when they share an email address. Computes revenue-weighted channel credit across converting journeys using first-touch, last-touch, linear, and time-decay attribution models. Prints a formatted comparison table of channel credit across the four models. Setup Create a Supabase project and table (for example, mta_touches) to store touch events, matching the fields used in the workflow (visitor_id, email, channel, ts, is_conversion, revenue). Add SUPABASE_URL and SUPABASE_KEY environment variables to
Reconcile blended ROAS, MER and CAC with Meta, Google, TikTok and Claude
Quick overview This workflow pulls ad spend and platform-reported revenue from Meta (with placeholders for Google Ads and TikTok), combines it with your actual store revenue and new-customer count, calculates blended ROAS/MER and blended CAC plus over-claiming, and uses Anthropic Claude to generate a short executive efficiency brief. How it works Runs manually to start the reconciliation for the configured date range. Loads the reporting window plus store revenue, new-customer count, and any additional platform spend/revenue inputs. Calls the Meta Marketing API to fetch account-level ad spend and conversion value, then merges it with the additional platform figures. Calculates total spend, total platform-reported revenue, blended ROAS/MER, blended CAC, and the over-claim amount and percentage, plus per-platform reported ROAS. Sends the reconciled metrics to Anthropic Claude to generate a terse JSON brief with a verdict, over-claim note, and recommended action. Prints a console scorecard with blended ROAS/MER, CAC, over-claiming, per-platform breakdown, and the Claude-generated brief. Setup Set the environment variables META_ACCESS_TOKEN, META_AD_ACCOUNT_ID, and optionally META_API_
Find wasted Meta ad spend by placement, region, age and hour with Claude
Quick overview This workflow pulls the last 30 days of Meta Ads insights across multiple breakdowns, calculates an account cost-per-result benchmark, flags high-waste delivery slices, and uses Anthropic Claude to rank a prioritized “kill list” with recommended actions. How it works Runs when triggered manually. Sets the analysis configuration, including the date preset, spend floor, cost-per-result multiple, minimum attribution threshold, and which Meta “action” events count as results. Queries the Meta Marketing API for account-level insights and breakdown insights (placement, region, age/gender, and hour), then computes the account cost-per-result benchmark and skips breakdowns with low conversion attribution coverage. Flags breakdown slices that exceed the spend floor and either have zero results or a cost-per-result above the benchmark threshold, then calculates “at risk” spend and keeps the top waste candidates. Sends the waste list and benchmark context to Anthropic Claude to rank the slices and return a recommended action (pause, exclude, or reallocate) with a one-line rationale. Prints a formatted wasted-spend report (and returns the parsed JSON ranking) for use in downstre
Monitor Meta CAPI event match quality with Meta Graph API and Claude
Quick overview This workflow runs on demand to monitor Meta Conversions API Event Match Quality across the pixels in a Meta ad account, calculates a weighted 0–100 match-quality score from Graph API stats, and uses Anthropic Claude to summarize risks and fixes for any pixels below an alert threshold. How it works Runs when you manually trigger the workflow. Loads configuration for which pixels to monitor, how far back to consider pixels active, which conversion events to weight more heavily, and the alert threshold. Uses the Meta Graph API to discover recently active pixels (or uses a provided list of pixel IDs) and pulls per-event “had_pii” coverage stats for each pixel. Computes a weighted match-quality score per pixel (conversion events count triple) and builds a scorecard sorted from lowest to highest. Sends the scorecard to Anthropic Claude to generate a short JSON summary with a one-line risk and a concrete fix for each pixel below the threshold. Prints a formatted EMQ scorecard with alerts and Claude’s recommendations to the execution log. Setup Create a Meta access token with permissions to read pixel stats, and set META_ACCESS_TOKEN, META_AD_ACCOUNT_ID, and (optionally) ME
Track and analyze TikTok videos with Apify, OpenAI, and Google Sheets
Quick overview This workflow runs daily (or manually) to fetch recent videos from a list of TikTok accounts via Apify, transcribes each video with OpenAI, generates content insights and translations, and then appends or updates one row per video in Google Sheets. How it works Runs on a daily schedule (or manually) and loads configuration values like the date window, video limit, output language, and Apify actor. Reads the TikTok usernames to monitor from the accounts tab in Google Sheets. Calls the Apify TikTok Scraper API to retrieve the latest videos for each configured account. Filters and normalizes the results to keep only videos published within the last N days and extracts metrics, captions, hashtags, and download URLs. Downloads each video file and transcribes it with OpenAI speech-to-text. Sends the transcription plus caption and hashtags to OpenAI to extract a hook, classify the content, infer the video format, and translate the transcription. Writes the combined video metadata, transcription, and AI insights to the insights tab in Google Sheets using an append-or-update operation. Setup Create a Google Sheets spreadsheet with an accounts sheet containing a username colum
Route WhatsApp support requests with Claude, Supabase, HubSpot and Slack
Quick overview This workflow turns incoming WhatsApp messages (text, audio, images, and documents) into actionable support interactions by extracting content, detecting sentiment, and using an AI agent with a Supabase knowledge base to route requests to Google Calendar, HubSpot, Slack, Gmail, and back to WhatsApp. How it works Receives incoming WhatsApp messages via a WhatsApp webhook trigger. Routes the message by type and converts it into text using OpenAI Whisper for audio, OpenAI GPT-4o Vision for images, or a PDF extractor for documents (or passes text messages through). Loads the sender’s session context from Supabase and runs sentiment/language detection on the extracted text. Uses a LangChain AI agent (Claude) with Supabase vector search (with OpenAI embeddings and Cohere reranking) plus tool access (Google Calendar, HubSpot, Slack, and Gmail) to produce a structured intent, response, and metadata. Logs conversation analytics (intent, sentiment, message type, and response length) to an n8n Data Table. Routes by intent to either create a Google Calendar event, create/update a HubSpot contact, email a document via Gmail (and upload it to Google Drive), create a HubSpot ticket
Calculate Shopify variant prices from Google Sheets with Slack approvals
Quick overview Video Explanation: https://youtu.be/_geRatkc1kU?si=qALW_nrPrNB4THuO This workflow runs daily to calculate Shopify variant prices from Google Sheets COGS inputs, automatically updates qualifying prices in Shopify, and posts Slack alerts for changes that need manual approval; it also supports Slack-based approvals to apply a proposed price from a Slack thread. How it works Runs every day on a scheduled trigger. Reads product dependency/recipe data from Google Sheets and looks up the latest supplier prices in a second Google Sheets sheet. Calculates raw COGS, landed COGS (with hidden cost percentage), and a target-margin retail price for each Shopify variant. Checks the calculated price against thresholds and either updates the Shopify variant price via the Shopify Admin API or posts an approval-required alert to Slack. Posts a Slack confirmation message when a scheduled Shopify price update succeeds. Triggers on Slack reaction events, verifies an authorized Slack user approved the change, then fetches the Slack thread replies and extracts the variant ID and approved price. Updates the Shopify variant price with the extracted value and posts a final status message to Sl
Extract meeting decisions and action items with LDX hub (Gemini) and Google Sheets
Quick overview This workflow collects a meeting-minutes PDF via an n8n form, uses LDX hub (Gemini) to segment it by agenda and extract decisions and action items, then appends each item as a row in Google Sheets. How it works Receives a PDF upload through an n8n form submission trigger. Sends the document to LDX hub AnalyzeDoc (Google Gemini) to split the minutes into agenda-topic segments and return them as structured JSON — a topic that spans multiple pages stays in one segment. Converts the agenda segments into a JSONL batch so each segment can be processed independently. Sends the batch to LDX hub StructFlow (Google Gemini) to extract every decision and action item with owner and due date per agenda segment. Expands the extracted results into one row per decision/action item with agenda context. Appends the rows to a selected Google Sheets worksheet. Setup Install the n8n-nodes-ldxhub community node and create an LDXhub API credential. Create a Google Sheet with columns: agenda_no, agenda_title, item_type, item, owner, due_date. Add a Google Sheets OAuth2 credential and select the target spreadsheet and sheet in the append step. Activate the workflow and use the generated form
Track RSS events with OpenAI GPT-4.1-mini, Google Sheets, and Outlook
Quick overview This automated pipeline monitors an RSS feed, leverages an OpenAI chat model to extract event details into structured JSON, logs the data to Google Sheets, and triggers real-time email notifications via Microsoft Outlook. How it works Trigger: An RSS node polls the specified feed every minute to detect new entries. Batching: A Loop node isolates each RSS item to ensure accurate, individual processing without data overlap. AI Extraction: An AI Agent, powered by OpenAI, extracts the event title, date, URL, and description, formatting the output strictly as JSON. Sanitization: A custom JavaScript Code node cleans the LLM response by stripping markdown blocks and parsing the JSON object. Database Logging: The Google Sheets node maps the parsed keys and appends a new row for the event. Alerting: An Outlook node dispatches an automated notification email, and the loop continues for the next item. Setup Configure the RSS Feed Trigger by pasting your target feed URL. Add your OpenAI API credentials to the OpenAI Chat Model node (verify your specific model identifier, e.g., gpt-4o-mini Authenticate the Google Sheets node via OAuth and select your destination spreadsheet and w
Log nearby businesses from OpenStreetMap to Google Sheets by proximity
Quick overview This workflow collects a location and business search criteria via an n8n form, geocodes the location with OpenStreetMap Nominatim, finds nearby matching businesses using the Overpass API, and appends normalized results (including website availability) to a Google Sheets spreadsheet. How it works Receives a submission from an n8n form with a location, business category, search radius, and maximum results. Sends the location text to OpenStreetMap Nominatim to retrieve latitude and longitude coordinates. Stops if the location cannot be geocoded, preventing an invalid proximity search. Builds an Overpass QL query for the selected business category and radius around the geocoded coordinates. Calls the OpenStreetMap Overpass API to return matching nodes/ways and their tags (for example website, phone, and opening hours). Normalizes the returned elements into a consistent set of fields, flags whether a website is present, and appends the rows to Google Sheets. Setup Add a Google Sheets credential and select the target spreadsheet and sheet in the Google Sheets append step. Update the User-Agent value to include a real contact email to comply with OpenStreetMap usage policy
Post a daily project health standup to Slack with Notion and Groq
Quick overview This workflow runs every morning, reads yesterday’s standup and today’s active projects from Notion, uses Groq (OpenAI-compatible chat completions) to generate a red/yellow/green project health standup, posts it to Slack, and saves the new standup back to Notion for tomorrow. How it works Runs every day at 7:30 AM on a schedule. Reads the previous standup digest from a Notion “memory” database row and fetches all “Active” projects from a Notion projects database. Builds a prompt that includes yesterday’s digest plus today’s project notes, last update dates, and next milestone dates. If there are no active projects, posts an “All quiet” message to a Slack channel. If there are active projects, sends the prompt to Groq’s chat completions endpoint to score projects as Red/Yellow/Green and list changes since yesterday. Posts the generated standup text to Slack and updates the Notion memory row with today’s digest and timestamp. Setup Add a Notion credential and set the database IDs for your Projects database and the single-row Memory database used to store the daily digest. Create a Groq API header-auth credential (Authorization: Bearer ) for the Groq chat completions re
Generate SRT and VTT subtitles from media URLs with Gladia and Google Drive
Quick Overview This workflow collects a public media URL via an n8n form, sends it to Gladia to generate SRT and VTT subtitles, uploads the subtitle files to Google Drive, and returns Drive download links back in the form completion page. How it works Receives a media URL (and optional title) from an n8n Form Trigger. Submits the media URL to the Gladia pre-recorded transcription API with subtitles enabled for SRT and VTT output. Waits and repeatedly polls Gladia for the job result until the status is done, or stops and fails if Gladia returns an error or the max-attempt limit is reached. Extracts the SRT and VTT subtitle tracks from Gladia’s response, builds each one into a file, and stops with an error message if no subtitle tracks are returned. Uploads the generated subtitle files to a specified Google Drive folder. Displays a completion message in the form response containing the Google Drive links for the SRT and VTT files. Setup Create an HTTP Header Auth credential for Gladia (header name x-gladia-key) and select it for the Gladia API request steps. Connect a Google Drive OAuth2 credential and set the destination folder ID used for uploading subtitle files. Update the pollin
Calculate litigation deadlines from intake forms with Google Calendar, Sheets, Slack and Gmail
Quick Overview This workflow collects litigation matter intake details via an n8n form, calculates limitation and procedural deadlines using a built-in rules table, then creates deadline and reminder events in Google Calendar, logs each deadline to Google Sheets, and sends a summary via Slack and Gmail. How it works Receives a submission from an n8n form with the matter details, jurisdiction, claim type, and trigger dates. Loads the configured limitation rules, procedural rules, holidays, reminder offsets, and target Google Calendar/Google Sheets/Slack/email settings. Calculates limitation and procedural due dates (and any review notes) from the provided dates, rolling deadlines off weekends/holidays and generating reminder dates. Appends each calculated deadline record to a Google Sheets register. Creates an all-day Google Calendar event for each calculated deadline and separate all-day events for each upcoming reminder offset. Posts a consolidated deadline summary to a Slack channel and emails the same summary via Gmail to the responsible lawyer (or a fallback team email). Setup Connect credentials for Google Calendar, Google Sheets, Slack, and Gmail. In the rules/settings step,
Track recurring job pain points with SerpApi, Gemini, and Google Sheets
Quick Overview This workflow runs weekly to pull Google Jobs results via SerpApi, uses Google Gemini to extract operational pain points and an automation opportunity from each posting, logs them to Google Sheets, and writes a frequency-ranked pain-point summary to a summary tab. How it works Runs weekly on a schedule. Sets the target job role, location, and Google Sheets tab name to use for this run. Queries Google Jobs through SerpApi and splits the response into one item per job posting. Sends each posting’s title, company, and description to Google Gemini and parses the returned JSON into structured fields. Appends each analyzed posting (company, title, pain points, automation opportunity, and collection date) as a new row in Google Sheets. Reads all rows from the same Google Sheets tab, counts how often each pain-point phrase appears, and sorts the list by frequency. Appends the ranked pain-point frequency list to a Google Sheets "summary" tab. Setup Add a SerpApi API key and update the SerpApi request parameters in the HTTP request step (or store the key in an n8n credential). Connect a Google Sheets OAuth2 credential and replace the placeholder spreadsheet URL/ID with your ow
Track buyer query citation sources with GPT-4o and Google Sheets
Quick overview This workflow tracks which sources ChatGPT cites for buyer queries.vIt runs weekly to test buyer queries against OpenAI’s GPT-4o web search, extracts the cited URLs, and logs per-query citation counts and domain classifications to Google Sheets. How it works Runs every week on a schedule trigger. Reads a list of buyer queries (including brand and competitor context) from the queries tab in Google Sheets. Sends each query to OpenAI’s gpt-4o-mini-search-preview three times with web search enabled and extracts the url_citation annotations from each response. Aggregates citations per query and domain, calculating citation totals and a sample hit rate across the three runs. Sends the unique cited domains to OpenAI’s gpt-4o-mini to classify each domain into a source taxonomy (brand site, competitor site, review platform, community, publisher, or docs/other). Appends the aggregated rows with the domain classification and an example URL to the citations tab in Google Sheets. Setup Add an OpenAI API key as an HTTP Header Auth credential (Authorization: Bearer YOUR_KEY) for both OpenAI HTTP requests. Add a Google Sheets credential with access to the target spreadsheet. Create
Route WhatsApp support requests with Groq, Google Sheets, Gmail, Telegram and AiSensy
Quick overview This workflow receives incoming WhatsApp messages via an n8n webhook, loads an FAQ knowledge base from Google Sheets, and uses Groq (Llama 3.3) to classify intent and generate a reply. It sends the response through the AiSensy API, logs the conversation to Google Sheets, and alerts via Gmail and Telegram. How it works Receives a POST request from AiSensy on a WhatsApp webhook when a customer sends a message. Extracts the customer phone, name, message text, and timestamp, and ignores requests missing required fields. Loads FAQ question-and-answer rows from Google Sheets and sends them with the customer message to Groq (Llama 3.3) to classify intent, detect language and urgency, and draft a reply. Parses and validates the model’s JSON output and formats a safe fallback reply if parsing fails. Sends the generated reply back to the customer using the AiSensy WhatsApp API. Sends a Gmail alert when the intent is COMPLAINT and posts a Telegram alert when the intent is ESCALATE. Appends or updates a conversation log row in Google Sheets and returns a 200 OK webhook response. Setup Configure AiSensy to send message events to this workflow’s webhook URL (path: /whatsapp-suppor
Transform uploaded documents into structured data with Unstructured MCP
Quick overview This workflow collects an uploaded document via an n8n form and uses Unstructured’s hosted Transform MCP server to convert it into structured, LLM-ready text output, then returns the extracted content and basic stats (elements, characters) while handling size limits and transform job polling. How it works Receives a document upload through an n8n form trigger. Checks whether the uploaded file is within the 50 MB limit and shows a “File too large” completion page if it exceeds the cap. Requests a pre-signed upload URL from Unstructured Transform MCP and uploads the file bytes to that URL via HTTP PUT. Starts a transform job in Unstructured Transform MCP, then polls the job status every 5 seconds until it completes or fails. When the job completes, fetches the transform results metadata from Unstructured and verifies a download URL is available. Downloads the extracted output from the signed download URL and returns a formatted response containing the status, source filename, output stats, and extracted content (or a “No content could be extracted” message). Setup Create an Unstructured Transform account and generate an API key, then add it to n8n as an HTTP Bearer Aut
Post daily e-commerce market news from Google News RSS to LinkedIn
Quick overview This workflow runs daily at 9 AM to pull the latest “E-commerce Market” headline from Google News RSS, formats it into a text-only LinkedIn post with a link and hashtags, and publishes it to a LinkedIn personal profile. How it works Runs every day at 9:00 AM based on the schedule trigger. Fetches recent articles for the “E-commerce Market” query from Google News RSS. Sorts the RSS items by publish date and keeps only the newest article. Stops the run if the selected item has no title to avoid posting empty content. Builds the LinkedIn post text by cleaning the title, extracting the source, and appending the article link and hashtags. Creates a text-only post on LinkedIn as the configured person profile. Setup Create or select a LinkedIn OAuth2 credential in n8n and assign it to the LinkedIn node. Replace the placeholder Person URN with your LinkedIn Person URN (for example, urn:li:person:xxxxxxxx) in the LinkedIn post configuration. Confirm the schedule time (9 AM server timezone) and adjust it if needed before activating the workflow.
Log email receipts to Google Sheets with Gmail and OpenAI
Quick Overview This workflow logs Gmail receipt attachments to Google Sheets by extracting structured fields with OpenAI (including category selection from your list), prevents duplicates by checking the ledger, and sends a monthly spending summary email via Gmail based on last month’s rows. How it works Triggers when a Gmail message matching has:attachment subject:receipt arrives or when a schedule runs on the 1st of the month at 8am. For receipt emails, looks up the Gmail message ID in Google Sheets and stops if the receipt is already logged. If the receipt is new, extracts text from PDF attachments or transcribes image receipts using OpenAI vision. Sends the receipt text to OpenAI to extract receipt_date, merchant, amount, currency, and a category chosen only from your predefined category list. Appends one cleaned expense row to Google Sheets with the extracted fields plus a processed timestamp, Gmail message ID, and the original email subject. For the monthly run, reads the full Google Sheets ledger, totals last month’s expenses by category, and emails the summary to you via Gmail. Setup Connect Gmail credentials for the Gmail Trigger and for sending the monthly summary email.
Save Amazon reviews to Notion with ScraperAPI and OpenAI GPT-5 Mini
Quick Overview This workflow runs every Monday to scrape recent Amazon product reviews via ScraperAPI, uses OpenAI to classify sentiment and feature tags, and then saves each new review into a Notion database with structured properties and a formatted page body. How it works Runs every Monday at 8am and loads a configured watchlist of Amazon ASINs plus Notion and locale settings. Fetches Amazon product data (including recent reviews) for each ASIN using ScraperAPI. Extracts reviews from each response and only forwards reviews that have not been seen in previous runs, capped per ASIN. Sends each new review to OpenAI to return a JSON sentiment label, 1–4 feature tags, and a one-sentence summary. Normalizes the AI output, clips long review text to fit Notion limits, and converts the review date into an ISO date. Creates a new page in the target Notion database for each review, filling properties like Sentiment, Stars, Feature tags, Product, Review date, and metadata. Setup Add ScraperAPI credentials and ensure the ScraperAPI Amazon Product (SDE) endpoint is available for your account. Add Notion API credentials, share the target database with your Notion integration, and copy the data
Turn customer emails into FAQ drafts with Gmail, Gemini, Docs and Sheets
Quick overview This workflow monitors customer-support emails in Gmail, uses Google Gemini to extract FAQ-ready questions and draft answers, logs every candidate to Google Sheets, and routes strong candidates to a Google Docs draft while sending unclear or sensitive messages to a Gmail draft for manual review. How it works Triggers every 5 minutes when Gmail finds new messages matching the configured support-style search query. Cleans and normalizes the email metadata and body text to remove signatures and quoted replies. Sends the normalized email content to Google Gemini to extract the customer question, category, urgency, FAQ value score, draft answer, and a recommended action as structured JSON. Logs the extracted FAQ candidate details (including score, tags, and sensitivity flags) to a Google Sheets tab for tracking. Creates a Google Docs FAQ draft and inserts the generated draft content when the candidate meets the score threshold or is marked as reusable. Creates a Gmail draft to the reviewer with the Google Docs link for high-value candidates, or a separate Gmail draft containing review notes for sensitive or unclear emails. Setup Connect credentials for Gmail, Google Gemin
Audit digital identities with Apify BreachHound and PDF.co
Quick overview This workflow starts from an n8n form submission, runs the BreachHound actor on Apify to discover where an email address is registered, then summarizes the results into an HTML audit report and converts it to a downloadable PDF using PDF.co. How it works Receives an email address (and options) when a user submits the n8n form. Sends the submitted inputs to the BreachHound actor on Apify to check the email across online services. Loads the actor’s results from the Apify dataset. Aggregates the dataset into audit statistics and a list of platforms where the email is found. Generates an HTML report containing the totals and a table of found accounts. Converts the HTML report to a PDF using the PDF.co Convert from HTML API and fetches the generated file via HTTP. Setup Connect an Apify API credential and select/configure the BreachHound actor in the Apify “Run an Actor” step. Create a PDF.co account, replace YOUR_API_KEY_HERE with your PDF.co API key, and keep the HTML-to-PDF endpoint settings as needed. Review the form fields and the default options (for example, the “onlyUsed” and “useResidentialProxy” values) to match the audit behavior you want before activating the
Translate YouTube video metadata into multiple languages with OpenAI
Quick overview This workflow fetches a YouTube video’s title and description, uses OpenAI to translate them into multiple target languages, and updates the video’s YouTube localizations via the YouTube Data API, returning a YouTube Studio link to review the translations. How it works Runs manually when you execute the workflow. Reads the configured YouTube video ID, default language, target languages, and OpenAI model. Fetches the video’s current metadata (including existing localizations) from YouTube. Removes the default language from the target language list and prepares the language-code keys required for the translation output. Sends the title and description to OpenAI and parses the response as structured JSON with a translated title and description per language code. Updates the video on YouTube by writing the translated metadata into the video’s localizations via a single YouTube API request. Outputs a YouTube Studio translations URL so you can review the updated localizations. Setup Add YouTube OAuth2 credentials with permission to edit videos on the target channel. Add an OpenAI API key credential and choose a model name in the configuration. Set the video_id, default_lan
Send scheduled quote follow-up emails with Gmail and Google Sheets
Quick Overview This workflow runs daily to read open quotes from Google Sheets, calculates how many days have passed since each quote was sent, and sends the appropriate 3-, 7-, or 14-day follow-up email via Gmail, then writes a sent date back to the sheet to prevent duplicates. How it works Runs every day at 9am on a schedule trigger. Loads your business details, follow-up day offsets, and email subject/body templates from a preset configuration. Reads all quote rows from a Google Sheets spreadsheet. Keeps only quotes with status set to open, calculates days since sent_date, and selects the next due follow-up (day 3, 7, or 14) that has not been sent yet. Sends a plain-text follow-up email through Gmail to each due quote’s customer using the filled template. Updates the matching Google Sheets row (by quote_id) to stamp the corresponding followup_1, followup_2, or followup_3 column with today’s date. Setup Add Google Sheets credentials, select the target spreadsheet and sheet in both Google Sheets steps (read and update). Add Gmail credentials for the mailbox you want to send follow-ups from. Create a quotes sheet with headers quote_id, customer_name, customer_email, quote_amount, s