Gmail to Google Sheets, booking requests logged clean
Booking requests land in Gmail. Then the busywork starts: open the email, download the PDF, copy dates and room counts, and hope you didn’t miss the VIP note buried in a paragraph.
This Gmail Sheets logging automation hits hotel managers hardest, but travel agency coordinators and small hospitality ops teams feel it too. You get clean rows in Google Sheets, routing that matches your rules, and fewer “we never saw that request” disasters.
Below you’ll see what the workflow does, what results to expect, and what you’ll need to run it reliably (including the safety nets that keep bookings from slipping through).
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Gmail to Google Sheets, booking requests logged clean
flowchart LR
subgraph sg0["Look for incoming emails Flow"]
direction LR
n0@{ icon: "mdi:swap-horizontal", form: "rounded", label: "IF (Guardrail Check)", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Merge Sanitized Data", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Invalid Email Error", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Log Invalid Email Error", pos: "b", h: 48 }
n4@{ icon: "mdi:message-outline", form: "rounded", label: "Send Invalid Email Notificat..", pos: "b", h: 48 }
n5@{ icon: "mdi:robot", form: "rounded", label: "OpenAI Model for Email Text2", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "Guardrails", pos: "b", h: 48 }
n7@{ icon: "mdi:robot", form: "rounded", label: "OpenAI Model for PDF", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Booking Emails", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check for Attachment", pos: "b", h: 48 }
n10@{ icon: "mdi:cog", form: "rounded", label: "Extract Attachment Data", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Configuration: User Settings", pos: "b", h: 48 }
n12@{ icon: "mdi:message-outline", form: "rounded", label: "Get many messages (1)", pos: "b", h: 48 }
n13@{ icon: "mdi:play-circle", form: "rounded", label: "Look for incoming emails", pos: "b", h: 48 }
n14["<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/>Validate Extraction"]
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Apply Business Rules"]
n16@{ icon: "mdi:database", form: "rounded", label: "Log Error to Sheet", pos: "b", h: 48 }
n17@{ icon: "mdi:message-outline", form: "rounded", label: "Send Error Notification", pos: "b", h: 48 }
n18@{ icon: "mdi:robot", form: "rounded", label: "Guardrails1", pos: "b", h: 48 }
n19@{ icon: "mdi:database", form: "rounded", label: "Log Team Assignment", pos: "b", h: 48 }
n20@{ icon: "mdi:database", form: "rounded", label: "Append to Cases Sheet", pos: "b", h: 48 }
n21@{ icon: "mdi:message-outline", form: "rounded", label: "Send Confirmation Email", pos: "b", h: 48 }
n22@{ icon: "mdi:database", form: "rounded", label: "Log Success Metrics", pos: "b", h: 48 }
n23@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check for Errors", pos: "b", h: 48 }
n24@{ icon: "mdi:brain", form: "rounded", label: "GEMINI 2.5 FLASH", pos: "b", h: 48 }
n25@{ icon: "mdi:brain", form: "rounded", label: "CHAT GPT 5 mini", pos: "b", h: 48 }
n6 --> n1
n18 --> n11
n25 -.-> n7
n25 -.-> n5
n23 --> n15
n23 --> n16
n24 -.-> n18
n16 --> n17
n14 --> n23
n15 --> n19
n15 --> n6
n9 --> n10
n9 --> n5
n0 --> n8
n0 --> n2
n1 --> n20
n7 --> n14
n20 --> n21
n8 --> n9
n12 --> n18
n10 --> n7
n3 --> n4
n21 --> n22
n2 --> n3
n13 --> n12
n11 --> n0
n5 --> n14
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 n13 trigger
class n5,n6,n7,n18 ai
class n24,n25 aiModel
class n0,n8,n9,n23 decision
class n3,n16,n19,n20,n22 database
class n14,n15 code
classDef customIcon fill:none,stroke:none
class n14,n15 customIcon
The Problem: Booking Emails Turn Into Manual Data Entry
Most booking requests aren’t “nice” data. They’re messy emails, forwarded chains, and PDFs with details scattered across paragraphs. Someone still has to turn that into a usable case: dates, room count, guest name, agency contact, special requests, and internal notes. And because it’s manual, it’s fragile. You’ll miss an attachment. You’ll paste a date wrong. Or worse, a request sits in an inbox because it didn’t look urgent at first glance. That’s how revenue leaks without anyone noticing.
The friction compounds. Especially when volume spikes.
- Each booking request becomes a mini project: read, extract, reformat, log, and assign someone to respond.
- When details come in PDFs, copy-paste isn’t just slow, it’s error-prone and hard to review later.
- Sensitive data can accidentally end up in a shared sheet, which creates a compliance and trust problem.
- If a workflow breaks silently, the cost is real: a missed booking and an awkward “we didn’t receive it” follow-up.
The Solution: Gmail + Google Sheets Booking Case Automation
This workflow watches your Gmail for incoming booking emails, then acts like a reliable intake coordinator that never gets tired. First, it filters out irrelevant messages (so you don’t waste AI spend on noise). If the email looks like a reservation request, it pulls the message content and checks for attachments. When there’s a PDF, it extracts the file and reads it. Then OpenAI helps convert the unstructured email text and PDF content into structured fields you can actually use in operations. After that, business logic kicks in to route the case to the right team based on urgency, number of rooms, and VIP status. Finally, it sanitizes sensitive details, appends clean rows to Google Sheets, sends confirmations, and logs success metrics or errors so nothing vanishes.
The workflow starts with a Gmail trigger and a “gatekeeper” check. AI extracts the booking details from the email body and (when present) the PDF attachment, then your routing rules assign the case and Sheets tabs get updated. Confirmations and alerts are sent via Gmail, which keeps everyone in the loop without manual chasing.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you receive 15 booking requests a week, and each one takes about 12 minutes to open, download any PDF, pull details, and log it into a sheet. That’s roughly 3 hours a week of pure intake work, before anyone even responds. With this automation, the “work” becomes reviewing the logged case and responding: maybe 1 minute to skim the extracted fields, plus a quick correction if something looks off. You’re still in control, but the copy-paste part mostly disappears.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Gmail to receive and send booking emails
- Google Sheets to store cases, routing, metrics
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Intermediate. You’ll connect accounts, paste your Sheet ID, and adjust a few routing rules safely.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A booking email arrives in Gmail. The workflow triggers on new messages, then retrieves the email content for evaluation. Not everything should be processed, so it checks early for relevance.
Noise gets filtered out fast. A guardrail step and condition checks stop newsletters, spam, and non-reservation messages from going further. That matters because AI extraction costs money, and you want spend tied to real cases.
AI extracts structured fields from email and PDFs. If a PDF is attached, the workflow extracts and reads it, then the AI agent pulls out fields like check-in date, room count, contact details, and special requests. The output is validated so partial or broken responses don’t quietly corrupt your sheet.
Routing rules and secure logging happen automatically. Your business logic assigns a team and priority, special requests are sanitized to remove PII, and the final record is appended to your Google Sheets tabs (Cases, Team Assignments, Success Metrics, and Error Logs). Confirmation or alert emails go out through Gmail, so the right people see the right thing at the right time.
You can easily modify the routing thresholds to match your internal process based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Gmail Trigger
Set up the workflow to watch your inbox for new booking emails on a schedule.
- Add and open Incoming Email Watcher.
- Set Filters → Label IDs to
INBOX. - Set Poll Times to
everyHour. - Credential Required: Connect your Gmail credentials.
Step 2: Connect Gmail and Retrieve Messages
Fetch the full email content and attachments for downstream processing.
- Open Retrieve Email Messages.
- Set Operation to
getAlland Limit to1. - Enable Options → Download Attachments to
true. - Credential Required: Connect your Gmail credentials.
Step 3: Set Up Guardrails and Initial Filtering
Screen incoming content for safety and booking relevance before processing.
- In Content Safety Guard, set Text to
{{ $('Retrieve Email Messages').item.json.text }}. - Confirm the guardrails include NSFW and topical alignment thresholds (already configured in the node).
- Open Settings: User Config and set gSheetID to your spreadsheet ID and adminEmailForErrors to your admin email (e.g.,
[YOUR_ID],[YOUR_EMAIL]). - In Guardrail Condition Check, verify the conditions check
{{ $json.checks[0].triggered }}and{{ $json.checks[1].triggered }}are both false. - In Filter Reservation Emails, confirm the subject filters use
{{ $('Incoming Email Watcher').item.json.Subject }}and keywords likeBooking Request,reservation, andbooking.
Step 4: Set Up AI Extraction for Email Body and PDF
Use AI to extract booking details from either the email body or attached PDF.
- In Attachment Presence Check, confirm the condition checks
{{ Object.keys($binary || {}).length }}>0. - In Extract PDF Attachment, set Operation to
pdfand Binary Property Name to{{ Object.keys($json.binary || {})[0] || 'attachment_0' }}. - In AI Extract PDF Data, set Text to
{{ $json.text }}and keep Prompt Type asdefinewith output parser enabled. - In AI Extract Email Body, set Text to
{{ $('Retrieve Email Messages').item.json.text }}and keep Prompt Type asdefinewith output parser enabled.
Step 5: Validate and Route Booking Data
Validate extracted JSON and apply routing rules for team assignment and priority.
- Open Validate AI Output and confirm it checks required fields and date logic in the provided JavaScript.
- In Check Error Flag, verify it checks
{{ $json.error_occurred }}is false before continuing. - Open Apply Routing Rules and replace all
[YOUR_EMAIL]placeholders with real team emails. - Note that Apply Routing Rules outputs to both Record Team Assignment and Sanitize Special Requests in parallel.
Step 6: Sanitize Requests and Append Records
Remove sensitive data from special requests and record cases in Google Sheets.
- In Sanitize Special Requests, keep Operation as
sanitizeand ensure PII guardrail includesCREDIT_CARD. - In Combine Sanitized Fields, set special_requests to
{{ $('Sanitize Special Requests').item.json.sanitized_text }}. - In Append Case Records, confirm Sheet Name is
Casesand Document ID is{{ $('Settings: User Config').item.json.gSheetID }}.
Step 7: Send Confirmation and Track Metrics
Send confirmation emails and record success metrics after the case is appended.
- In Send Booking Confirmation, set Send To to
{{ $json.contact_email }}and Subject toBooking Request Received - Ref #{{ $json.case_id }}. - Keep the HTML email in Message as provided to include booking details and priority styling.
- In Track Success Metrics, verify Sheet Name is
Success Metricsand Document ID is{{ $('Settings: User Config').item.json.gSheetID }}. - Credential Required: Connect your Gmail credentials for Send Booking Confirmation.
Step 8: Add Error Handling
Log invalid emails and processing errors, then notify admins.
- From Guardrail Condition Check, confirm invalid emails flow to Define Invalid Email Error → Record Invalid Email Error → Dispatch Invalid Email Alert.
- In Define Invalid Email Error, keep error_message as
{{ $json.is_aligned === false ? "Email is off-topic." : "Email contains NSFW content." }}. - From Check Error Flag (false branch), confirm the flow to Log Processing Error → Send Processing Alert.
- Credential Required: Connect your Gmail credentials for Dispatch Invalid Email Alert and Send Processing Alert.
Step 9: Test and Activate Your Workflow
Verify end-to-end behavior before enabling hourly monitoring.
- Click Execute Workflow and send a test email with and without a PDF attachment to the monitored inbox.
- Confirm Append Case Records and Record Team Assignment append new rows in the correct sheets.
- Verify Send Booking Confirmation delivers a confirmation email and Track Success Metrics logs a success row.
- Test a non-booking email to ensure Define Invalid Email Error and Dispatch Invalid Email Alert trigger correctly.
- When satisfied, toggle the workflow to Active for production use.
Common Gotchas
- Gmail credentials can expire or need specific permissions. If things break, check your n8n Credentials page and Google account security settings first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About an hour if your Gmail, Sheets, and OpenAI accounts are ready.
No. You’ll mostly connect accounts and paste your Google Sheet ID. The only “code” is optional routing logic you can keep as-is to start.
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, which are usually a few cents per booking depending on email and PDF length.
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 plan the structure first. You can route by property using the “Filter Reservation Emails” keywords plus the “Apply Routing Rules” logic, then write to separate tabs (or separate Sheets) by changing the Google Sheets nodes that append cases and team assignments. Common customizations include per-property VIP rules, different priority thresholds based on season, and different confirmation templates in the Gmail nodes.
Usually it’s expired OAuth permissions or the wrong Gmail account connected in n8n. Reconnect Gmail in n8n Credentials, then re-test the trigger with a fresh booking email. If it still fails, check that your Google Workspace security settings allow the integration and that you’re not hitting Gmail API limits during high-volume periods.
A lot, as long as your AI and Gmail quotas support it.
For messy booking emails and PDFs, n8n is often the better fit because you can validate AI output, branch on errors, scrub PII, and keep a real audit trail in Google Sheets without fighting platform limits. Zapier and Make can work, but advanced parsing plus “safety net” error paths tend to get expensive and awkward as volume grows. Another advantage is control: self-hosting means executions aren’t priced per task the same way. If your process is truly simple (plain-text emails, no PDFs, no routing), Zapier may be faster to set up. Talk to an automation expert if you want a quick recommendation for your exact intake flow.
Once this is running, booking intake stops being a bottleneck and becomes a reliable system. The workflow handles the repetitive stuff so your team can focus on confirmations, upsells, and guest experience.
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.