Intermediate~15 min setupCommunication & CRMVerified April 2026
Slack logo
Zoho CRM logo

How to Send Zoho CRM Follow-up Reminders to Slack with Power Automate

A scheduled Power Automate flow checks Zoho CRM for tasks or activities due today and sends a direct Slack message to the assigned sales rep with the contact name, task subject, and due time.

Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.

Best for

Sales teams already inside the Microsoft ecosystem who need daily task reminders pushed to Slack without building custom integrations.

Not ideal for

Teams that need reminders fired within seconds of a task being created — this scheduled approach runs on a fixed interval, not in real time.

Sync type

scheduled

Use case type

notification

Real-World Example

💡

A 12-person SaaS sales team uses this flow to send each rep a 9 AM Slack message listing every follow-up task due in Zoho CRM that day. Before this, reps logged into Zoho manually each morning, and tasks due after lunch were regularly missed until the next day. Missed follow-ups dropped by about 40% in the first month after turning this on.

What Will This Cost?

Drag the slider to your expected monthly volume.

/mo
505005K50K

Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.

Prices shown for annual billing. Based on published pricing as of April 2026.

Estimated ROI

1000

min saved/mo

$583

labor value/mo

Free

no platform cost

Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.

Implementation

Skip the setup

Import this workflow directly into Power Automate

Copy the pre-built Power Automate blueprint and paste it straight into Power Automate. All modules, filters, and field mappings are already configured — you just need to connect your accounts.

Before You Start

Make sure you have everything ready.

Zoho CRM account with Manager-level access or higher — basic user roles cannot query all tasks via the API
Slack workspace where you are a member, with permission to install third-party apps (check with your Slack admin if unsure)
Microsoft Power Automate account — a Microsoft 365 Business Basic plan or higher includes the Zoho CRM and Slack connectors
Zoho CRM tasks must have a Due_Date field populated — tasks without a due date will not appear in the scheduled query
Slack user handles or channel names for all sales reps who should receive reminders — needed to configure the message destination

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Task SubjectSubject
Due DateDue_Date
Task StatusStatus
Assigned ToOwner
4 optional fields▸ show
Contact NameContact_Name
DescriptionDescription
PriorityPriority
Activity TypeActivity_Type

Step-by-Step Setup

1

make.powerautomate.com > My flows > + New flow > Scheduled cloud flow

Open Power Automate and create a Scheduled cloud flow

Go to make.powerautomate.com and sign in. In the left sidebar, click 'My flows', then click '+ New flow' at the top of the page. Select 'Scheduled cloud flow' from the dropdown. Give the flow a name like 'Zoho CRM Follow-up Reminders to Slack'. Set the start time to 9:00 AM and the recurrence to 'Day' so it runs every weekday morning.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click '+ New flow' in the top toolbar
  3. 3Select 'Scheduled cloud flow'
  4. 4Enter flow name: 'Zoho CRM Follow-up Reminders to Slack'
  5. 5Set start time to 9:00 AM and repeat interval to 1 Day
  6. 6Click 'Create'
What you should see: The flow editor opens with a single 'Recurrence' trigger block showing your configured schedule.
Common mistake — Power Automate schedules run in UTC by default. If your team is in EST, set the start time to 14:00 UTC to hit 9 AM EST. Check this before going live or reminders will fire at the wrong time.
2

Flow editor > + New step > Search: Zoho CRM > Sign in

Connect Zoho CRM as a connection

Click '+ New step' below the Recurrence trigger. In the action picker search bar, type 'Zoho CRM'. Select the 'Zoho CRM' connector from the results. If you have no existing connection, Power Automate will prompt you to sign in. Click 'Sign in' and authenticate with the Zoho account that has CRM access. The connection is saved automatically and available for all future steps.

  1. 1Click '+ New step'
  2. 2Type 'Zoho CRM' in the search bar
  3. 3Click the Zoho CRM connector
  4. 4Click 'Sign in' in the connection panel
  5. 5Log in with your Zoho CRM admin or sales manager account
  6. 6Click 'Allow' on the Zoho permissions screen
What you should see: You see a green checkmark and your Zoho account email displayed in the connection panel. The connector is now authorized.
Common mistake — The Zoho CRM connector in Power Automate uses OAuth 2.0. You must authenticate with an account that has at least Manager-level CRM access — a basic user account will authenticate successfully but return empty results when querying tasks.
3

Flow editor > Zoho CRM > Search Records

Add the 'Search Records' action to pull today's due tasks

With the Zoho CRM connector selected, search for the action 'Search Records' and select it. Set the Module Name to 'Tasks'. In the Criteria field, you will build a filter to return only tasks due today that are not yet marked complete. Use the Power Automate expression editor to build the due date filter dynamically so it always targets the current day.

  1. 1In the Zoho CRM action picker, select 'Search Records'
  2. 2Set Module Name to 'Tasks'
  3. 3In the Criteria field, click 'Enter custom value'
  4. 4Type the criteria: (Due_Date:equals:@{formatDateTime(utcNow(), 'yyyy-MM-dd')})
  5. 5Set the 'Per Page' field to 200 to avoid truncation on busy days
What you should see: The action block shows 'Tasks' as the module and your dynamic date expression in the criteria field. No error indicators appear on the block.
Common mistake — Zoho CRM's Search Records criteria syntax uses colons as separators and is case-sensitive. 'due_date' will return no results — it must be 'Due_Date' with exact casing as shown in the Zoho CRM field schema.
4

Flow editor > + New step > Control > Apply to each

Add an 'Apply to each' loop to process each task

Click '+ New step' and search for 'Apply to each' (it is a Control action, not a connector). In the 'Select an output from previous steps' field, select the 'data' array output from the Zoho CRM Search Records action. Everything you add inside this loop will run once per task returned. This is how you send one Slack message per due task rather than a single bulk message.

  1. 1Click '+ New step'
  2. 2Click 'Control' in the connector categories
  3. 3Select 'Apply to each'
  4. 4Click inside the 'Select an output' field
  5. 5Select 'data' from the Zoho CRM dynamic content panel
What you should see: An 'Apply to each' loop block appears, with the 'data' token shown inside the input field. The loop is ready to accept child actions.
5

Apply to each loop > + Add an action > Control > Condition

Add a condition to filter only open tasks

Inside the 'Apply to each' loop, click '+ Add an action' and select 'Condition' from the Control group. Set the left side to the 'Status' dynamic content field from the Zoho CRM task. Set the operator to 'is not equal to' and type 'Completed' in the right field. Place all Slack actions inside the 'Yes' branch (meaning status is not Completed). This prevents reminders from firing on tasks already closed.

  1. 1Inside the loop, click '+ Add an action'
  2. 2Select 'Control', then 'Condition'
  3. 3In the left field, select 'Status' from Zoho CRM dynamic content
  4. 4Set the operator dropdown to 'is not equal to'
  5. 5Type 'Completed' in the right field
  6. 6Confirm the 'If yes' branch is where you will add Slack actions
What you should see: A Condition block appears inside the loop with two branches: 'If yes' (task is not completed) and 'If no' (task is completed, leave this branch empty).
Common mistake — Zoho CRM returns the Status field as a string like 'Not Started', 'In Progress', or 'Completed'. The exact value is case-sensitive. If your Zoho account uses a custom status name like 'Done' instead of 'Completed', update this condition to match your actual picklist value.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Zoho CRM
ZO
notified
6

Apply to each > Condition > If yes > + Add an action > Slack > Send message

Connect Slack inside the 'If yes' branch

Inside the 'If yes' branch, click '+ Add an action'. Search for 'Slack' and select the Slack connector. Choose the action 'Send message'. If no Slack connection exists, click 'Sign in with Slack' and authenticate. You will need to authorize the Power Automate Slack app in your Slack workspace — this requires Slack admin approval if your workspace restricts third-party apps.

  1. 1Inside the 'If yes' branch, click '+ Add an action'
  2. 2Type 'Slack' in the search bar
  3. 3Select the Slack connector
  4. 4Choose 'Send message' from the action list
  5. 5Click 'Sign in' and authorize with your Slack account
  6. 6Click 'Allow' on the Slack OAuth screen
What you should see: The Slack 'Send message' action block appears inside the 'If yes' branch. Your Slack workspace name shows as the active connection.
Common mistake — Power Automate's Slack connector sends messages as the authenticated user, not a bot. If you want messages to appear from a bot account (e.g., @CRMBot), you need a custom Slack app with a bot token and must use the HTTP connector instead of the native Slack connector.
7

Slack > Send message > Channel Name + Message Text

Configure the Slack message content and recipient

In the 'Send message' action, set the Channel Name to the Slack user ID or channel of the assigned rep. For direct messages, use the format '@firstname.lastname' or pull the assigned user's email from Zoho CRM and map it. In the Message Text field, build the reminder message using dynamic content from Zoho CRM — pull in the task Subject, Due Date, Contact Name, and any notes. Write a message that gives the rep everything they need without opening Zoho.

  1. 1Set Channel Name to the Slack handle or use '@' followed by dynamic email from Zoho
  2. 2Click in the Message Text field
  3. 3Type: '🔔 Follow-up Due Today: '
  4. 4Insert dynamic content: Subject (from Zoho CRM task)
  5. 5Add a new line and insert: 'Contact: ' + Contact Name dynamic field
  6. 6Add: 'Due: ' + Due_Date dynamic field
  7. 7Add: 'Description: ' + Description dynamic field
What you should see: The message preview in the action block shows a mix of static text and dynamic Zoho CRM tokens, like: '🔔 Follow-up Due Today: [Subject] — Contact: [Contact Name] — Due: [Due_Date]'.
Common mistake — Slack's Power Automate connector does not support Block Kit (the structured Slack message format with buttons and sections). You get plain text or basic markdown only. If you need buttons like 'Mark Complete', switch to the HTTP connector and call the Slack API directly.
8

Apply to each > + Add an action > Data Operation > Parse JSON

Add a Parse JSON step to extract nested Zoho fields

Zoho CRM's Search Records action returns some related fields (like Contact Name linked to the task) as nested JSON objects, not flat strings. Add a 'Parse JSON' action before the Slack step to extract the Contact Name cleanly. Click '+ Add an action' inside the loop (before the Condition), select 'Data Operation', then 'Parse JSON'. Paste a sample Zoho task JSON response as the schema so Power Automate can map the nested fields into usable dynamic content tokens.

  1. 1Inside the loop, click '+ Add an action' above the Condition
  2. 2Search 'Data Operation' and select 'Parse JSON'
  3. 3In the Content field, select 'Current item' from dynamic content
  4. 4Click 'Generate from sample'
  5. 5Paste a sample Zoho task JSON object from your CRM API response
  6. 6Click 'Done' to generate the schema automatically
What you should see: The Parse JSON block shows a generated schema with fields like Subject, Due_Date, Status, Description, and Contact_Name visible as individual dynamic content tokens in subsequent steps.
Common mistake — If you skip the Parse JSON step, Power Automate shows the Contact field as a raw JSON string like '{"name":"Priya Sharma","id":"4930291000000123456"}' in your Slack message. Always parse first, then map the 'name' property specifically.
Slack fields
text
user
channel
ts
thread_ts
available as variables:
1.props.text
1.props.user
1.props.channel
1.props.ts
1.props.thread_ts
9

Flow editor > Test (top right) > Manually > Run flow

Test the flow with a real Zoho task

Before saving, create a test task in Zoho CRM with today's date and a status of 'Not Started'. Then click 'Test' in the top right of the Power Automate flow editor and select 'Manually'. Click 'Run flow'. Power Automate will execute the flow immediately, ignoring the schedule. Watch the run history expand in real time — each step shows a green checkmark or a red X with an error message.

  1. 1Create a test task in Zoho CRM with today's due date
  2. 2In the flow editor, click 'Test' in the top right corner
  3. 3Select 'Manually'
  4. 4Click 'Run flow'
  5. 5Watch each step expand and confirm green checkmarks
  6. 6Check Slack to confirm the reminder message arrived
What you should see: Every step shows a green checkmark in the run history, and a Slack message appears in the target channel or DM with the test task's subject, contact name, and due date.
Common mistake — Power Automate's test run counts against your monthly flow run quota. On the free Microsoft 365 plan, you get 500 runs per month. If you have 50 tasks due today, one test run consumes 50 runs (one per loop iteration plus the trigger). Test with a single task to be safe.
Power Automate
▶ Test flow
executed
Slack
Zoho CRM
Zoho CRM
🔔 notification
received
10

Flow editor > Save > My flows > [flow name] > Flow detail page

Enable the flow and confirm the schedule

Click 'Save' in the top toolbar. The flow status changes from 'Draft' to 'On'. Go to 'My flows' in the left sidebar and locate your new flow. Click on it to see the flow detail page. Confirm the 'Next run' timestamp matches your intended time — 9:00 AM in your local timezone (converted to UTC as set in Step 1). If the next run shows an incorrect time, click 'Edit' and adjust the Recurrence trigger's time zone setting.

  1. 1Click 'Save' in the top toolbar
  2. 2Click 'My flows' in the left sidebar
  3. 3Click on your flow name to open the detail page
  4. 4Check the 'Next run' field under the Run history section
  5. 5If the time is wrong, click 'Edit' and fix the Recurrence trigger timezone
What you should see: The flow detail page shows status 'On' and a 'Next run' time that matches 9:00 AM in your team's local timezone.
Common mistake — Confirm your workflow timezone matches your business timezone — n8n uses the instance timezone by default. Also verify the workflow is saved and set to Active, since Schedule Triggers won't fire on inactive workflows.

Paste this expression into a Power Automate 'Compose' action inside the Apply to each loop, before the Slack step. It builds the full Slack message string with conditional emoji based on task priority and formats the due date as a readable string. Reference the Compose output in the Slack 'Message Text' field using the 'Outputs' dynamic content token.

JavaScript — Code Stepif(
▸ Show code
if(
  equals(items('Apply_to_each')?['Priority'], 'High'),
  concat(

... expand to see full code

if(
  equals(items('Apply_to_each')?['Priority'], 'High'),
  concat(
    '🔴 *High Priority Follow-up Due Today*\n',
    'Task: ', items('Apply_to_each')?['Subject'], '\n',
    'Contact: ', items('Apply_to_each')?['Contact_Name']?['name'], '\n',
    'Due: ', formatDateTime(items('Apply_to_each')?['Due_Date'], 'MMMM d, yyyy'), '\n',
    'Notes: ', if(empty(items('Apply_to_each')?['Description']), 'No notes added.', items('Apply_to_each')?['Description'])
  ),
  concat(
    '🔔 Follow-up Due Today\n',
    'Task: ', items('Apply_to_each')?['Subject'], '\n',
    'Contact: ', items('Apply_to_each')?['Contact_Name']?['name'], '\n',
    'Due: ', formatDateTime(items('Apply_to_each')?['Due_Date'], 'MMMM d, yyyy'), '\n',
    'Notes: ', if(empty(items('Apply_to_each')?['Description']), 'No notes added.', items('Apply_to_each')?['Description'])
  )
)

Going live

Production Checklist

Before you turn this on for real, confirm each item.

Troubleshooting

Common errors and how to fix them.

Frequently Asked Questions

Common questions about this workflow.

Analysis

VerdictWhy n8n for this workflow

Use Power Automate for this if your organization already has Microsoft 365 licenses — the Zoho CRM and Slack connectors are included, so you pay nothing extra. It also makes sense if your IT team manages automation centrally and needs flows stored inside a Microsoft tenant with full audit logs and data loss prevention policies. If you are an individual sales ops person without Microsoft 365 and you just want reminders working by end of day, Make or Zapier will get you there faster.

Cost

Power Automate's pricing for this workflow: a Scheduled flow running once daily with 20 tasks in the loop uses roughly 60 actions per run (trigger + search + 20 iterations × 2 actions each). At 30 days that is 1,800 actions per month. Microsoft 365 Business Basic includes 6,000 actions per month per user — this workflow costs you nothing extra on that plan. If you are on a standalone Power Automate Free plan (the 750-run limit plan), you will hit the wall in about 12 days with a team of 20 reps. The per-user Power Automate plan at $15/month gives 40,000 actions and removes that risk entirely. Zapier's equivalent would cost $49/month on the Team plan to support a multi-step workflow at this volume.

Tradeoffs

Zapier's Zoho CRM trigger for tasks is more reliable at catching new records in real time — it polls every 1–2 minutes versus Power Automate's minimum 1-minute polling on premium connectors. Make handles the conditional message formatting with less friction — the if() formula in Make's scenario editor is more forgiving than Power Automate's expression language, which requires exact JSON path syntax. n8n lets you run this entire flow self-hosted for free, and its Zoho CRM node supports more filter operators out of the box. That said, Power Automate is the right call when the IT requirement is Microsoft-only tooling, when you need native integration with SharePoint or Teams alongside Slack, or when compliance means your data cannot leave the Microsoft cloud.

Three things you will hit after setup. First, Zoho CRM's Search Records API caps at 200 records per call with no native pagination in the Power Automate connector — if you have more than 200 tasks due on any day (unlikely but possible for large teams), some tasks will be silently skipped. Second, the Slack connector in Power Automate sends messages as the authenticated user, so recipients see reminders coming from a real person's account, not a bot. This confuses reps who try to reply. Set expectations early or switch to the HTTP connector with a dedicated Slack bot token. Third, if a Zoho CRM field you are mapping (like Contact Name) is empty on some tasks, Power Automate throws a null reference error and stops that loop iteration — the rest of the tasks still process, but the failed ones leave no trace in Slack. Add a null check using the empty() expression before mapping any optional field.

Ideas for what to build next

  • Add a Slack button to mark tasks complete in ZohoUse the HTTP connector to call the Slack API with Block Kit interactive components, adding a 'Mark Complete' button to each reminder. Wire up a separate flow triggered by a webhook to update the Zoho CRM task status when a rep clicks it.
  • Send a daily digest instead of per-task messagesReplace the Apply to each loop with a Compose action that concatenates all due tasks into a single bulleted message, then sends one Slack DM per rep. This reduces Slack noise when reps have 5+ tasks due in a day.
  • Escalate overdue tasks to managersAdd a second Zoho CRM query in the same flow that pulls tasks with a due date of yesterday and a status of not completed. Send those to the sales manager's Slack with the rep's name attached so overdue items get visibility.

Related guides

Was this guide helpful?
Slack + Zoho CRM overviewPower Automate profile →