Build a Sales Activity Compliance — Daily 5pm Check + Alert Workflow with n8n
At 5:14pm your best rep just realized they never sent the three follow-up emails they promised this morning. Your worst rep made four calls all day and nobody noticed. By the time this shows up in a M
At 5:14pm your best rep just realized they never sent the three follow-up emails they promised this morning. Your worst rep made four calls all day and nobody noticed. By the time this shows up in a Monday pipeline review, the week is already lost — the activity gap has hardened into a revenue gap. Sales activity compliance isn't a reporting problem, it's a timing problem: you find out too late to do anything about it.
This article walks through building a workflow in n8n that checks every rep's call and email count against their daily targets at exactly 5pm, then alerts managers to who's below the line — while there's still an hour left to fix it. No dashboards nobody opens. No manual CRM exports. Just a direct, automated nudge to the right person before the day closes.
Why manual activity tracking always fails
Every sales org claims to track activity. Almost none does it in a way that changes behavior. The common failure modes are predictable:
- The dashboard trap. You build a beautiful CRM report showing calls and emails per rep. Managers are supposed to check it. They don't — not daily, not consistently, not at a time when action is still possible.
- The lagging review. Activity gets reviewed in the weekly 1:1. That's five days too late. A rep who under-dialed on Tuesday can't retroactively make those calls.
- The blame problem. When numbers surface days later, the conversation becomes accusatory instead of corrective. "Why were you low last week?" lands very differently than "You're three calls short with an hour to go."
The core insight: activity targets only matter if the feedback loop closes on the same day. A 5pm check gives reps a final window to catch up and gives managers a factual, non-emotional trigger to reach out. That single timing change is what turns tracking into compliance.
What the workflow does
The logic is deliberately simple, which is why it's reliable. Once a day at 5pm on weekdays, the workflow:
- Wakes up on a schedule trigger.
- Pulls today's call and email counts for every active rep from your CRM or activity source.
- Compares each rep's totals against their configured daily target (for example, 40 calls and 25 emails).
- Filters down to only the reps who are below target on either metric.
- Sends a consolidated alert to the managers — one clean message listing exactly who's short and by how much.
Managers get a single "who needs a nudge" message at 5pm. Reps who hit their numbers generate no noise. That signal-to-noise ratio is what keeps the alert from being ignored after week two.
Building it step by step in n8n
1. Schedule Trigger. Add a Schedule Trigger node. Set it to a Cron expression of 0 17 * * 1-5 — 5:00pm, Monday through Friday. Critically, set the workflow's timezone under Settings → Timezone to your sales team's local zone, not UTC. A mismatched timezone is the single most common reason these workflows fire at the wrong hour.
2. Fetch today's activity. Add the node for your CRM — HubSpot, Salesforce, Pipedrive, or a generic HTTP Request node if you hit a custom API. Query engagements (calls and emails) created since midnight today. To build the date filter dynamically, use a Set or Code node before it with an expression like {{ $now.startOf('day').toISO() }} to compute the start-of-day boundary. Retrieve the owner ID, activity type, and timestamp for each record.
3. Aggregate per rep. Add a Code node to roll raw activity rows up into per-rep totals. A compact JavaScript reducer does the job:
const targets = { 40: 'calls', 25: 'emails' };
const byRep = {};
for (const item of $input.all()) {
const { ownerId, ownerName, type } = item.json;
byRep[ownerId] ??= { ownerName, calls: 0, emails: 0 };
if (type === 'CALL') byRep[ownerId].calls++;
if (type === 'EMAIL') byRep[ownerId].emails++;
}
return Object.values(byRep).map(json => ({ json }));
Keep your per-rep targets in a Set node, a pinned data table, or a Google Sheet you read in — so a manager can change a target without editing code.
4. Flag who's below the line. Add an IF node (or a Filter node) with an OR condition: calls < CALL_TARGET OR emails < EMAIL_TARGET. Everything that passes is a rep who needs attention. Everything that fails the condition — reps who hit both targets — drops silently, which is exactly what you want.
5. Format the alert. Add another Code or Set node to build one readable summary. Concatenate the flagged reps into a message like: "3 reps below target at 5pm: Ana (32/40 calls), Bruno (18/25 emails), Carla (11/40 calls, 9/25 emails). One hour left." A single message beats one alert per rep — managers read it, act on it, and move on.
6. Send it. Add a Slack, Microsoft Teams, Gmail, or Telegram node pointed at your sales managers' channel. Slack is ideal because the message lands where managers already live and they can @-mention a rep in one tap. Wire the flagged summary into the message body.
7. Guard the empty case. Before the send node, add an IF to check whether any reps were flagged. If everyone hit target, either send an optional "✅ All reps on target" note or send nothing. Silence on a good day is a feature — it teaches managers that a message means action is needed.
The benefits you'll actually feel
Same-day correction. The entire point. A rep who's short at 5pm still has time to send five emails or book two more calls. That recovered activity compounds across a quarter into real pipeline.
Managers stop policing spreadsheets. Instead of remembering to open a report, they receive a factual trigger only when intervention matters. Their attention goes to the two reps who need it, not the eight who don't.
The conversation gets healthier. A 5pm nudge is coaching, not a post-mortem. "You've got an hour, want help?" builds trust. Friday's accusation destroys it. The timing changes the entire tone of accountability.
It runs forever for free. Once built, this workflow costs nothing to operate and never forgets, never takes a day off, and never plays favorites. Consistency is what makes activity targets credible.
Common pitfalls to avoid
Wrong timezone. Said once, worth repeating: if your Schedule Trigger fires at 5pm UTC while your team is in Denver, alerts land at 10am. Set the workflow timezone explicitly and test it.
Counting the wrong window. Make sure your CRM query filters to today only. A common bug is pulling all-time activity or the last 24 hours rolling, which quietly inflates every rep's count and makes the check useless. Anchor to start-of-day in the team's timezone.
Alerting per rep instead of per batch. If you send one message for every flagged rep, a bad day produces six pings and managers mute the channel. Always aggregate into one summary message per run.
Static targets for a variable team. A rep who's on PTO or in an all-day training will always show as "below target" and erode trust in the alert. Add a skip-list or read an availability flag from your CRM so people who aren't selling today don't get flagged.
No error branch. If the CRM API times out, a naive workflow fails silently and managers assume everyone hit target. Add an Error Trigger workflow or an error-output branch that pings you when the fetch fails — a broken check is worse than no check because it creates false confidence.
Build it once, point it at your CRM, and you've converted activity targets from a number nobody enforces into a habit the whole team feels every afternoon at 5pm. The workflow is short. The compounding effect on pipeline is not.
Ja construimos isso pra voce
Nao comece do zero. O Sales Activity Compliance — Daily 5pm Check + Alert e um workflow n8n pronto para instalar — conecta suas ferramentas em minutos, sem codigo.
Instalar por $149 →