Zoho CRM Rep Activity
Calls, meetings and tasks logged per rep per day. Activity is per rep and never per deal - Zoho's What_Id and Who_Id are not synced, so the link to a deal does not exist in this connector.
- Grain
- day x owner
- Built from
- 4Raw tables
- 4Staging
- 1Core
- 1Analytics
- Reads from Zoho CRM
- calleventtaskuser
- Ships as
- Weld and dbt SQL, open source on GitHub
1-- zoho_crm_rep_activity - calls, meetings and tasks logged per rep per day.
2-- Grain: day x owner.
3-- Depends on: staging.zoho_crm.call, .event, .task, .user
4--
5-- READ THIS BEFORE USING IT. This model counts activity per REP, never per deal,
6-- account, contact or lead. That is not a design choice - Zoho's Calls, Events and
7-- Tasks modules all carry What_Id / Who_Id pointing at the record the activity
8-- belongs to, and the Weld connector does not sync either field. owner_id is the
9-- only foreign key on all three streams.
10--
11-- So this model answers "how much is each rep doing" and cannot answer "how much
12-- activity did we put into the deals we won". Any dashboard promising
13-- activity-to-outcome attribution from this connector alone is inventing the link.
14-- Until the connector syncs the parent ids, the join has to come from somewhere
15-- else - a calendar or dialer source keyed on email, or Zoho's Notes module,
16-- whose parent id IS synced (parent_id_id in raw, parent_id after staging).
17--
18-- WHY THERE IS NO tasks_completed COLUMN: the connector syncs is_completed but no
19-- completion timestamp. Completions can be counted as a current-state total, never
20-- placed on a day. Booking them on modified_time would move a task's completion
21-- every time anyone edited it afterwards.
22
23WITH activity AS (
24 SELECT zoho_org, owner_id, DATE(call_start_time) AS activity_date,
25 1 AS calls_logged, call_duration_minutes AS call_minutes,
26 0 AS events_held, 0 AS event_minutes,
27 0 AS tasks_created
28 FROM {{staging.zoho_crm.call}}
29 WHERE call_start_time IS NOT NULL
30
31 UNION ALL
32
33 SELECT zoho_org, owner_id, DATE(start_date_time) AS activity_date,
34 0, 0,
35 1 AS events_held, duration_minutes AS event_minutes,
36 0
37 FROM {{staging.zoho_crm.event}}
38 WHERE start_date_time IS NOT NULL
39
40 UNION ALLThis model and the 5 it depends on. Deploy them together; refs like {{staging.…}} resolve to the matching folders in Weld, and the dbt view uses source() and ref().
How it counts. And where it stops.
Counts calls, meetings and tasks per rep per day on a date spine, with call and meeting minutes and a live-touchpoints total that ignores tasks. Read the scope note before building a dashboard on it: Zoho's Calls, Events and Tasks modules each carry a What_Id and Who_Id pointing at the deal, account, contact or lead the activity belongs to, and neither field is synced by this connector. owner_id is the only foreign key on all three streams, so this model answers how much each rep is doing and cannot answer how much activity went into the deals you won. There is also no tasks_completed column, because the connector syncs the completion flag but no completion timestamp - completions can be totalled, never placed on a day.
Raw tables it reads
- raw.zoho_crm.call
- raw.zoho_crm.event
- raw.zoho_crm.task
- raw.zoho_crm.user
More Zoho CRM models
Put Zoho CRM in front
of your agents.
Connect Zoho CRM, deploy the models, and ask questions in Claude, Cursor or ChatGPT. Free for 14 days, no credit card.