Automated Email Reminders Based on Date Fields in Power Automate for Dynamics 365 CRM.
Managing reminders and deadlines can be tricky, especially when you’re juggling multiple tasks in Dynamics 365. But what if you could set up automatic email reminders based on specific dates? In this guide, I’ll show you how to use Power Automate with D365 CRM to send automatic email reminders when certain dates are entered, and follow up at 7, 14, 21, and 28-day intervals if another related date field isn’t filled.
By the end of this post, you’ll learn how to create a simple workflow that keeps your team on track by sending timely reminders when needed.
The Use-Case: Automatic Email Reminders for Unfilled Dates
Imagine this: Your Project Manager fills in a date for a project milestone. But if the next milestone isn’t updated after a set period, your system will automatically send reminder emails to the right people. This saves your team from having to manually follow up and ensures that important dates are never overlooked.
Here’s how you can set it up using Power Automate:
- Trigger the Workflow: The process begins when a date field (like Milestone Date) is filled in a project record. This triggers the workflow to start.
- Wait for a Set Time: After the date is entered, the system will wait for a certain number of days (7, 14, 21, or 28 days). It checks if the Completion Date field has been filled after each waiting period.
- Check the Condition: Once the waiting time is up, the system checks if the Completion Date is filled. If not, it proceeds to send an email reminder to the Project Manager and the relevant team members.
- Send Email Reminders: The system sends an email after each waiting period (7, 14, 21, or 28 days) reminding the team that the milestone still needs to be completed.
- Repeat the Reminders: If the Completion Date is still not filled after each reminder, the system will continue to send emails, ensuring everyone stays on track.
- End of the Process: Once the Completion Date is filled, the workflow stops, and no further reminders are sent.
Key Components of the Solution
- Power Automate: The tool that lets you create workflows and automate tasks like sending emails based on certain conditions.
- D365 CRM: The platform where project data is stored, including key dates that trigger the reminders.
- Email Reminders: Automated emails sent to keep the team aware of deadlines and upcoming tasks.
- Date-Driven Workflow: A process that sends reminders based on whether a date is filled or not, at different time intervals.
Follow the Power Automate step outlined below:
Select the “When a row is added, modified or deleted” trigger from the Dataverse connector, set the Change Type to Modified, choose the Order Fulfillments table, set the Scope to Organization, specify the columns cf_submittalprotocolprocess and cf_initialshopdrawingssubmitted to trigger only on changes to those fields, and optionally use the Filter Rows field to apply additional conditions if needed.

Click the ellipsis (three dots) on the top-right corner of the trigger card, select Settings, scroll to the Trigger Conditions section, and enter the following expression to ensure the flow only triggers when cf_initialshopdrawingssubmitted is not empty:


Below is the condition that you need to add:
@and( not(empty(triggerOutputs()?[‘body/cf_initialshopdrawingssubmitted’])), equals(triggerOutputs()?[‘body/cf_submittalprotocolprocess’],979570001) )
Add the “Get a row by ID” action from the Dataverse connector, set the Table Name to Opportunities, and use the dynamic value Opportunity (Value) for the Row ID to retrieve the corresponding Opportunity record related to the modified Order Fulfillment.

Add the “Get a row by ID” action from the Dataverse connector, set the Table Name to Order Fulfillments, and use the dynamic value Order Fulfillment for the Row ID to retrieve full details of the modified Order Fulfillment record.

Add a “Compose” action named Comments for Email, and provide a formatted list including Project Manager (Order Fulfillment), Opportunity Contact, Secondary Contact, a static email (e.g., testblog@gmail.com), and again Project Manager (Order Fulfillment) as an example.

Add a “Filter array” action, set the From field to a coalesce(…) expression generating a list of participants, and in Basic Mode set the condition to Item is not equal to null to remove null entries.

Use a coalesce(createArray(…)) expression to conditionally construct an array of activity parties based on field availability (Opportunity Contact, Secondary Contact, Owner ID, Project Manager), falling back to a default address (CRMAdmin@gmail.com) if the Project Manager is null.
coalesce(
createArray(
if(
not(equals(outputs(‘Get_Opportunity_by_ID’)?[‘body/_cf_opportunitycontact_value’], null)),
json(concat(
‘{“participationtypemask”: 2,”partyid@odata.bind”: “contacts(‘, outputs(‘Get_Opportunity_by_ID’)?[‘body/_cf_opportunitycontact_value’], ‘)”}’
)),
null
),
if(
not(equals(triggerOutputs()?[‘body/_ow_secondarycontact_value’], null)),
json(concat(
‘{“participationtypemask”: 2,”partyid@odata.bind”: “contacts(‘, triggerOutputs()?[‘body/_ow_secondarycontact_value’], ‘)”}’
)),
Null
),
if(
not(equals(triggerOutputs()?[‘body/_ownerid_value’], null)),
json(concat(
‘{“participationtypemask”: 3,”addressused”: “testblog@gmail.com”}’
)),
null
),
json(concat(
‘{“participationtypemask”: 4,”partyid@odata.bind”: “systemusers(‘, outputs(‘Getting_Order_Fulfillment_by_ID’)?[‘body/_cf_projectmanager_value’], ‘)”}’
)),
if(
not(equals(outputs(‘Getting_Order_Fulfillment_by_ID’)?[‘body/_cf_projectmanager_value’], null)),
json(concat(
‘{“participationtypemask”: 1,”partyid@odata.bind”: “systemusers(‘, outputs(‘Getting_Order_Fulfillment_by_ID’)?[‘body/_cf_projectmanager_value’], ‘)”}’
)),
json(concat(
‘{“participationtypemask”: 1,”addressused”: “CRMAdmin@gmail.com”}’
))
) )
)
Switch to Advanced Mode in the Filter array and use the expression @not(equals(item(), null)) for better control over null filtering of the dynamic participant list.

In the step below, I used a “Compose” action to extract the Project Manager’s ID, which is then used in the filter array step.

Below is the body of the Filter Array, which I’ve saved in a new Compose action named “Email Participants.”

Add a “Compose” action to generate the email body using HTML formatting, apply an if() expression to dynamically insert the recipient’s name, and use concat() to list the required items for fabrication.


Below is the expression I used to identify all the recipients who will be receiving the emails.
if(
not(equals(outputs(‘Get_Opportunity_by_ID’)?[‘body/_cf_opportunitycontact_value@OData.Community.Display.V1.FormattedValue’], null)),
concat(‘<strong>’, outputs(‘Get_Opportunity_by_ID’)?[‘body/_cf_opportunitycontact_value@OData.Community.Display.V1.FormattedValue’], ‘</strong>’),
null

After completing the previous steps, add a parallel branch with four parallel actions, each configured to send the email after a delay of 7, 14, 21, and 28 days, respectively.


After introducing a 7-day delay, add a parallel branch that retrieves the corresponding Order Fulfillment record by ID and checks if both the Drawing Approval Date and Redline Issued Date fields updates have been made since the initial trigger

Add the “Add a new row” action from the Dataverse connector, set the Table Name to Email Messages, populate the Activity Parties field using the dynamic output outputs(‘Email_Participants’), and map the Description field similarly with the appropriate output value containing the email body content.


Set the Regarding (Order Fulfillments) field in the “Add a new row” action to the dynamic value Order Fulfilment (cf_orderfulfillment) to associate the email with the corresponding Order Fulfillment record.

This is how the final power automate will look like



Similarly, you can do for 14,21 and 28 days.


Below is how the email would look like in CRM:
The trigger will start when Initial shop drawings field contains the date field and Submittal/protocol process equals certain option.


If both Redline Int Received and Drawing Approved Date fields remain empty after 7, 14, 21, and 28 days, CRM will automatically send a follow-up email on each of those days.

This is how the email will look like.

To conclude, setting up this automatic reminder system in Power Automate for D365 CRM will help your team stay on top of project milestones, reduce manual follow-ups, and make sure nothing gets overlooked. It’s a simple yet effective way to automate reminders and keep everyone informed without any extra effort.
Hope this helps!!!
We hope you found this blog useful, and if you would like to discuss anything, you can reach out to us at transform@cloudfonts.com