In modern business workflows, speed and accuracy matter the most. Manual document creation, sending contracts for signature, and tracking signer status can waste valuable time. This is where Zoho CRM and Zoho Sign together become a powerful automation solution.
In this article, we will explain:
action_id mismatch) and how to solve themThis guide is based on real implementation experience and Zoho’s official documentation.
Zoho CRM is a customer relationship management platform that helps businesses manage:
With Deluge (Zoho’s scripting language), Zoho CRM can automate complex business logic such as sending emails, generating documents, and triggering third-party integrations.
Zoho Sign is a legally compliant digital signature platform that allows you to:
Zoho Sign integrates seamlessly with Zoho CRM, making it ideal for contracts, agreements, NDAs, and onboarding documents.
When Zoho CRM and Zoho Sign work together, you can:
This combination is especially powerful for sales teams, finance companies, and service-based businesses.
Below is a working Deluge function that sends a document for signature using a Zoho Sign template directly from Zoho CRM.
fieldMap)textFieldMap = Map();
textFieldMap.put("Full Name",{full_name});
textFieldMap.put("Tel",{tel});
textFieldMap.put("Street Address",{street_add});
textFieldMap.put("City",{city});
textFieldMap.put("State",{state});
textFieldMap.put("Zip",{zip});
📌 Purpose: This map holds all text fields that exist inside the Zoho Sign template. The key must exactly match the template field label, otherwise the value will not populate.
allFieldType)allFieldType = Map();
allFieldType.put("field_text_data",textFieldMap);
allFieldType.put("field_boolean_data",Map());
allFieldType.put("field_date_data",Map());
allFieldType.put("field_radio_data",Map());
allFieldType.put("field_checkboxgroup_data",Map());
📌 Purpose: Zoho Sign separates template fields by data type:
field_text_data → Text fieldsfield_boolean_data → Checkbox / Yes-No fieldsfield_date_data → Date fieldsfield_date_data → Radio fieldsfield_date_data → Check Box fieldsEven if you don’t use all types, the structure must exist.
actionList)actionList = List();
actionMap = Map();
actionMap.put("recipient_name","Abdur Rouf");
actionMap.put("recipient_email","contact@advanced-it.top");
actionMap.put("action_type","SIGN");
actionMap.put("action_id",{signer_id});
actionMap.put("role","Client");
actionMap.put("signing_order", 1);
actionMap.put("verify_recipient",false);
actionList.add(actionMap);
📌 Purpose: Defines who will sign the document and how.
Important fields:
action_id → Unique ID from Zoho Sign templatesigning_order → Controls sequential signingrole → Must match template role❌ Error Message
{"code":9056,"message":"Action array size mismatch from the templates"}
action_id for each recipientaction_id for each recipient📌 This step is mandatory when using /createUsingTemplate.
otherMap = Map();
otherMap.put("field_data",allFieldType);
otherMap.put("actions",actionList);
dataMap = Map();
dataMap.put("templates",otherMap);
📌 Purpose: These maps organize template-related data exactly as expected by the Zoho Sign API.
mainMap = Map();
mainMap.put("is_quicksend", true);
mainMap.put("data",dataMap);
📌 Purpose: This is the final payload sent to Zoho Sign. Setting is_quicksend = true sends the document immediately.
API Call:
sendForSign = zoho.sign.createUsingTemplate({template_id}, mainMap, {connection});
This triggers document creation and sends it for signing.
textFieldMap = Map();
textFieldMap.put("Full Name",ifnull(getDealDetails.get("name"),""));
textFieldMap.put("Tel",ifnull(getDealDetails.get("Phone"),""));
textFieldMap.put("Street Address",ifnull(getDealDetails.get("Mailing_Street"),""));
textFieldMap.put("City",ifnull(getDealDetails.get("Mailing_City"),""));
textFieldMap.put("State",ifnull(getDealDetails.get("Mailing_State"),""));
textFieldMap.put("Zip",ifnull(getDealDetails.get("Mailing_Zip"),""));
/////////////
// All Fields
/////////////
allFieldType = Map();
allFieldType.put("field_text_data",textFieldMap);
allFieldType.put("field_boolean_data",Map());
allFieldType.put("field_date_data",Map());
allFieldType.put("field_radio_data",Map());
allFieldType.put("field_checkboxgroup_data",Map());
//////////////////////
// Action List And Map
//////////////////////
actionList = List();
actionMap = Map();
actionMap.put("recipient_name",ifnull(getDealDetails.get("name"),""));
actionMap.put("recipient_email",ifnull(getDealDetails.get("Email"),""));
actionMap.put("action_type","SIGN");
actionMap.put("action_id","449345000000246032");
actionMap.put("role","CLIENT");
actionMap.put("signing_order",1);
actionMap.put("verify_recipient",false);
actionList.add(actionMap);
///////////////
// Template Map
//////////////
templateMap = Map();
templateMap.put("field_data",allFieldType);
templateMap.put("actions",actionList);
////////////////
// Data Data Map
///////////////
dataMap = Map();
dataMap.put("templates",templateMap);
///////////
// Main Map
//////////
mainMap = Map();
mainMap.put("is_quicksend",true);
mainMap.put("data",dataMap);
info mainMap;
////////////////
// Send For Sign
////////////////
sendForSign = zoho.sign.createUsingTemplate("449345000000246011",mainMap,"signall");
info sendForSign;
action_idis_quicksend as booleanZoho CRM and Zoho Sign together unlock a powerful document automation workflow. With correct template configuration and proper action_id mapping, you can fully automate contract generation and signing with zero manual effort.
If you are looking to implement this for your business or clients, this approach is scalable, secure, and production-ready.