Gmail + Google Sheets: approvals tracked, no chasing
You write the draft, send it for review, and then the waiting game starts. Somewhere between “Looks good” and “Can you tweak this?”, decisions get buried in inbox threads and you end up nudging people like it’s a part-time job.
Marketing managers feel it when content calendars slip. Agency owners feel it when clients “approved it”… but nobody can find where. And if you run a lean team, Gmail approvals tracking becomes the difference between shipping weekly content and constantly playing catch-up.
This n8n workflow sends drafts for approval through Gmail and logs every decision in Google Sheets. You’ll see what it does, what you need, and what kind of time and sanity you get back.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Gmail + Google Sheets: approvals tracked, no chasing
flowchart LR
subgraph sg0["📥 Content Request Form Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>📥 Content Request Form"]
n1@{ icon: "mdi:robot", form: "rounded", label: "🤖 Generate AI Content", pos: "b", h: 48 }
n2@{ icon: "mdi:brain", form: "rounded", label: "OpenAI GPT-4o", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>🔗 Generate Review Links"]
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>📧 Create Review Email"]
n14@{ icon: "mdi:database", form: "rounded", label: "Log to Tracking Sheet", pos: "b", h: 48 }
n15@{ icon: "mdi:swap-vertical", form: "rounded", label: "Prepare Request Data", pos: "b", h: 48 }
n16@{ icon: "mdi:database", form: "rounded", label: "Update Sheet with Draft", pos: "b", h: 48 }
n17["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Process Generated Content"]
n18@{ icon: "mdi:message-outline", form: "rounded", label: "✉️ Send Review Request", pos: "b", h: 48 }
n2 -.-> n1
n15 --> n14
n14 --> n1
n16 --> n3
n4 --> n18
n1 --> n17
n17 --> n16
n0 --> n15
n3 --> n4
end
subgraph sg1["Flow 2"]
direction LR
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>🔔 Review Action Webhook"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check: Approve?", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check: Reject?", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "✅ Update: Approved", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "❌ Update: Rejected", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "✏️ Update: Needs Edit", pos: "b", h: 48 }
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond: Approved"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond: Edit Requested"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Respond: Rejected"]
n7 --> n9
n6 --> n8
n6 --> n10
n8 --> n11
n9 --> n13
n10 --> n12
n5 --> n6
n5 --> n7
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n1 ai
class n2 aiModel
class n6,n7 decision
class n14,n16,n8,n9,n10 database
class n5,n11,n12,n13 api
class n3,n4,n17 code
classDef customIcon fill:none,stroke:none
class n0,n3,n4,n17,n5,n11,n12,n13 customIcon
The Problem: Approvals Live in People’s Inboxes
Content approvals sound simple until you do them at scale. A draft gets written (sometimes by AI), it gets emailed, someone replies with “Approved” but also adds a note, and now nobody is sure what the “final” version is. Next week, you’re looking back for proof of approval, and all you have is a half-remembered Gmail thread and a comment like “ship it.” It’s not just wasted time. It’s missed deadlines, rework, and that quiet stress of not knowing what’s actually approved.
The friction compounds. Here’s where it breaks down in real teams.
- Approval decisions get scattered across reply chains, forwards, and “quick yes” messages that never make it into your tracker.
- Someone asks, “What’s the status?” and you spend 15 minutes searching Gmail, then updating a Sheet after the fact.
- Edits come in as vague feedback, so the writer makes changes, but there’s no timestamped record of what was requested.
- When a client disputes what was approved, you have no clean audit trail to point to.
The Solution: Automated Draft Creation + Click-to-Approve Tracking
This workflow ties the whole loop together: request, draft, review, and decision. A content request comes in through a simple form (topic, tone, keywords), and GPT‑4o generates a draft plus a quality score from 0–100. The workflow then creates unique review links and sends a clean Gmail message to your reviewer with options to approve, request changes, or reject. When they click, n8n captures the action instantly and writes it back to Google Sheets with a timestamp and status. No copy-pasting feedback. No “did you see my email?” follow-ups.
The workflow starts with your intake form and turns it into a structured request row in Sheets. From there, AI generates the draft, the reviewer gets a single email that’s easy to act on, and every outcome is logged automatically so you can see the truth at a glance.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you run 10 drafts a week through review. Manually, it’s usually 10 minutes to send the email, another 10 minutes to chase a response later, and about 5 minutes to update your tracking sheet, so you’re burning roughly 4 hours weekly on admin. With this workflow, submitting the request takes about 5 minutes, the email is sent automatically, and the decision logs itself when the reviewer clicks. You still do the human part (review), but the busywork basically disappears.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for status tracking and audit trail
- Gmail (Google Workspace) to send reviewer emails
- OpenAI API key (get it from the OpenAI dashboard)
Skill level: Intermediate. You’ll connect accounts, set three variables, and test a webhook form submission.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A request triggers everything. A form submission arrives with the topic, tone, and keywords, and the workflow formats that info into a clean record you can track.
The draft is generated and structured. GPT‑4o creates the first version and outputs a quality score (0–100), which gets packaged into a consistent draft format so reviewers aren’t reading a messy blob of text.
Review links are created inside n8n. The workflow builds unique URLs for approve, edit requested, or reject, then composes a reviewer-friendly email in Gmail.
Clicks become tracked decisions. When the reviewer chooses an action, a webhook captures it and updates Google Sheets with the status and timestamp, then shows a simple confirmation page back to the reviewer.
You can easily modify the model choice and the quality scoring weights based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the intake form that starts the workflow and captures the content requirements.
- Add or open 📥 Content Intake Form and set Path to
79adff4f-bffa-47ef-9e28-6bad05d94d89. - Set Form Title to
🎨 AI Content Request. - Set Form Description to
Submit your content requirements and let AI create the first draft. You'll review and approve before publishing.. - Confirm the form fields match the defined options (Content Type, Topic / Title, Target Audience, Key Points / Requirements, Tone of Voice, Word Count, Reviewer Email, Priority).
Step 2: Connect Google Sheets
Configure the tracking sheet and make sure all Google Sheets nodes are authenticated and point to the correct document.
- Open Record to Tracking Sheet and set Operation to
append, Sheet Name toContent Requests, and Document ID to your spreadsheet ID (replace[YOUR_ID]). - Credential Required: Connect your googleSheetsOAuth2Api credentials in Record to Tracking Sheet.
- Open Update Draft in Sheet and set Operation to
update, Sheet Name toContent Requests, and Document ID to your spreadsheet ID. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Update Draft in Sheet.
- For the remaining Google Sheets nodes (✅ Mark as Approved, ❌ Mark as Rejected, ✏️ Mark Needs Changes), verify Operation is
updateand each uses Sheet NameContent Requestswith your spreadsheet ID. - Credential Required: Add googleSheetsOAuth2Api credentials to ✅ Mark as Approved, ❌ Mark as Rejected, and ✏️ Mark Needs Changes (these nodes require credentials but have none configured).
[YOUR_ID] in any Sheets node will cause update/append failures. Replace it everywhere.Step 3: Set Up the AI Draft Generation
Configure the AI prompt and connect the OpenAI model to generate the initial content draft.
- Open Assemble Request Details and keep the assignments that generate IDs and timestamps, including requestId set to
{{ 'REQ-' + $now.format('yyyyMMdd-HHmmss') }}, createdAt set to{{ $now.toISO() }}, and wordTarget set to{{ $json.wordCount === 'Short (300-500 words)' ? 400 : $json.wordCount === 'Medium (800-1200 words)' ? 1000 : 2000 }}. - In 🤖 Create AI Draft, set Prompt Type to
defineand keep the prompt text exactly as defined to preserve the instructions and variable mapping. - Open OpenAI GPT-4o Chat and set Model to
gpt-4owith Temperature0.7and Max Tokens3000. - Credential Required: Connect your openAiApi credentials in OpenAI GPT-4o Chat. This node is connected as the language model for 🤖 Create AI Draft, so credentials are applied there.
- In Structure Draft Output, keep the JavaScript to calculate wordCount, qualityScore, and generate status
pending_review.
Step 4: Configure Review Email Output
Build review URLs, compose the HTML email, and send it to the reviewer.
- In 🔗 Build Review URLs, keep the base URL logic and ensure your environment variable
WEBHOOK_URLis set or replacehttps://your-n8n-instance.comwith your live n8n URL. - In 📧 Compose Review Email, keep the HTML template so the action buttons map to
${data.reviewLinks.approve},${data.reviewLinks.requestEdit}, and${data.reviewLinks.reject}. - Configure ✉️ Dispatch Review Email with Send To
{{ $json.reviewerEmail }}, Subject🎨 AI Content Ready: {{ $json.title }}, and Message{{ $json.htmlEmail }}. - Credential Required: Connect your gmailOAuth2 credentials in ✉️ Dispatch Review Email.
Step 5: Configure Review Actions and Routing
Set up the webhook that handles approve/reject actions and ensures updates are written to the tracking sheet with the correct response pages.
- Open 🔔 Review Action Hook and set Path to
f077ff3f-1a68-4c38-a010-527f8d519e96with Response ModeresponseNode. - Confirm Validate Approval? checks leftValue
{{ $json.query.action }}equalsapprove. - Confirm Validate Rejection? checks leftValue
{{ $json.query.action }}equalsreject. - 🔔 Review Action Hook outputs to both Validate Approval? and Validate Rejection? in parallel.
- For approved items, verify ✅ Mark as Approved writes Status
approved, Approved At{{ $now.toISO() }}, and Review StatusApproved, then returns Reply: Approved Page. - For rejected items, verify ❌ Mark as Rejected writes Status
rejectedand Review StatusRejected, then returns Reply: Rejection Page. - For edit requests, confirm the second output from Validate Approval? routes to ✏️ Mark Needs Changes, then returns Reply: Edit Requested.
Step 6: Test and Activate Your Workflow
Run a full test from form submission to approval to validate the end-to-end flow.
- Click Execute Workflow and submit the 📥 Content Intake Form with sample data.
- Confirm rows are appended in Record to Tracking Sheet and later updated by Update Draft in Sheet with status
pending_reviewand quality metrics. - Check that ✉️ Dispatch Review Email sends the HTML email and the action buttons open the correct review links.
- Click each action link (approve, reject, edit) and verify the sheet updates in ✅ Mark as Approved, ❌ Mark as Rejected, or ✏️ Mark Needs Changes and the browser receives the correct response page.
- When satisfied, toggle the workflow to Active to run it in production.
Common Gotchas
- Google Sheets permissions can be picky with shared drives. If updates fail, check the Google connection in n8n and confirm the Sheet is accessible to the connected account.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30–45 minutes if your Google and OpenAI accounts are ready.
No. You’ll mostly connect accounts and paste in a Sheet ID and reviewer email. There is a little configuration, but it’s not “developer only.”
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs (often a few dollars a month for light drafting).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but you’ll want to adjust the “Build Review URLs” and email composition logic so it routes to the right reviewer in the right order. Common customizations include adding a second reviewer, sending “edit requested” feedback back to the requester, and changing the quality-score threshold that decides which drafts need extra scrutiny. If you keep the Google Sheets status field consistent, reporting stays simple.
Usually it’s an OAuth permission issue or the wrong Google account connected. Reconnect Gmail in n8n, confirm you’re using the intended Workspace account, and check the n8n credential’s access scope. If emails are sending but links don’t work, the issue is often the webhook URL you set in the workflow variables.
A lot. On n8n Cloud, it depends on your monthly execution limit, and on self-hosted it mostly depends on your server. Practically, teams run dozens of drafts a day without issues as long as you keep your Google and OpenAI connections healthy.
Often, yes. This flow needs branching logic (approve vs. reject vs. edit requested) and clean webhook handling, which n8n does without turning every “if” into another paid task. You also get the self-hosting option, which is a big deal if you run lots of approvals. Zapier or Make can still be fine for a tiny process, like “send email then update a row,” but the moment you want an audit trail that’s reliable, n8n is usually the calmer choice. If you’re unsure, Talk to an automation expert and get a quick recommendation.
Once this is running, approvals become a system instead of a scavenger hunt through Gmail. The workflow handles the repetitive tracking so you can focus on shipping better content.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.