Skip to main content

Linnoedge

Linnoedge
Back to Works

Works — BtoB SaaS Development

If you can't see it,
you can't move it.

KPI Monitoring Dashboard for Outbound Sales Teams (SDR)

  • Outbound Sales SaaS
  • Next.js
  • TypeScript
  • PostgreSQL
  • Scope Management
Manual Excel updates and aggregation
Real-time dashboard reference

2.5 sec

PostgreSQL
Individual Rep
Manager
Leadership & Full Team

32 days

dev man-days for
KPI monitoring screens (after scope refinement)

4 axes

real-time visibility across
team, campaign, rep, and day

2.5 sec

SLA target set by design,
achieved through SQL optimization

Change

Before → After, in numbers

BeforeAfter
KPI trackingManual Excel updates and aggregation→Real-time dashboard reference
Rep self-checkHad to ask a manager→Opens own tab, instant answer
Campaign load imbalanceNot visible until the weekly meeting→Anytime via "Campaign" tab
Response timeNo standard set→SQL-optimized to SLA ≤2.5 sec

"Because the scope decisions were so clear, we always knew what to prioritize." When teams can see the numbers, the way they work starts to shift on its own.

Sales Operations Lead

B2B services company, Japan — outbound sales team, 20+ reps

Context

The numbers existed.
They just weren't visible.

Outbound sales teams — SDRs and appointment setters — generate hundreds of call records every day. Dials made, appointments booked, conversion rates by campaign: the data is there.

The problem is that none of it is actually visible.

Managers open Excel and manually aggregate today's figures. Reps head into the next call without knowing where they stand on their targets. "Who is at what percentage on which campaign right now?" — the need to answer that question instantly is universal across outbound sales organizations.

The numbers existed. They just weren't visible.

Fig. 1 How the numbers become visible
Hundreds of call records every dayDials made, appointments booked, conversion rates by campaign
KPI monitoring dashboardReplaces manual Excel aggregation with real-time figures
Team, campaign, rep, and dayA real-time view along each axis
Everyone sees where they standReps see their own target progress; managers see campaign imbalance

Challenge

A "simple request" that stalls
for a week — by design

The client's outbound sales operation was growing fast. More reps, more campaigns, more fragmented goal-tracking. The ask: one system that shows both the team-wide picture and the individual rep's live status on any given campaign.

The second challenge was structural. The supply chain ran client → prime contractor → two intermediary firms → Linnoedge. In that four-company chain, confirming a single requirement change means running it through multiple approval layers. A "simple addition" becomes a week-long stall. The project needed a communication design that kept development moving inside that structure — not despite it.

Craft

The engineering decisions
behind the dashboard

The design started from one constraint: it had to feel fast, wherever you opened it.

Outbound reps check the dashboard between calls. If it takes more than 2.5 seconds, it's effectively unusable — they'll stop checking. We set a 2.5-second SLA from day one and made SQL query optimization the top technical priority.

During development, response time climbed to 2.69 seconds. A 0.19-second gap that meant SLA failure. Index restructuring, query decomposition, cache strategy redesign — the last mile from "it works" to "it's usable" was a pure engineering grind.

Deciding what not to build

The hardest call on this project wasn't technical. It was deciding what to cut.

The original scope included cross-tabulation: a matrix view combining campaign axis and rep axis. Useful feature on paper. But the implementation cost was high, and the risk against a May end-of-month delivery was too great. The team deliberated and pulled cross-tabulation out of scope. "Deliver what's actually needed, reliably" — that decision kept the project moving. The feature can come back in a future phase.

Fig. 2 Getting response time under 2.5 seconds
Set a 2.5-second SLAReps check between calls; a slow screen goes unused
Response time climbs to 2.69 secondsA 0.19-second gap means SLA failure
Tune the SQLIndex restructuring, query decomposition, cache strategy redesign
Under 2.5 secondsFrom "it works" to "it's usable"
What we decided not to buildCross-tabulation was pulled out of scope to protect the delivery date
Individual Rep

Where am I today —
answered in 10 seconds

The "Rep" and "Day" tabs give each appointment setter an instant read: how many calls today, how many appointments booked, and what percentage of their campaign target they've hit. The entire "where do I stand right now" check takes 10 seconds — enough time between calls to refocus and move forward.

Manager

The Excel aggregation
is gone

The "Team" tab shows the full team's daily progress at a glance. The "Campaign" tab reveals which campaigns are overloaded on hours and which are falling short of target rate. The time managers used to spend on weekly Excel aggregation simply disappears.

Leadership & Full Team

30 days of momentum,
one screen

The "Day" tab's monthly trend view shows daily appointment counts for the past 30 days alongside the team's month-to-date ranking — all on one screen. "How did the team move this month?" becomes a number, not a meeting. Monthly reports can be exported directly from the view.

Tech Stack

Technologies used

  • Next.js
  • Next UI Pro
  • TypeScript
  • PostgreSQL
  • Tailwind CSS

Built something similar to what you need?

Let's talk about your version of this.

30 minutes. No cost. Comes with a written next-step summary.