Walkthroughs

Generate an employment offer letter with Claude

Set up your HR offer-letter template, lock down required fields, and have Claude draft offers from candidate notes — same brand, same boilerplate, every time.

1

Start from your existing offer-letter template

Open the Word offer letter your HR team uses today — letterhead, salutation, role description, salary, benefits paragraph, signature block. You'll keep all the legal boilerplate and formatting; only the parts that change per candidate become tokens.

  • Replace the candidate's name with {{candidateName}} and the address block with {{candidateAddress}}.
  • Tokenize the role details: {{jobTitle}}, {{department}}, {{startDate | dd MMMM yyyy}}, {{workLocation}}.
  • Tokenize the compensation block: {{annualSalary}}, {{currency}}, {{bonusTarget}}, {{equityGrant}}.
  • Leave any optional clauses (signing bonus, relocation package) as inline tokens like {{signingBonusClause}} — you'll mark them as not-required in step 2 so Claude can omit them when they don't apply.
  • Save as employment-offer.docx.
Heads up: Have your standard offer letter reviewed by counsel before templating it. DocExport renders whatever you upload — it doesn't police legal language. The point of templating is consistency, not legal review.
2

Upload, annotate, and lock down required fields

Sign in at app.docexport.ai, click New template, and upload employment-offer.docx. The placeholder list appears with every token DocExport extracted.

  • Mark every legally-material field as Required: candidateName, jobTitle, startDate, annualSalary, currency, workLocation. If any of these are missing in the JSON, generate_document will refuse to render — exactly what you want for an HR document.
  • For optional clauses (signingBonusClause, relocationClause), leave Required off and write a description explaining when to include them. Example: "Signing bonus paragraph. Include only when offering a signing bonus; pass empty string otherwise."
  • Write tight descriptions on every field. For annualSalary: "Gross annual base salary as a number, no currency symbol or thousands separator. Example: 95000." For currency: "ISO 4217 code. EUR, USD, GBP, CHF."
  • Set the template description: "Standard full-time employment offer letter. Use for FTE hires only — not for contractors, interns, or internal transfers."
Tip: Required-field enforcement happens server-side, regardless of what Claude tries to send. That's your safety net against an agent hallucinating an offer with a blank salary.
3

Connect Claude Desktop and limit who can use the key

Open API keys and create a key dedicated to HR use — name it hr-offer-letters so it's easy to revoke later. Copy the plaintext key once.

  • Paste the snippet into Claude Desktop's claude_desktop_config.json and restart.
  • For HR data, prefer running this on a single, controlled laptop rather than sharing the key across the team. If multiple people need it, mint one key per person — that way you can revoke individually if someone leaves.
{
  "mcpServers": {
    "docexport": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://app.docexport.ai/mcp",
        "--header",
        "Authorization: Bearer dxp_<prefix>_<secret>"
      ]
    }
  }
}
Note: Every generate_document call writes an audit log entry tied to the API key that made the call. Per-person keys make the audit trail meaningful.
4

Decide where Claude gets the candidate and offer details from

Same principle as the sales walkthrough: DocExport renders, Claude assembles. For HR, the data usually lives in one of three places:

  • Your ATS (Greenhouse, Lever, Ashby) — if there's an MCP server for it, connect that alongside DocExport. Claude pulls the candidate record, the role, and the agreed comp; DocExport renders.
  • A hiring-manager email or Slack thread — paste the thread into Claude. "Here's what we agreed with Sasha. Draft the offer." Claude extracts the structured fields itself.
  • Just type it in the prompt — for the first run while you're testing the template, this is the fastest path.
5

Preview, review, then generate

Start with a preview so you can see Claude's interpretation before anything is rendered:

  • Claude calls list_templates, picks the offer template, calls get_template_schema, builds the JSON, and calls preview_generate.
  • Read the preview output carefully. Look at missingFields, unresolvedFields, and normalizedPreviewText — does the salary number look right? Did the optional signing-bonus clause get correctly omitted?
  • If anything's off, correct Claude in the chat — "the bonus target should be percentage of base, not a flat number" — and ask for another preview. Iterate until it's clean.
  • Then: "Generate the final PDF and the .docx so I can route it through DocuSign." Claude calls generate_document twice (once per format). Each call returns a 15-minute signed download URL.
Draft an offer letter for Sasha Müller using our standard FTE template.
Role: Senior Software Engineer, Engineering team, starting 1 June 2026.
Comp: €95,000 base, 10% bonus target, 1,500 RSUs vesting 4 years.
Working location: Berlin office, hybrid. No signing bonus.
Use today's date as the offer date. Run a preview first.
Heads up: Always have a human review the rendered PDF before it goes to a candidate. Claude is good at this, but offer letters are not the place to skip the second pair of eyes.
6

Operationalize it

Once one offer works end-to-end, lock the workflow in so other people can use it consistently.

  • Save a Claude Project (or a custom prompt template) with a system prompt like: "You generate employment offers for <Company>. Always preview first, always confirm comp numbers with me before generating, always output both PDF and DOCX."
  • Document the data sources you settled on (ATS MCP? Slack paste?) in your team's HR runbook so the next person doesn't reinvent it.
  • Watch the Documents page for a few weeks. If you see Claude consistently struggling with a particular field, that's a signal to improve its placeholder description, not to add a workaround.
?

Troubleshooting

Claude generated an offer with the wrong salary currency.
Your currency placeholder description probably says "EUR or USD" — too vague. Tighten it to: "ISO 4217 currency code, three letters, uppercase. Pick from EUR, USD, GBP, CHF based on the candidate's working country: Germany/EU → EUR, US → USD, UK → GBP, Switzerland → CHF." Re-run the preview.
The optional signing-bonus paragraph keeps appearing even when there's no signing bonus.
In the placeholder description, be explicit: "Empty string when no signing bonus is offered. Full paragraph including the amount and payment trigger when one is offered." Also tell Claude in your project system prompt: "Pass an empty string for any clause that doesn't apply — never invent one."
<code>generate_document</code> returned a "required field missing" error.
Look at the response body — it lists exactly which fields were missing. Either Claude didn't see the data in the prompt, or the field is genuinely optional and shouldn't be marked required. Don't un-require legally-material fields just to make the error go away.
How do I send the rendered offer through DocuSign?
DocExport doesn't do e-signature in this app. Generate the document, download it, and upload to DocuSign / Adobe Sign / Dropbox Sign as you do today. (DocExport for monday.com has built-in signing — see docexport.com if your team uses monday.)

Still stuck?

Email [email protected] with your template and the prompt you're trying to run — we usually reply same day.