Google Sheets + Gmail: offer letters sent and filed
Your hiring process shouldn’t fall apart because one candidate forgot to upload an ID or someone can’t find “OfferLetter_Final_FINAL(2).pdf”. But that’s exactly how it goes: lots of tabs, Slack pings, and “just following up” emails that eat up your day.
HR managers feel this when they’re juggling five open roles. Recruiters run into it when they’re moving fast and still need an audit trail. Even an ops lead in a small business ends up doing offer letter automation by hand, one candidate at a time.
This workflow turns Google Sheets into a reliable pipeline: it checks document status, sends reminders, generates a polished PDF offer letter, emails it, stores it in Drive, and updates the sheet so everyone stays aligned.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Google Sheets + Gmail: offer letters sent and filed
flowchart LR
subgraph sg0["Google Sheets Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Google Sheets Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "Get PDF", pos: "b", h: 48 }
n2["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>PDF Generate"]
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/httprequest.dark.svg' width='40' height='40' /></div><br/>Download PDF"]
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/slack.svg' width='40' height='40' /></div><br/>Send a message to Manager"]
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Document Status(If Doc..", pos: "b", h: 48 }
n6["<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 Offer Letter"]
n7@{ icon: "mdi:message-outline", form: "rounded", label: "Send Missing Document Email", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "Change Status", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "Upload Offer Letter", pos: "b", h: 48 }
n10@{ icon: "mdi:database", form: "rounded", label: "Add Offer Letter in Sheet", pos: "b", h: 48 }
n11@{ icon: "mdi:message-outline", form: "rounded", label: "Send Offer Letter To Candidate", pos: "b", h: 48 }
n12@{ icon: "mdi:database", form: "rounded", label: "Change Status in Sheet", pos: "b", h: 48 }
n1 --> n3
n3 --> n9
n3 --> n11
n3 --> n4
n2 --> n1
n6 --> n2
n9 --> n10
n0 --> n5
n4 --> n12
n7 --> n8
n5 --> n7
n5 --> n6
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 n5 decision
class n8,n10,n12 database
class n2,n3 api
class n6 code
classDef customIcon fill:none,stroke:none
class n2,n3,n4,n6 customIcon
Why This Matters: Offer Letters Get Stuck in the Middle
Offer letters are “simple” until they aren’t. One candidate is missing a document, another needs a salary line updated, and the hiring manager wants confirmation the offer actually went out. Meanwhile the source of truth (your spreadsheet) is out of date because updating it is the last step, and the last step never happens when you’re busy. So you re-check the same rows, resend the same emails, and hunt through Drive for the right PDF. It’s not hard work. It’s draining work.
The friction compounds. Here’s where things usually break down.
- You spend about 20 minutes per candidate chasing missing documents through email threads.
- Offer letters get generated inconsistently, which means more revisions and slower approvals.
- Files end up scattered across inboxes and Drive folders, so nobody trusts where the final PDF lives.
- Status in Google Sheets lags behind reality, and that creates awkward “did we send this?” moments.
What You’ll Build: A Self-Updating Offer Letter Pipeline
This workflow watches your candidate tracker in Google Sheets and reacts the moment a row is updated. First, it checks the candidate’s document status. If anything is missing, it automatically sends a reminder email through Gmail, updates the sheet to a “Documents_Pending” state, and stops there (no accidental offer letters sent early). Once documents are complete, it generates a customized offer letter using the candidate data (role, salary, contact info), converts the HTML into a clean PDF via an HTTP request to a conversion service, and retrieves the final file. Then it emails the PDF to the candidate, alerts the hiring manager in Slack, uploads the letter to Google Drive, and writes the Drive link back into the same Google Sheet. The sheet stays accurate without you babysitting it.
The workflow starts with a Sheets update and a document check. It branches into either “send reminder + mark pending” or “generate PDF + deliver + file.” Finally, it records the link and marks the candidate as Offer_Sent so your pipeline stays trustworthy.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you hire 5 people this month. Manually, each offer typically takes about 20 minutes to verify docs, 15 minutes to format/export a PDF, 10 minutes to email, and another 10 minutes to file it and update the sheet, so roughly 1 hour per hire. With this workflow, you update one row in Google Sheets and the rest runs in the background: a minute to trigger, a short wait for PDF conversion, then it’s delivered, stored, and logged automatically. That’s about 5 hours back in a month, plus fewer mistakes.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for candidate tracker and statuses.
- Gmail to send reminders and offer letters.
- ConvertAPI credentials (get the API key from your ConvertAPI dashboard)
Skill level: Beginner. You’ll connect accounts and edit a few template fields, but you won’t be writing a bunch of code.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A candidate row changes in Google Sheets. The workflow monitors your tracker, so when you update a candidate’s document status or move them forward, it kicks off immediately.
Document status gets reviewed. An “If” check looks for missing onboarding documents and decides what happens next, so you don’t accidentally generate an offer letter for someone who isn’t ready.
Either a reminder goes out or an offer letter is created. If documents are pending, Gmail sends a clear reminder and the sheet is updated to Documents_Pending. If documents are complete, a code step composes the offer letter content, then an HTTP request sends it to the PDF conversion service and retrieves the finished file.
The PDF is delivered, stored, and logged. The candidate receives the offer letter via Gmail, the hiring manager gets a Slack notification, Google Drive stores the PDF, and Google Sheets records the Drive link and marks the candidate as Offer_Sent.
You can easily modify the email copy and the offer letter template to match your brand voice based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Google Sheets Trigger
This workflow starts when a row changes in your onboarding spreadsheet.
- Add and open Sheets Change Watcher.
- Set Document to
[YOUR_ID]and Sheet Name toSheet1(gid=0). - Set Poll Times to
Every Minute. - Credential Required: Connect your Google Sheets credentials.
Step 2: Connect Google Sheets for Status Routing
The workflow checks document status and routes candidates into the correct path.
- Open Review Document Status and set the condition to Document Status equals
Pendingusing{{ $json["Document Status"] }}. - Ensure the false branch of Review Document Status goes to Compose Offer Letter for approved candidates.
- Credential Required: Connect your Google Sheets credentials for downstream nodes Update Pending Status, Record Letter Link, and Mark Offer Sent.
⚠️ Common Pitfall: If the Document Status column uses a different value than Pending, the routing won’t work. Match the exact text in your sheet.
Step 3: Set Up Offer Letter Generation & PDF Conversion
Approved candidates trigger HTML generation and PDF conversion.
- Open Compose Offer Letter and review the embedded HTML template in JavaScript Code. Update company details like
Example Company,[YOUR_EMAIL], and[YOUR_PHONE]as needed. - In PDF Conversion Call, set URL to
https://v2.convertapi.com/convert/html/to/pdfand Method toPOST. - Keep Body Parameters with
StoreFile=trueandFilemapped todata. - Set the Authorization header to
[CONFIGURE_YOUR_TOKEN]in PDF Conversion Call. - In Parse PDF Output, set Operation to
fromJson. - In Retrieve PDF File, set URL to
{{ $json.data.Files[0].Url }}.
⚠️ Common Pitfall: If ConvertAPI credentials are missing or invalid, PDF Conversion Call will return an error and no PDF will be generated.
Step 4: Configure Output Actions (Email, Drive, Slack, Sheets)
After the PDF is retrieved, the workflow sends notifications, stores the file, and updates the spreadsheet. Retrieve PDF File outputs to Upload Letter to Drive and Email Offer Letter and Notify Manager Channel in parallel.
- In Email Offer Letter, set Send To to
{{ $('Review Document Status').item.json.Email }}and confirm the subject🎉 Congratulations! Your Offer Letter from Example Company. - Credential Required: Connect your Gmail credentials for Email Offer Letter and Dispatch Missing Docs Email.
- In Upload Letter to Drive, set Name to
{{ $('Review Document Status').item.json['Candidate ID'] }}and choose your Folder ID as[YOUR_ID]. - Credential Required: Connect your Google Drive credentials.
- In Notify Manager Channel, set Channel to
[YOUR_ID]and keep the message template using{{ $('Review Document Status').item.json.Name }}and{{ $('Review Document Status').item.json.Profession }}. - Credential Required: Connect your Slack credentials.
- In Record Letter Link, set Candidate ID to
{{ $('Review Document Status').item.json['Candidate ID'] }}and Offer Letter Link to{{ $json.webViewLink }}. - In Mark Offer Sent, set Candidate Status to
Offer_Sentand match on Candidate ID.
⚠️ Common Pitfall: If the Drive upload fails, Record Letter Link will not receive webViewLink and the sheet update will be incomplete.
Step 5: Configure the Missing Documents Email Path
When documents are still pending, the workflow sends a reminder and updates the sheet.
- Open Dispatch Missing Docs Email and verify Send To uses
{{ $json.Email }}. - Keep the Subject as
Reminder:{{ $json.Name }} Please submit your pending documents to proceed with your offerand verify the pending documents section uses{{ $json['Pending Documents'] }}. - In Update Pending Status, set Candidate Status to
Documents_Pendingand match on Candidate ID using{{ $('Review Document Status').item.json["Candidate ID"] }}. - Credential Required: Connect your Google Sheets credentials.
Step 6: Test and Activate Your Workflow
Validate both the pending-docs and approved-docs paths before going live.
- Manually run the workflow with a test row where Document Status is
Pendingand confirm Dispatch Missing Docs Email sends and Update Pending Status updates the sheet. - Run again with Document Status not equal to
Pendingand confirm Compose Offer Letter → PDF Conversion Call → Parse PDF Output → Retrieve PDF File completes, then check the parallel actions (Drive upload, candidate email, and Slack notification). - Check that Record Letter Link and Mark Offer Sent update the candidate’s row in your sheet.
- When everything works, toggle the workflow to Active for production use.
Troubleshooting Tips
- Google Sheets credentials can expire or need specific permissions. If things break, check the n8n Credentials screen and confirm the Google account still has access to the spreadsheet.
- 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.
Quick Answers
About 30 minutes if your accounts are already connected.
No. You’ll mostly copy in an offer letter template and map fields from Google Sheets.
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 ConvertAPI usage (typically a small per-file cost, depending on your plan).
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, and you should. You can replace Gmail with a shared inbox setup (still Gmail, just different credentials), tweak the “Compose Offer Letter” code step to match your contract language, and change the Google Drive folder destination in the upload step. Some teams also add a manager approval checkpoint by inserting a Slack message and only sending the offer after a reaction or a manual status change in Google Sheets.
Usually it’s an expired Google authorization or the sheet moved to a Drive location your connected account can’t access. Reconnect Google Sheets in n8n, then re-select the spreadsheet in the nodes that reference it. Also check that the trigger still points to the right document and worksheet tab, because renaming tabs can break lookups.
For most small teams, dozens of candidates per week is fine.
For this workflow, n8n has a few advantages: more complex logic with branching at no extra cost, a self-hosting option for unlimited executions, and easier handling of “generate file then fetch file” patterns through HTTP requests. Zapier or Make can still do parts of this, but file conversion plus reliable status updates tends to get fiddly. If you only need “send an email when a row changes,” they may be quicker. If you want the full lifecycle with reminders, PDF generation, Drive filing, and a clean audit trail, n8n is usually the smoother build. Talk to an automation expert if you’re not sure which fits.
Once this is running, your spreadsheet stops being a wish and starts being the record. The workflow handles the repetitive follow-ups and filing so you can focus on the actual hiring decisions.
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.