Gmail + Slack: polished PDF offer letters sent fast
Offer letters shouldn’t feel like a tiny “project” every time you hire. But manually drafting, formatting, exporting to PDF, double-checking email addresses, and sending updates internally turns a 5-minute task into a messy hour.
This Gmail Slack offers automation hits HR managers first, honestly. Recruiters chasing start dates feel it too, and ops leads end up cleaning up the record-keeping after the fact. The outcome is simple: verified candidates get a clean PDF offer fast, and your team gets a Slack confirmation without chasing.
Below you’ll see how the workflow runs in n8n, what it fixes, and what you need to get it live without turning it into a tech project.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Gmail + Slack: polished PDF offer letters sent fast
flowchart LR
subgraph sg0["Compose Offer Letter 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/webhook.dark.svg' width='40' height='40' /></div><br/>Inbound Webhook Trigger"]
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Verify Email Address", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Email Result", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assemble Offer Fields", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "Compose Offer Letter Text", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Create HTML with Signature"]
n6@{ icon: "mdi:location-exit", form: "rounded", label: "Render PDF File", pos: "b", h: 48 }
n7@{ icon: "mdi:message-outline", form: "rounded", label: "Send Offer Email", pos: "b", h: 48 }
n8["<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/>Alert HR Channel"]
n0 --> n1
n6 --> n7
n1 --> n2
n3 --> n4
n2 --> n3
n7 --> n8
n5 --> n6
n4 --> n5
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 n4 ai
class n1,n2 decision
class n0 api
class n5 code
classDef customIcon fill:none,stroke:none
class n0,n5,n8 customIcon
The Problem: Offer Letters Are Easy to Mess Up
Offer letters are one of those tasks that look “simple” until they land on your plate during a busy hiring week. You copy last month’s template, tweak the role and salary, update dates, swap the hiring manager’s name, and then you still worry you missed something. Then there’s formatting. A Google Doc looks fine internally, but candidates expect a crisp PDF that feels official. The worst part is the invisible risk: one wrong email address or typo in compensation creates awkward follow-ups, delays, and trust issues before day one.
It adds up fast. Here’s where it usually breaks down.
- Manual copy-paste from an ATS or form leads to name, date, and salary mistakes that you only notice after sending.
- Unverified candidate emails cause bounces, which means you spend time troubleshooting instead of closing the hire.
- PDF creation becomes a mini workflow of its own, and the “official” version ends up scattered across inboxes and downloads.
- Internal visibility is inconsistent, so someone pings you on Slack anyway asking, “Did the offer go out?”
The Solution: Verified PDF Offer Letters, Sent and Confirmed
This workflow turns offer letters into a controlled, repeatable process. It starts when candidate and job details come in through an n8n webhook (from a form, ATS, or an internal tool). Before anything is sent, the workflow verifies the candidate’s email address using VerifyEmail, so you do not waste time sending documents into the void. Next, OpenAI generates a professional offer letter draft based on your structured inputs (role, salary, start date, company details). That text is wrapped into branded HTML with a signature, converted into a polished PDF, then emailed via Gmail. Finally, the workflow posts a confirmation in Slack so your hiring channel knows it’s done.
The flow is straightforward. Webhook in, email verification gate, AI-generated content, HTML-to-PDF rendering, Gmail delivery, then a Slack alert for internal tracking. You get speed, but you also get consistency.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you send 5 offer letters in a week. Manually, you might spend about 30 minutes drafting, 10 minutes formatting, 5 minutes exporting a PDF, and another 5 minutes sending and updating the team, which is roughly 50 minutes each (about 4 hours weekly). With this workflow, you drop the details into your form or system (about 5 minutes per candidate), wait a couple minutes for generation and PDF rendering, and it’s sent automatically with a Slack confirmation. That’s about 3 hours back in a normal week, and more when hiring ramps up.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Gmail for sending the offer email.
- Slack to post a confirmation message to HR.
- OpenAI API key (get it from your OpenAI dashboard).
- VerifyEmail to validate candidate email deliverability.
- HTMLCSS to PDF for generating a polished PDF file.
Skill level: Beginner. You’ll mostly connect accounts, paste API keys, and edit a couple of text fields (like your email template and offer letter tone).
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Candidate details arrive via webhook. Your form or HR system sends name, email, role, salary, joining date, and company details into n8n to kick things off.
Email verification blocks bad sends. VerifyEmail checks the address first. If the result fails validation, the workflow stops before it creates a “real-looking” PDF that never reaches the candidate.
Offer fields are assembled, then AI writes the letter. n8n standardizes your inputs (so compensation and dates don’t get reformatted weirdly), then OpenAI generates a structured letter you can keep consistent across roles and departments.
HTML becomes a branded PDF, then delivery happens automatically. A code step wraps the content with your signature and layout, HTMLCSS to PDF renders the file, Gmail sends it, and Slack posts a confirmation in the right channel.
You can easily modify the offer letter tone to match your company voice based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the inbound webhook that receives candidate and offer details to start the workflow.
- Add the Inbound Webhook Trigger node as your trigger.
- Set HTTP Method to
POST. - Set Path to
job-offer-generator. - Save the node and copy the generated webhook URL for your form or system to call.
candidateName, candidateEmail, position, department, and salary to validate your webhook setup.Step 2: Connect Email Verification
Verify the candidate’s email address before generating the offer letter.
- Add Verify Email Address and set Email to
={{ $json.body.candidateEmail }}. - Credential Required: Connect your
verifiEmailApicredentials. - Add Validate Email Result and configure the condition to check Boolean is true with Left Value set to
={{ $json.valid }}. - Connect Inbound Webhook Trigger → Verify Email Address → Validate Email Result.
$json.valid is false, the workflow stops before generating the offer letter. Ensure your verification provider is returning the expected schema.Step 3: Set Up Offer Data and AI Drafting
Build the offer data model and generate the offer letter body using AI.
- Add Assemble Offer Fields after Validate Email Result and map fields using expressions:
- Set candidateName to
={{ $('Inbound Webhook Trigger').item.json.body.candidateName }}. - Set candidateEmail to
={{ $('Inbound Webhook Trigger').item.json.body.candidateEmail }}. - Set position to
={{ $('Inbound Webhook Trigger').item.json.body.position }}. - Set department to
={{ $('Inbound Webhook Trigger').item.json.body.department }}. - Set salary to
={{ $('Inbound Webhook Trigger').item.json.body.salary }}and formattedSalary to={{ "$" + Number($('Inbound Webhook Trigger').item.json.body.salary).toLocaleString() }}. - Set joiningDate to
={{ $('Inbound Webhook Trigger').item.json.body.joiningDate }}and offerDate to={{ $now.format('MMMM DD, YYYY') }}. - Set companyName to
Example Corporation, hrName toHR Manager, and hrTitle toHuman Resources Lead. - Add Compose Offer Letter Text, set Model to
gpt-4, and keep Temperature at0.7. - Credential Required: Connect your
openAiApicredentials to Compose Offer Letter Text. - Connect Assemble Offer Fields → Compose Offer Letter Text.
Step 4: Build the PDF and Send Notifications
Transform the AI-generated text into HTML, render a PDF, email it to the candidate, and alert HR in Slack.
- Add Create HTML with Signature and keep the provided JavaScript to build the HTML and signature.
- Add Render PDF File with HTML Content set to
={{ $json.html }}, Output Format set tofile, and Output Filename set todata. - Credential Required: Connect your
htmlcsstopdfApicredentials to Render PDF File. - Add Send Offer Email with Send To set to
={{ $('Assemble Offer Fields').item.json.candidateEmail }}and Subject set to=Job Offer - {{ $('Assemble Offer Fields').item.json.position }} at {{ $('Assemble Offer Fields').item.json.companyName }}. - Keep the HTML email body in Message as provided, which references the offer data via expressions.
- Credential Required: Connect your
gmailOAuth2credentials to Send Offer Email. - Add Alert HR Channel and set Channel to your target channel ID (e.g.,
[YOUR_ID]), keeping the message template as provided. - Credential Required: Connect your
slackApicredentials to Alert HR Channel. - Connect Compose Offer Letter Text → Create HTML with Signature → Render PDF File → Send Offer Email → Alert HR Channel.
Step 5: Test and Activate Your Workflow
Validate the end-to-end flow and enable the workflow for production use.
- Click Execute Workflow and send a test POST request to the Inbound Webhook Trigger URL with valid candidate data.
- Confirm Validate Email Result evaluates true and the workflow continues to Assemble Offer Fields.
- Verify that Render PDF File outputs a PDF and Send Offer Email delivers the email to the candidate.
- Check Slack to confirm Alert HR Channel posts a success message with the document ID.
- When ready, toggle the workflow to Active for production use.
Common Gotchas
- Gmail permissions can be the silent blocker. If sending fails, check the connected Gmail credential in n8n and confirm it still has mail send access.
- 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 minutes if your accounts and API keys are ready.
No. You will connect tools and edit a few text fields like the email subject and the letter tone.
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 usage and any VerifyEmail / PDF rendering costs from your providers.
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 add one extra checkpoint. The easiest approach is to stop after “Compose Offer Letter Text” and send the draft into Slack or Google Docs for review, then only proceed to “Render PDF File” and “Send Offer Email” after approval. Common customizations include changing the offer letter tone, adding a company logo in the HTML template, and updating the Gmail subject line and body copy.
Usually it’s an expired or revoked Google permission on the Gmail credential inside n8n. Reconnect the account, then re-run a test execution. Also check that the sending mailbox matches what your team expects (shared inboxes can be tricky), and keep an eye on Google sending limits if you’re sending a lot in a short window.
Plenty for most small teams: it’s typically limited by your n8n plan, your Gmail sending limits, and how fast your PDF provider renders files.
Often, yes, because this flow isn’t just “send an email.” You’ve got conditional logic (only send if email verification passes), content generation, HTML assembly, and PDF rendering, which is where simpler tools start getting clumsy or expensive. n8n also lets you self-host, which matters when you send lots of offers and don’t want execution caps to dictate hiring ops. Zapier or Make can still work if you keep it lightweight and you don’t need much customization. If you do want approvals, branding control, or more detailed logging, n8n is usually the smoother path. Talk to an automation expert if you want help choosing.
You set this up once, then it just runs. Clean PDFs, verified emails, and a Slack “sent” message that keeps the whole hiring team on the same page.
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.