๐ Template #21594: Generate Indian CTC Offer Letters with DevDeskApp, Google Docs, Gmail and Slack โ
๐ Template on n8n.io: n8n.io/workflows/21594

๐ฏ Overview โ
Drafting offer letters by hand is slow, and compensation figures copied from spreadsheets drift. This template takes a candidate row (from the sample node or a Google Sheets trigger) and:
- Estimates pay with DevDeskApp CTC to In-Hand Salary: monthly gross, basic, employee and employer PF, PT, TDS and in-hand.
- Creates an offer token (UUID v4) and a candidate slug such as
ananya-roy-principal-devops-engineer. - Fingerprints the compensation with SHA-256, so the figures in the letter can be checked later.
- Checks the offer with an If node, then fills a Google Docs template, emails it with Gmail and posts to HR Slack. Invalid offers go to a compliance alert instead.
Known issue in the published version (checked 4 Nov 2026)
In Format Offer Letter Document Payload, three fields read top-level keys that the DevDeskApp node does not return, so the letter shows โน0 for basic salary, PF and professional tax. Change:
salary.basicSalaryโsalary.breakdown.monthlyBasicsalary.employeePfโsalary.breakdown.employeePfsalary.professionalTaxโsalary.breakdown.professionalTax
Monthly gross, in-hand and CTC are already correct.
๐ธ Pipeline โ

| Node | Resource ยท Operation | Purpose |
|---|---|---|
| DevDeskApp: Indian CTC-to-In-Hand Engine | calculator ยท ctcToInHand | annualCtc, basicPercentage (default 50) |
| DevDeskApp: Offer Tracking UUID | crypto ยท uuid | Offer token |
| DevDeskApp: Candidate Slug Generator | text ยท slugify | name-role slug for file names |
| DevDeskApp: Compensation Checksum Hasher | crypto ยท hash (sha256) | Hash of the full salary output |
| If: Compensation Valid & Above Minimum Threshold | if | Valid offers go to Docs, Gmail and Slack, the rest to an HR alert |
โก Execution sample (with the fix above) โ
Input (sample candidate):
{
"candidateName": "Ananya Roy",
"roleTitle": "Principal DevOps Engineer",
"annualCtc": 2100000,
"basicPercentage": 50,
"joiningDate": "2026-12-01"
}DevDeskApp CTC output: monthlyGross: 173200, monthlyInHand: 145575, breakdown.monthlyBasic: 87500, employeePf: 1800, professionalTax: 200, estimatedMonthlyTds: 25625.
Format Offer Letter Document Payload output:
{
"offerId": "83aaa78d-e801-4c0a-ab00-2621a1422747",
"trackingSlug": "ananya-roy-principal-devops-engineer",
"integrityChecksum": "575b5e91708c83e62caf29cc5e6a7fee1cfd0d5354faa7befc06dbcbb9a41293",
"compensationBreakdown": {
"annualCtcFormatted": "โน21,00,000",
"monthlyGrossFormatted": "โน1,73,200",
"basicSalaryFormatted": "โน87,500",
"employeePfFormatted": "โน1,800",
"professionalTaxFormatted": "โน200",
"monthlyInHandFormatted": "โน1,45,575"
}
}PF follows the node's rule (12% of basic, capped at โน1,800), so a โน21L CTC shows โน1,800, not 12% of the full basic.
๐ฅ Import it โ
- Make sure
n8n-nodes-devdeskappis installed (installation guide). - Open the template on n8n.io and click Use for free, or copy the workflow JSON.
- Paste it onto a new workflow canvas with
Ctrl + V(Cmd + Von macOS). - Apply the fix from the known-issue box, then connect Google Docs, Gmail, Google Sheets and Slack credentials.
- Point the Google Docs node at your offer-letter template and click Test workflow.

