Change Summary
Release Date | Release Version | Change Description | Link |
October 20th, 2025 | 2025.3 | The Approval Name Config product configuration now includes At-Risk Funding | |
Product configuration for Agreement review/approval follow-up reminders | |||
Product configuration for OCI review/approval follow-up reminders | |||
Product configuration for Proposal review/approval follow-up reminders |
Overview
This guide provides an overview of configuring the Universal Design of Approvals feature in TechnoMile’s Contracts Suite.
This enhancement includes:
A flexible review and approval process allowing Recall, Cancel, and Resubmit of approval requests as needed.
Automatic creation of records in three entities - Approval, Approval Request, and Approval Response when an approval request is initiated. These records are updated in real time based on the approver's response.
The configurations in this article applies to the following objects at any stage within a business process:
Contract
Contract Mod.
Agreement
OCI
CPAR
Solicitation
Proposal
Negotiation
TINA Certification
At-Risk Funding
Audience
Microsoft Dynamics Administrators
IT Support
Prerequisites
Ensure that TechnoMile's Contracts Suite is installed and configured. The version of this package must be 2025.1 or higher.
Product Configuration
This section outlines the steps to create product configurations for universal design of approvals.
Creating a Product Configuration for Approvals
To create a product configuration for universal design of approvals:
In your Microsoft Dynamics organization, click the gear icon
and select Advanced Settings.Click the Advanced Find filter icon
.In the Advanced Find page, look for Product Configuration and then click Results.

In the Product Configuration page, open Approval Name Config.
The Approval Name Config page appears.In the JSON Value field, configure the values as required and click Save.
A product configuration record for universal design of approvals is created.
JSON Configuration
The JSON Value in the Approval Name Config page defines approval workflow for Contracts, Contract Mod, Agreement, OCI, CPAR, Solicitation, Proposal, Negotiation, TINA Certification, and At-Risk Funding . Each section outlines the key fields, naming conventions, and processes associated with the respective object.
The following entity name fields are populated based on the JSON configurations (approval_name, approval_request_name, and approval_response_name) done for each object:
Approval: (msdyn_flow_approval)
Approval Request: (msdyn_flow_approvalrequest)
Approval Response: (msdyn_flow_approvalresponse)
{
"parents": [
{
"name": "Contract",
"entity_logical_name": "new_contractvehicles",
"lookup_logical_name": "clm_contract",
"lookup_value_attribute": "_clm_contract_value",
"identity_field": "clm_name",
"status_filed": "statuscode",
"approval_history_realted_field": "clm_relatedcontract",
"process": [
{
"name": "Signature Authorization",
"role_name": "Signature Authorizer",
"role_value": 858000008,
"Seq": 1,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "Draft",
"value": 1
},
"parent_previous_status": {
"label": "Draft",
"value": 1
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Approved",
"value": 858000001
},
{
"label": "Rejected",
"value": 858000002
}
]
},
{
"name": "Contract Data Review",
"role_name": "Data Reviewer",
"role_value": 858000009,
"Seq": 2,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "Review",
"value": 858000004
},
"parent_previous_status": {
"label": "Review",
"value": 858000004
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Approved",
"value": 858000001
},
{
"label": "Rejected",
"value": 858000002
}
]
}
],
"approval_name": "[[parent_name]], [[role_name]] for [[identity_field]] ",
"approval_request_name": "Request to [[team_member_name]] on {date} as [[process]] for [[identity_field]]",
"approval_response_name": "Response from [[team_member_name]] on {date} as [[process]] for [[identity_field]]"
},
{
"name": "Contract Mod",
"entity_logical_name": "clm_contractmod",
"lookup_logical_name": "clm_contractmod",
"lookup_value_attribute": "_clm_contractmod_value",
"identity_field": "clm_modname",
"status_filed": "statuscode",
"approval_history_realted_field": "clm_relatedcontractmod",
"process": [
{
"name": "Signature Authorization",
"role_name": "Signature Authorizer",
"role_value": 858000008,
"Seq": 1,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "Draft",
"value": 1
},
"parent_previous_status": {
"label": "Draft",
"value": 1
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Approved",
"value": 858000001
},
{
"label": "Rejected",
"value": 858000002
}
]
},
{
"name": "Contract Data Review",
"role_name": "Data Reviewer",
"role_value": 858000009,
"Seq": 2,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "Draft",
"value": 1
},
"parent_previous_status": {
"label": "Draft",
"value": 1
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Approved",
"value": 858000001
},
{
"label": "Rejected",
"value": 858000002
}
]
}
],
"approval_name": "[[parent_name]], [[role_name]] for [[identity_field]] ",
"approval_request_name": "Request to [[team_member_name]] on {date} as [[process]] for [[identity_field]]",
"approval_response_name": "Response from [[team_member_name]] on {date} as [[process]] for [[identity_field]]"
},
{
"name": "Agreement",
"entity_logical_name": "clm_agreement",
"lookup_logical_name": "clm_agreement",
"lookup_value_attribute": "_clm_agreement_value",
"identity_field": "clm_agreementid1",
"status_filed": "clm_agreementstages",
"approval_history_realted_field": "clm_agreement",
"process": [
{
"Seq": 1,
"name": "Internal Review",
"role_name": "Reviewer",
"role_value": 3,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "Draft",
"value": 930810004
},
"parent_previous_status": {
"label": "Draft",
"value": 930810004
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Reviewed",
"value": 858000000
}
]
},
{
"Seq": 2,
"name": "Approval",
"role_name": "Approver",
"role_value": 1,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "External Review Completed",
"value": 930810003
},
"parent_previous_status": {
"label": "External Review Completed",
"value": 930810003
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Approved",
"value": 858000001
},
{
"label": "Rejected",
"value": 858000002
}
]
}
],
"approval_name": "[[parent_name]], [[role_name]] for [[identity_field]] ",
"approval_request_name": "Request to [[team_member_name]] on {date} as [[process]] for [[identity_field]]",
"approval_response_name": "Response from [[team_member_name]] on {date} as [[process]] for [[identity_field]]"
},
{
"name": "OCI",
"entity_logical_name": "clm_oci",
"lookup_logical_name": "clm_oci",
"lookup_value_attribute": "_clm_oci_value",
"identity_field": "clm_name",
"status_filed": "statuscode",
"approval_history_realted_field": "clm_oci",
"process": [
{
"name": "Review",
"role_name": "Reviewer",
"role_value": 3,
"tm_status_field": "clm_ociassessment",
"Seq": 1,
"parent_current_status": {
"label": "Draft",
"value": 1
},
"parent_previous_status": {
"label": "Draft",
"value": 1
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Conflict",
"value": 858000000
},
{
"label": "Potential Conflict",
"value": 858000001
},
{
"label": "No Conflict",
"value": 858000002
}
]
},
{
"name": "Approval",
"role_name": "Approver",
"role_value": 1,
"tm_status_field": "clm_ociassessment",
"Seq": 2,
"parent_current_status": {
"label": "Escalated",
"value": 858000001
},
"parent_previous_status": {
"label": "Draft",
"value": 1
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Conflict",
"value": 858000000
},
{
"label": "No Conflict",
"value": 858000002
}
]
},
{
"name": "Final Review",
"role_name": "Final Reviewer",
"role_value": 858000007,
"tm_status_field": "statuscode",
"Seq": 3,
"parent_current_status": {
"label": "OCI Manager Review",
"value": 858000005
},
"parent_previous_status": {
"label": "OCI Manager Review",
"value": 858000005
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Approved",
"value": 858000001
},
{
"label": "Rejected",
"value": 858000002
}
]
}
],
"approval_name": "[[parent_name]], [[role_name]] for [[identity_field]] ",
"approval_request_name": "Request to [[team_member_name]] on {date} as [[process]] for [[identity_field]]",
"approval_response_name": "Response from [[team_member_name]] on {date} as [[process]] for [[identity_field]]"
},
{
"name": "CPAR",
"entity_logical_name": "clm_cpar",
"lookup_logical_name": "clm_cpars",
"lookup_value_attribute": "_clm_cpars_value",
"identity_field": "clm_name",
"status_filed": "statuscode",
"approval_history_realted_field": "clm_cpar",
"process": [
{
"name": "CPAR Review",
"role_name": "Reviewer",
"role_value": 3,
"Seq": 1,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "Draft",
"value": 858000001
},
"parent_previous_status": {
"label": "Draft",
"value": 858000001
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Reviewed",
"value": 858000000
}
]
},
{
"name": "CPAR Approval",
"role_name": "Approver",
"role_value": 1,
"Seq": 2,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "Review Completed",
"value": 858000003
},
"parent_previous_status": {
"label": "Review Completed",
"value": 858000003
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Reviewed",
"value": 858000000
}
]
}
],
"approval_name": "[[parent_name]], [[role_name]] for [[identity_field]] ",
"approval_request_name": "Request to [[team_member_name]] on {date} as [[process]] for [[identity_field]]",
"approval_response_name": "Response from [[team_member_name]] on {date} as [[process]] for [[identity_field]]"
},
{
"name": "TINA Certification",
"entity_logical_name": "clm_tinacertification",
"lookup_logical_name": "clm_tinacertification",
"lookup_value_attribute": "_clm_tinacertification_value",
"identity_field": "clm_name",
"status_filed": "statuscode",
"approval_history_realted_field": "clm_tinacertification",
"process": [
{
"name": "Approval",
"role_name": "Approval",
"role_value": 1,
"Seq": 1,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "Not Started",
"value": 1
},
"parent_previous_status": {
"label": "Not Started",
"value": 1
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Approved",
"value": 858000001
},
{
"label": "Rejected",
"value": 858000002
}
]
}
],
"approval_name": "[[parent_name]], [[role_name]] for [[identity_field]] ",
"approval_request_name": "Request to [[team_member_name]] on {date} as [[process]] for [[identity_field]]",
"approval_response_name": "Response from [[team_member_name]] on {date} as [[process]] for [[identity_field]]"
},
{
"name": "Negotiation",
"entity_logical_name": "clm_negotiation",
"lookup_logical_name": "clm_negotiation",
"lookup_value_attribute": "_clm_negotiation_value",
"identity_field": "clm_negotiationrecordno",
"status_filed": "statuscode",
"approval_history_realted_field": "clm_negotiation",
"process": [
{
"name": "Approval",
"role_name": "Approval",
"role_value": 1,
"Seq": 1,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "Draft",
"value": 1
},
"parent_previous_status": {
"label": "Draft",
"value": 1
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Approved",
"value": 858000001
},
{
"label": "Rejected",
"value": 858000002
}
]
}
],
"approval_name": "[[parent_name]], [[role_name]] for [[identity_field]] ",
"approval_request_name": "Request to [[team_member_name]] on {date} as [[process]] for [[identity_field]]",
"approval_response_name": "Response from [[team_member_name]] on {date} as [[process]] for [[identity_field]]"
},
{
"name": "Proposal",
"entity_logical_name": "clm_proposal",
"lookup_logical_name": "clm_proposal",
"lookup_value_attribute": "_clm_proposal_value",
"identity_field": "clm_title",
"status_filed": "statuscode",
"approval_history_realted_field": "clm_relatedproposal",
"process": [
{
"name": "Review",
"role_name": "Reviewer",
"role_value": 3,
"Seq": 1,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "Draft",
"value": 1
},
"parent_previous_status": {
"label": "Draft",
"value": 1
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Reviewed",
"value": 858000000
}
]
},
{
"name": "Approval",
"role_name": "Approver",
"role_value": 1,
"Seq": 2,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "Review Completed",
"value": 858000004
},
"parent_previous_status": {
"label": "Review Completed",
"value": 858000004
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Reviewed",
"value": 858000000
}
]
}
],
"approval_name": "[[parent_name]], [[role_name]] for [[identity_field]] ",
"approval_request_name": "Request to [[team_member_name]] on {date} as [[process]] for [[identity_field]]",
"approval_response_name": "Response from [[team_member_name]] on {date} as [[process]] for [[identity_field]]"
},
{
"name": "Solicitation",
"entity_logical_name": "clm_solicitation",
"lookup_logical_name": "clm_solicitation",
"lookup_value_attribute": "_clm_solicitation_value",
"identity_field": "clm_solicitationnumber",
"status_filed": "statuscode",
"approval_history_realted_field": "clm_solicitation",
"process": [
{
"name": "Approval",
"role_name": "Approval",
"role_value": 1,
"Seq": 1,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "New",
"value": 1
},
"parent_previous_status": {
"label": "New",
"value": 1
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Approved",
"value": 858000001
},
{
"label": "Rejected",
"value": 858000002
}
]
}
],
"approval_name": "[[parent_name]], [[role_name]] for [[identity_field]] ",
"approval_request_name": "Request to [[team_member_name]] on {date} as [[process]] for [[identity_field]]",
"approval_response_name": "Response from [[team_member_name]] on {date} as [[process]] for [[identity_field]]"
},
{
"name": "At-Risk Funding",
"entity_logical_name": "clm_atriskfunding",
"lookup_logical_name": "clm_atriskfunding",
"lookup_value_attribute": "_clm_atriskfunding_value",
"identity_field": "clm_atriskrequest",
"status_filed": "clm_requeststatus",
"approval_history_realted_field": "clm_atriskfunding",
"process": [
{
"name": "Approval",
"role_name": "Approval",
"role_value": 1,
"Seq": 1,
"tm_status_field": "statuscode",
"parent_current_status": {
"label": "Pending",
"value": 858000001
},
"parent_previous_status": {
"label": "Not Sent",
"value": 858000000
},
"team_member_confirm_status": [
{
"label": "Not Started",
"value": 858000004
},
{
"label": "Request Recalled",
"value": 858000003
},
{
"label": "Approved",
"value": 858000001
},
{
"label": "Rejected",
"value": 858000002
}
]
}
],
"approval_name": "[[parent_name]], [[role_name]] for [[identity_field]] ",
"approval_request_name": "Request to [[team_member_name]] on {date} as [[process]] for [[identity_field]]",
"approval_response_name": "Response from [[team_member_name]] on {date} as [[process]] for [[identity_field]]"
}
]
}Creating a Product Configuration for Destination Time Zone
This configuration sets a predefined time zone value (currently EST) for specific date-time fields.
To create a product configuration for destination time zone:
In your Microsoft Dynamics organization, click the gear icon
and select Advanced Settings.Click the Advanced Find filter icon
.In the Advanced Find page, look for Product Configuration and then click Results.

In the Product Configuration page, click Destination Time Zone.
The Destination Time Zone page appears.Set the Value as Eastern Standard Time and click Save.
A product configuration record for destination time zone is created.
Creating a Product Configuration for Agreement Follow-up
Agreement Management now supports automated follow-up reminders for reviewers and approvers, to accelerate review cycles. Admin can configure a follow-up period (in days), after which the system automatically sends reminder emails to team members who have not yet responded to a review or approval request.
To create a product configuration for agreement follow-up:
In your Microsoft Dynamics organization, click the gear icon
and select Advanced Settings.Click the Advanced Find filter icon
.In the Advanced Find page, select Product Configuration and then click Results.
In the Product Configuration page, click Agreement Followup Config.
The Agreement Followup Config page appears.Copy and paste the JSON Value below if it does not already exist.
{ "reviewReminder": { "followupRequired": true, "firstFollowup": "1", "secondFollowup": "2", "thirdFollowup": "3" }, "approveReminder": { "followupRequired": true, "firstFollowup": "1", "secondFollowup": "2", "thirdFollowup": "3" } }Update the JSON values as required:
followupRequired: Set to true to enable reminder emails.
firstFollowup: Set the number of days after the original review/approval request when the first reminder email is sent (if no action is taken). For example, if set to 1, the first reminder email is sent 1 day after the original request.
secondFollowup: Set the number of days after the first follow-up when the second reminder email is sent (if no action is taken). For example, if set to 2, the second reminder email is sent 2 days after the first reminder.
thirdFollowup: Set the number of days after the second follow-up when the third reminder email is sent (if no action is taken). For example, if set to 3, the third reminder email is sent 3 days after the second reminder.
Click Save.
A product configuration for agreement follow-up is created.
Creating a Product Configuration for OCI Follow-up
OCI now supports automated follow-up reminders for reviewers and approvers, to accelerate review cycles. Admin can configure a follow-up period (in days), after which the system automatically sends reminder emails to team members who have not yet responded to a review, approve, or final review request.
To create a product configuration for OCI follow-up:
In your Microsoft Dynamics organization, click the gear icon
and select Advanced Settings.Click the Advanced Find filter icon
.In the Advanced Find page, select Product Configuration and then click Results.
In the Product Configuration page, click OCI Followup Config.
The OCI Followup Config page appears.Copy and paste the JSON Value below if it does not already exist.
{ "reviewReminder": { "followupRequired": true, "firstFollowup": "1", "secondFollowup": "2", "thirdFollowup": "3" }, "approverReminder": { "followupRequired": true, "firstFollowup": "1", "secondFollowup": "2", "thirdFollowup": "3" }, "finalReviewReminder": { "followupRequired": true, "firstFollowup": "1", "secondFollowup": "2", "thirdFollowup": "3" } }Update the JSON values as required:
followupRequired: Set to true to enable reminder emails.
firstFollowup: Set the number of days after the original review/approval request when the first reminder email is sent (if no action is taken). For example, if set to 1, the first reminder email is sent 1 day after the original request.
secondFollowup: Set the number of days after the first follow-up when the second reminder email is sent (if no action is taken). For example, if set to 2, the second reminder email is sent 2 days after the first reminder.
thirdFollowup: Set the number of days after the second follow-up when the third reminder email is sent (if no action is taken). For example, if set to 3, the third reminder email is sent 3 days after the second reminder.
Click Save.
A product configuration for OCI follow-up is created.
Creating a Product Configuration for Proposal Follow-up
Proposals now supports automated follow-up reminders for reviewers and approvers, to accelerate review cycles. Admin can configure a follow-up period (in days), after which the system automatically sends reminder emails to team members who have not yet responded to a review or approval request.
To create a product configuration for proposal follow-up:
In your Microsoft Dynamics organization, click the gear icon
and select Advanced Settings.Click the Advanced Find filter icon
.In the Advanced Find page, select Product Configuration and then click Results.
In the Product Configuration page, click Proposal Followup Config.
The Proposal Followup Config page appears.Copy and paste the JSON Value below if it does not already exist.
{ "reviewReminder": { "followupRequired": true, "firstFollowup":"1", "secondFollowup":"2", "thirdFollowup":"3" }, "approverReminder": { "followupRequired": true, "firstFollowup":"1", "secondFollowup":"2", "thirdFollowup":"3" } }Update the JSON values as required:
followupRequired: Set to true to enable reminder emails.
firstFollowup: Set the number of days after the original review/approval request when the first reminder email is sent (if no action is taken). For example, if set to 1, the first reminder email is sent 1 day after the original request.
secondFollowup: Set the number of days after the first follow-up when the second reminder email is sent (if no action is taken). For example, if set to 2, the second reminder email is sent 2 days after the first reminder.
thirdFollowup: Set the number of days after the second follow-up when the third reminder email is sent (if no action is taken). For example, if set to 3, the third reminder email is sent 3 days after the second reminder.
Click Save.
A product configuration for proposal follow-up is created.
Email Templates
The following out-of-the-box email templates notify users about universal design of approval recalled and reassigned:
Transform Copilot - Universal Design of Approvals - Recalled
Transform Copilot - Universal Design of Approvals - Reassigned
