---
id: educacao/produtividade-time-comercial
industry: Education
usage: widely used
effort: medium
grain: Day x agent; conversation; deal at the day's cutoff
---

# Sales team productivity

How much each SDR, closer and campus handled, answered and left pending, counting only human work and never adding up what does not add up.

## Executive summary

**For:** Sales coordinators at schools, colleges and digital product creators with SDRs, closers and WhatsApp support.

**What it solves**

- A productivity ranking that counts only what people did, without automation, broadcasts or system events.
- Response time and conversations handled measured in a way that neither worsens nor improves because of a broadcast campaign.
- A daily list of deals with no active task or with an overdue task, by owner and campus.

**Why it matters:** In student acquisition, a lead goes cold within hours: whoever takes long to answer loses the enrollment to the school next door. Coordination needs to know who handled, who answered quickly and what stalled. The number has to be fair to each person, otherwise the team stops trusting the ranking and every follow-up turns into an argument.

**Business questions it answers**

- How many conversations did each closer handle yesterday, and how many messages did they send?
- What was the team's first response time this week, by agent?
- Which deals have no active task or an overdue task, by owner?
- How many leads did the SDR work and hand over to the campuses this month?
- How much revenue came from each salesperson's conversations?
- Did the SDR work yesterday's new leads within business hours?

**What you need**

- Messaging and CRM connected to Nekt, with messages, tasks and notes
- A team roster: user, email, role (SDR, closer, campus) and validity period
- Business hours and the SLA agreed with coordination

**What you get**

- A day x agent table with messages, conversations and attributed sales, flagging what adds up and what does not
- A per-conversation table with first human response time and outcome
- A daily pending-items report and SDR audit by email
- An AI agent that answers productivity questions with the right rules

## Detailed

### The problem

The messaging tool records everything as a message: automatic broadcast, bot, system event, internal note and human reply. Counting everything rewards automation; adding up conversations handled day by day counts the same conversation several times; measuring response time on broadcast conversations, where the lead never wrote, concludes the team is slow. In the CRM, logins shared by campus and tasks created by automation hide who actually worked the lead.

### Business rules

1. **Productivity is a named human action.** Count only outbound messages sent by an identified user (in Clint, type = 'USER' with user_id filled). Outbound without a user is automation. System events (EVENT) and private notes (NOTE) are not conversation and leave the counts, but the conversation stays in the table so no deal disappears. A user outside the team roster becomes unidentified: counted in total volume, left out of the ranking. (Avoid: Counting every outbound message as the salesperson's productivity.)
2. **Declare what adds up and what does not.** Messages, media and deliveries add up across days and people. Conversations handled and contacts are distinct counts: the same conversation appears on several days, sources and deals, and they do not add up. Rates (delivery, read, response) are rebuilt as sum over sum, never as an average of daily rates. Write this in the table header and in the context document. (Avoid: Adding up each day's conversations handled to get the month.)
3. **Response time per cycle, only where the lead wrote.** A cycle runs from the lead's first unanswered message to the first human reply. Break ties between messages in the same second by id, otherwise the time shifts between runs. Measure only conversations with a message from the contact: in operations that broadcast, half of the conversations have no question to answer. Also keep the first reply of any kind, which is what the lead experiences, separate from the human one. Aggregate by median. (Avoid: Average response time over all conversations, broadcasts included.)
4. **Sales attributed once, to the last human touch.** A conversation can cover several deals and a deal appears in several conversations. Attribute each sale only once: to the owning conversation (the one with the deal's last message) and, within it, to the last human agent. Agent's average ticket = attributed value / conversations with their own revenue, never divided by conversations that merely took part in the sale. (Avoid: Giving the same sale to every agent who spoke in the conversation.)
5. **Role and campus come from a roster with validity.** Keep a table of user, email, role (SDR, closer, campus, AI agent) and period. People change roles and teams: classify each action by the role held in the month it happened. A login shared by a campus measures the campus, not the person. Different spellings of the same salesperson in free-text fields map to one canonical name through a single reference. (Avoid: A different chain of name replacements in every query.)
6. **SDR origin by first activity.** A deal came from the SDR when the SDR's first proven activity (note, task created or completed) precedes the campus's first activity. In that case, the campus entry counts on the date of the campus's first activity; otherwise it is a direct entry on the creation date. Activity before the SDR funnel was created does not count as SDR work. The author is whoever created or completed the task; the owner is only a fallback. (Avoid: Treating everything with the SDR as current owner as SDR work.)
7. **Automatic tasks are not work.** Tasks generated by automation (email opened notice, email replied, cadence step) stay out of activities and out of contact evidence. The contact channel used (WhatsApp, call, email, material sent, last attempt) comes from the text of a task completed by a person, and a note only counts as activity for whoever recorded it. (Avoid: Counting the email opened notice as a contact made by the salesperson.)
8. **Pending items look at every task of the open deal.** Overdue task = not completed, not canceled and due before today in America/Sao_Paulo. No active task only when there is no task or all tasks are completed or canceled. Check every task of the deal, not only the latest, and only on open deals. No task does not mean paused: pause comes from the official pause field. (Avoid: Reading only the latest task and flagging the deal as having nothing pending.)
9. **Audit at the cutoff, with declared business hours.** The audit of the previous day rebuilds the state at the cutoff (midnight Brasília time): a task completed after the cutoff counts as active at the cutoff, and a note edited after the cutoff is ignored. Business hours (for example 08:00 to 18:00) and the week (Sunday to Saturday or Monday to Friday) are declared and the same for everyone. (Avoid: Auditing yesterday with today's state.)
10. **Current state is not the day's output.** In RD Station Conversas, a conversation with closed = true is closed even with opened = true. Open and closed counters show today's state, not closures that happened on the day: do not read the current state as yesterday's output. Transfers and redistributions stay in their own columns, because they change who owns the conversation. (Avoid: Counting every conversation with opened = true as open.)

### What goes into each metric

Message direction, task authorship and pending status.

- **type = CUSTOMER** → Lead inbound (`entrada_contato`)
- **type = USER with a roster user_id** → Human outbound: productivity (`saida_operador`)
- **type = USER without user_id** → Automation: out of the ranking (`saida_automatica`)
- **EVENT, NOTE** → Out of the counts; the conversation stays in the table
- **user_id outside the team roster** → Unidentified: in volume, not in the ranking (`nao_identificado`)
- **Task with email opened or replied text** → Automatic: out of activities
- **Open, due < today, open deal** → Overdue task
- **No task, or all completed or canceled** → No active task

### Definitions

| Metric | Definition |
|---|---|
| Messages sent | human outbound messages per day x agent; additive |
| Conversations handled | distinct count of conversations with at least one human outbound message from the agent in the slice; not additive across days |
| First human response time | minutes between the lead's first message and the first human reply, only in conversations with a lead message; aggregated by median |
| Response rate | conversations with a lead message and a human reply / conversations with a lead message |
| Attributed sale | exclusive value of the won deal, once, to the last human agent of the owning conversation |
| Agent's average ticket | attributed value / conversations with revenue attributed to the agent |
| Overdue task | task not completed and not canceled, due before today in America/Sao_Paulo, on an open deal |
| New from SDR | deal where the SDR's first activity precedes the campus's first; counted on the date of the campus's first activity |

### Pitfalls

- **A ranking topped by the bot.** Before the human filter, the broadcast automation showed up as the most productive agent on the team. How to avoid: Separate human outbound, automation and events before building any ranking.
- **Conversations added up by day.** The month's total conversations, added up from the days, far exceeded the real number because the same conversation came back on several days. How to avoid: Recount the month with a distinct count and flag the daily column as non-additive.
- **Pessimistic response time.** Half of the conversations were broadcasts with no message from the lead and entered the calculation as unanswered waits. How to avoid: Measure only conversations with a message from the contact.
- **Sale counted twice.** The same deal appeared in two conversations, and the team's summed revenue exceeded actual sales. How to avoid: Use the exclusive value per deal, in the owning conversation.
- **Campus login in the ranking.** Several agents shared the same campus login in the CRM, and the per-person ranking compared one person with an entire front desk. How to avoid: Map the login to the campus and compare campuses with each other; ask for individual logins to measure people.
- **Email opened became a contact.** Tasks created automatically when the lead opened an email counted as contacts made, and the SDR looked like they had worked leads they never touched. How to avoid: Filter automatic tasks by their standard text before counting activity and contact.

### Acceptance test

- [ ] The sum of messages sent per agent in the month equals the source's total human outbound messages for the same slice.
- [ ] The month's conversations handled, recounted with a distinct count, never exceed the sum of the days, and the dashboard never adds up the daily column.
- [ ] The sum of sales attributed to all agents equals the value of won deals that had a conversation, with no difference.
- [ ] No won or lost deal appears in the overdue tasks list.
- [ ] Running yesterday's audit in the afternoon gives the same result as running it in the morning.

### Context document

```text
Sales team productivity
- Productivity = named human outbound: type = 'USER' with user_id filled and the user in the team roster <team table>. Outbound without a user = automation. EVENT and NOTE are not conversation.
- User outside the roster = nao_identificado: in total volume, out of the ranking.
- Additive: messages, media, deliveries, attributed sales. Non-additive: conversations handled and contacts (distinct count). Rates = sum / sum.
- Response time: cycle from the lead's first unanswered message to the first human reply, only in conversations with a lead message. Aggregate by median. Break ties by id.
- Attributed sale: exclusive value per deal, in the conversation with the deal's last message, to the last human agent. Ticket = attributed value / conversations with attributed revenue.
- Role (SDR, closer, campus) from the team roster with monthly validity. A shared login measures the campus.
- New from SDR: SDR's first activity before the campus's first; date = campus's first activity. Activity before <SDR funnel creation date> does not count.
- Automatic tasks (email opened, email replied, cadence) do not count as activity or contact.
- Overdue task: not completed, not canceled, due < today in America/Sao_Paulo, open deal. No active task: no task or all completed or canceled. No task does not mean paused.
- Daily audit: state at the <time> Brasília cutoff of the previous day; business hours <start> to <end>; week <Sunday to Saturday>.
- RD Station Conversas: closed = true is closed even with opened = true. Open and closed are current state.
- Always state the last load of messages and tasks.
Exceptions by client:
- <client>: the login <email> is shared by campus <campus>.
- <client>: SDR = users <list>; closers = <list>.
- <client>: the SDR funnel started on <date>; there are no SDR metrics before that.
```

### Variations

- **Call transcripts:** With Google Meet transcripts, count turns and speaking time per participant to see how much the salesperson talked and how much they listened.
- **School with several campuses:** Productivity by campus, with transfers between the SDR and campuses and a Sunday to Saturday week in Brasília time.
- **Tasks outside the CRM:** When the team tracks tasks in Notion or a spreadsheet, apply the same overdue rule with the tool's list of completed statuses.
