Education · Sales team

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.

UsageWidely used
EffortMedium
ForSales coordinators at schools, colleges and digital product creators with SDRs, closers and WhatsApp support.
Source

Messages, tasks, notes and team roster

Rule

Only named human actions, in the local time zone and business hours

Outcome

Productivity, SLA and pending items per person

Activation

Daily report, dashboard and AI agent

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.

Business questions it answers

Ask your agent these questions once the case is live.

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

Where to activate

Daily email report

Pending items and the previous day's SDR audit, by owner, sent before business hours start.

Productivity dashboard

Messages, conversations, response time and attributed sales by person and campus, with non-additive columns recounted for the slice.

AI agent via MCP

Answers who handled, who replied and what is stalled, with the human and additivity rules already applied.

Ready to build?

The sources are simple. The work is in the team roster, in separating humans from automation and in deciding what can be added up. The detailed view has the business rules, the pitfalls and the acceptance test. Or send everything straight to your agent with the Nekt MCP.

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.

How it is usually done, and the rule

Each row is a mistake that already happened in practice.

The common wayThe rule
01
Counting every outbound message as the salesperson's productivity.
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.

02
Adding up each day's conversations handled to get the month.
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.

03
Average response time over all conversations, broadcasts included.
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.

04
Giving the same sale to every agent who spoke in the conversation.
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.

05
A different chain of name replacements in every query.
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.

06
Treating everything with the SDR as current owner as SDR work.
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.

07
Counting the email opened notice as a contact made by the salesperson.
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.

08
Reading only the latest task and flagging the deal as having nothing pending.
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.

09
Auditing yesterday with today's state.
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.

10
Counting every conversation with opened = true as open.
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.

What goes into each metric

Message direction, task authorship and pending status.

type = CUSTOMERLead inboundentrada_contato
type = USER with a roster user_idHuman outbound: productivitysaida_operador
type = USER without user_idAutomation: out of the rankingsaida_automatica
EVENT, NOTEOut of the counts; the conversation stays in the table
user_id outside the team rosterUnidentified: in volume, not in the rankingnao_identificado
Task with email opened or replied textAutomatic: out of activities
Open, due < today, open dealOverdue task
No task, or all completed or canceledNo active task

Definitions

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 that already happened

A ranking topped by the bot

Before the human filter, the broadcast automation showed up as the most productive agent on the team.

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.

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.

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.

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.

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.

Filter automatic tasks by their standard text before counting activity and contact.

Acceptance test

The case is done when every item passes.

Agent package

Paste into Claude, ChatGPT or any client with the Nekt MCP connected.

Full Markdown
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.