Deliver Offer Letters Fast Without Risking Errors

AI generates custom offer letters from approved templates. HR verifies compensation, terms, and attachments before delivery to the candidate.


Why this matters

Offer letters with incorrect compensation, wrong start dates, or missing benefits information create legal liability and damage candidate trust. But delays in sending offers risk losing top candidates to competing offers. HR teams need to move fast while ensuring every detail is accurate — a tension that manual processes handle poorly.


How MultiMail solves this

MultiMail's AI agent generates offer letters from approved templates, populating them with the candidate's specific compensation, role details, and start date. It drafts a professional cover email and attaches the complete offer package. Gated_all oversight ensures HR reviews every element — compensation numbers, equity details, benefits summary, and e-signature links — before the candidate sees anything.

1

Receive Offer Approval

When the hiring team approves extending an offer, your AI agent receives the offer details: compensation, equity, start date, role, reporting structure, and benefits tier.

2

Generate Offer Letter

The agent populates your approved offer letter template with the candidate-specific details and generates a professional PDF document.

3

Draft Cover Email

The AI composes a warm, professional cover email that congratulates the candidate, highlights key offer points, and includes e-signature and response deadline information.

4

HR Reviews Everything

Under gated_all oversight, the complete package — cover email, offer letter PDF, and any supplemental documents — enters the review queue. HR verifies every detail before approving delivery.


Implementation

Generate and Send Offer Letter
python
import requests

API = "https://api.multimail.dev/v1"
HEADERS = {"Authorization": "Bearer mm_live_xxx"}

def send_offer_letter(candidate: dict, offer: dict):
    "cm"># Generate offer letter PDF from template
    offer_pdf = generate_offer_pdf(candidate, offer)

    cover_email = (
        f"Dear {candidate[&"cm">#039;name']},\n\n"
        f"We are thrilled to extend an offer for the "
        f"{offer[&"cm">#039;role']} position at {offer['company']}!\n\n"
        f"Key highlights:\n"
        f"  Base salary: ${offer[&"cm">#039;base_salary']:,}\n"
        f"  Start date: {offer[&"cm">#039;start_date']}\n"
        f"  Reporting to: {offer[&"cm">#039;manager_name']}\n\n"
        f"Please find your formal offer letter attached. "
        f"We&"cm">#039;d appreciate your response by {offer['deadline']}.\n\n"
        f"Sign here: {offer[&"cm">#039;esign_url']}\n\n"
        f"We&"cm">#039;re excited about the possibility of you joining "
        f"the team. Don&"cm">#039;t hesitate to reach out with questions."
    )

    # Queued for full HR review
    response = requests.post(
        f"{API}/send",
        headers=HEADERS,
        json={
            "from": "[email protected]",
            "to": candidate["email"],
            "subject": f"Offer letter: {offer[&"cm">#039;role']} at {offer['company']}",
            "text_body": cover_email,
            "html_body": build_offer_html(candidate, offer)
        }
    )
    print(f"Offer queued for HR review: {response.json()[&"cm">#039;id']}")

Create a custom offer letter and deliver it with a professional cover email.

Track Offer Status
python
import requests

API = "https://api.multimail.dev/v1"
HEADERS = {"Authorization": "Bearer mm_live_xxx"}

def track_offer_response(candidate_email: str):
    "cm"># Check for candidate reply
    inbox = requests.get(
        f"{API}/mailboxes/hr-mailbox-id/inbox",
        headers=HEADERS,
        params={"from": candidate_email, "status": "unread"}
    ).json()

    for msg in inbox["emails"]:
        email = requests.get(
            f"{API}/emails/{msg[&"cm">#039;id']}", headers=HEADERS
        ).json()

        # Classify response
        response_type = classify_offer_response(email["text_body"])

        requests.post(
            f"{API}/emails/{email[&"cm">#039;id']}/tags",
            headers=HEADERS,
            json={"tags": [f"offer-{response_type}"]}
        )

        if response_type == "question":
            # Draft response to candidate question
            draft_answer(email)
        elif response_type == "negotiation":
            "cm"># Flag for hiring manager review
            escalate_to_hiring_manager(email)

Monitor for candidate responses and track offer acceptance.

MCP Tool Integration
typescript
"cm">// Using MultiMail MCP tools for offer letter delivery

async function deliverOfferLetter(
  candidate: Candidate,
  offer: OfferDetails
) {
  "cm">// Send offer (queued for full HR review under gated_all)
  await mcp.send_email({
    to: candidate.email,
    subject: `Offer letter: ${offer.role} at ${offer.company}`,
    text_body: [
      `Dear ${candidate.name},`,
      ``,
      `We're thrilled to offer you the ${offer.role} position!`,
      ``,
      `  Base salary: $${offer.baseSalary.toLocaleString()}`,
      `  Start date: ${offer.startDate}`,
      `  Manager: ${offer.managerName}`,
      ``,
      `Please review the attached offer letter.`,
      `Sign here: ${offer.esignUrl}`,
      `Response deadline: ${offer.deadline}`
    ].join("\n")
  });

  "cm">// Track candidate in contacts
  await mcp.add_contact({
    email: candidate.email,
    name: candidate.name,
    metadata: {
      role: offer.role,
      stage: "offer-extended",
      offer_date: new Date().toISOString(),
      deadline: offer.deadline
    }
  });
}

Deliver offer letters using MultiMail MCP tools.


What you get

Faster Offer Turnaround

AI generates the offer letter and cover email in minutes. HR only needs to review and approve, cutting turnaround from days to hours.

Zero Compensation Errors

Gated_all oversight ensures HR verifies every number — base salary, equity, bonus, benefits — before the candidate sees the offer. No more embarrassing corrections.

Professional Candidate Experience

A polished, timely offer letter with clear terms and e-signature links shows candidates you run a tight operation. First impressions of the company start here.

Complete Offer Audit Trail

Every offer letter, review, and candidate communication is logged. When questions arise about what was offered, you have the definitive record.


Recommended oversight mode

Recommended
gated_all
Offer letters contain legally binding compensation terms, equity grants, and employment conditions. An error in salary, equity percentage, or start date can create legal liability or lose a candidate's trust. Gated_all ensures HR reviews every element of the complete offer package before delivery.

Common questions

Can the AI handle offer negotiations?
The AI can draft responses to common negotiation topics (salary range flexibility, equity vesting, start date changes) for HR review. However, negotiation strategy should remain human-driven. The AI handles the communication mechanics while HR and the hiring manager make the decisions.
How do I handle different offer templates for different levels?
Maintain separate offer letter templates for different levels (IC, manager, executive) with appropriate sections for each. Your AI agent selects the correct template based on the role level and populates it with the candidate-specific details.
What about international offers with different employment laws?
Configure country-specific offer templates that include required legal language and employment terms for each jurisdiction. Your AI agent selects the appropriate template based on the candidate's work location. Legal review during gated_all verification ensures compliance.
Can I set offer expiration reminders?
Yes. Your AI agent tracks the response deadline and sends a gentle reminder to the candidate if they haven't responded by a configurable window before the deadline (e.g., 2 days before expiration). This keeps the process moving without being pushy.

Explore more use cases

The only agent email with a verifiable sender

Email infrastructure built for AI agents. Verifiable identity, graduated oversight, and a 38-tool MCP server. Formally verified in Lean 4.