Sales teams generate the same documents over and over: NDAs, MSAs, SOWs, order forms, intro letters. Doing it manually means a 30-minute copy-paste exercise per doc. Zoho Writer mail merge with CRM as the data source turns it into a button click.
The merge model
A Writer template contains placeholders like ${Account.Name}, ${Contact.First_Name}, ${Deal.Amount}. CRM provides the data. The merge produces a personalized document, optionally as PDF, optionally signed via Zoho Sign.
Build the template with the right field paths
Field paths must match the CRM API names exactly. Use Writer’s CRM-merge sidebar to insert fields rather than typing. For nested data (Contact’s Account’s billing address), use:
${Contact.Account_Name.Billing_Street}
${Contact.Account_Name.Billing_City}, ${Contact.Account_Name.Billing_State} ${Contact.Account_Name.Billing_Zip}
Conditional sections for plan tiers
Different MSAs for SMB and Enterprise. Use Writer conditional blocks:
${if Deal.Tier == "Enterprise"}
This Master Services Agreement includes the Enterprise SLA addendum...
${endif}
${if Deal.Tier == "SMB"}
Standard terms apply, no SLA addendum.
${endif}
Trigger from a CRM custom button
Add a button on Deal: “Generate MSA”. Button calls a Deluge function that initiates the merge:
templateId = "WRITER_TEMPLATE_ID_MSA";
mergeData = {
"module":"Deals",
"record_id":deal.id,
"include_related":["Contacts","Account_Name"]
};
result = zoho.writer.mailMerge(templateId, mergeData);
zoho.crm.attachFile("Deals", deal.id, result.pdf_url);
zoho.crm.updateRecord("Deals", deal.id, {"MSA_Generated":zoho.currentTime,"MSA_URL":result.doc_url});
Send for signature in the same flow
Chain to Zoho Sign: after merge, push the PDF to Sign with signer = Contact.Email. Sign returns a status webhook; CRM updates Deal.Contract_Status to Sent, Signed, Declined.
Multi-recipient merges
Sometimes the doc has two signers (customer + your CFO). Define merge fields for each, pass both contact records. Sign supports sequential or parallel signing; sequential is the default for most contracts.
Version control for templates
Templates change. Track them in WorkDrive with a Versions folder. Tag the template version on the generated doc (${Template.Version} placeholder). Legal can confirm any contract was generated from the approved template.
Localization
For global teams, store one template per locale: MSA_en, MSA_de, MSA_ja. Pick by Account.Country or Deal.Locale. Do not auto-translate live: legal text in machine translation is malpractice.
What not to merge
Pricing tables in MSAs almost always need formula logic that Writer’s merge does not handle cleanly. Generate the order form as a separate doc with merge fields, and reference it in the MSA as Exhibit A. Cleaner than fighting Writer’s table merge.
Audit trail
Every merge writes a record to a custom module Document_Generation_Log: who, when, which template version, which deal. When legal asks “show me every contract version sent in 2025”, the answer is a saved view.
What to do this week: pick the document your sales team generates most (usually the order form), build the Writer template, ship the CRM button. Time-saved per week is usually 30 minutes per AE.