← All work Prarthana ✿ Get in touch
project · 02  ·  salescode.ai  ·  b2b fmcg analytics

A live analytics layer,
built to be read.

Saleslens is a multi-tenant analytics product I owned and shipped at Salescode.ai — a live, solution-specific dashboard sitting on top of each client's own database. It went live with five enterprise FMCG clients, including Coca-Cola.

My role
Associate Product Lead — product owner
Timeline
Jan 2024 – Mar 2025 · concept → build
Team
Manager, designer & build team
Status
Live · 5 enterprise clients
what it is ✿

A dashboard layer for Salescode's three products — SFA, eB2B and DMS — that reads from each client's live database and shows them their own performance. I picked it up as an early-stage initiative from a senior colleague and took it from concept to build completion: metric definitions, product design, user stories, and the build itself.

5
enterprise clients live, including Coca-Cola
3
solutions instrumented — SFA, eB2B and DMS
0→1
carried from inherited concept to shipped build
2
tiers — core bundled free, advanced as a paid add-on

the gap · 01

Three products, generating data nobody could see.

Salescode sells three things into enterprise FMCG: Sales Force Automation for the field, eB2B for retailer ordering, and a Distributor Management System for the channel. Each one produces a rich transactional trail — orders, visits, retailers, schemes, SKUs.

None of it came back to the client. There was no live, solution-specific dashboard wired to their actual database. If a brand manager wanted to know whether eB2B adoption was moving, the answer arrived as a report pulled by hand by a Salescode employee, on request, on a lag.

The initiative had been opened up by a senior colleague and then stalled — the appetite was proven, but there was no metric set, no design and no build plan. I picked it up from there and took it to completion.

what I built · 02

One analytics layer, three distinct dashboards.

Saleslens isn't a single dashboard pointed at everything. It's a multi-tenant layer that renders a different product depending on which Salescode solution the client runs:

saleslens · kestrel foods · eB2B workspace Open full screen ↗

have a click around — it’s live ✿

Interactive prototype — rebuilt for portfolio purposes with a fictional client, Kestrel Foods. The production instances are withheld under NDA. Four boards are wired: Home, Outlets, Categories & brands, and Compliance. The Formatted / Raw toggle under Categories is the K/M/B readability fix from section 06, shown working.
the decisions · 03

Four calls that shaped the build.

decision 01

Metrics per solution, not one shared dashboard

The cheap version of this is a single generic dashboard pointed at every database. It ships faster and means less. A DMS client and an eB2B client don't have the same questions, so each solution got its own metric set, defined on its own terms with my manager.

decision 02

Live database, not nightly exports

A dashboard that's a day stale invites the same phone call it was built to replace. We went multi-tenant against each client's live database — the harder architecture, and the reason the Coca-Cola scale problem surfaced at all.

decision 03

I define the structure before a designer touches it

I built the low-fidelity structure in Figma myself — what goes on screen, in what order, at what altitude — then brought in a designer for high-fidelity UX. Handing over an undefined brief spends a designer's craft on decisions that are really product decisions.

decision 04

Core free, advanced as a paid add-on

Visibility into your own data shouldn't sit behind a paywall — it's a necessity layer that makes the products underneath it defensible. Core dashboards shipped bundled with each solution; the deeper analytical features became a separately sold add-on.

defining the measures · 04

Turning “how are we doing” into a number.

Decision 01 reads as obvious and was the longest part of the work. “Show me how we're doing” is not a specification. For each solution I had to convert a vague client instinct into a metric with an unambiguous definition.

eB2B is the clearest example. Retailer counts are easy to produce and easy to misread — a retailer who installed the app once is not a retailer using it. So the eB2B set separated the funnel:

retailers onboarded repeat-order retailers adopted · 3+ orders brand ordering trends category trends variant trends

The definition I'd defend hardest is “adopted” set at three or more orders. One order is curiosity. Two can be a rep standing over someone's shoulder. Three is a habit forming. Drawing that line means the number can go down in a bad month — which is exactly what makes it worth showing a client.

design & build · 05

From a Figma sketch to a shipped product.

01

Low-fidelity structure, in Figma, by me

I laid out every screen myself first — which metrics appear, in what hierarchy, and what a client sees in the first three seconds. Structure settled before any visual work started.

02

High-fidelity UX with a designer

With the structure fixed, a designer took it to high fidelity. Their time went into craft and interaction rather than into resolving open product questions.

03

User stories written against the metric definitions

Every story carried the exact definition it implemented — including the three-orders rule — so “adopted retailers” meant one thing to me, the designer and the engineer.

04

Daily check-ins through the build

I ran daily check-ins with the build team across the whole implementation, which is how the Coca-Cola performance issue got caught and turned around inside the build rather than after it.

the scale problem · 06

Coca-Cola's data outgrew the screen.

Everything held until we pointed Saleslens at Coca-Cola. Their dataset was an order of magnitude past anything else we'd tested, and it broke the product in two ways at once.

The first was performance: load times degraded badly under that volume, on the live-database architecture we'd deliberately chosen. The second was subtler. At Coca-Cola's scale the raw figures ran to seven and eight digits, and a tile reading 1,204,839 is accurate and useless — you can't scan it, and you can't hold two of them in your head at once. We had built a data interpretation product that couldn't be interpreted.

I solved both directly: performance optimisation on the query and load path, and K/M/B rounding and formatting applied across the metric surface so magnitude reads instantly while precision stays available where it's needed.

before · raw
retailers onboarded1,204,839
orders placed48,712,065
order value2,940,118,500
after · formatted
retailers onboarded1.2M
orders placed48.7M
order value2.94B

same data — one of them you can actually scan ✿

Illustrative reconstruction — figures are representative, not production values. The production screens are withheld under NDA.
what shipped · 07

Live with five clients, Coca-Cola included.

Coca-Cola+ 4 enterprise FMCG clients

Saleslens shipped across the SFA, eB2B and DMS solutions and went live with five enterprise clients. Core dashboards were bundled free with each solution; the advanced feature set sold as a paid add-on, making the product a revenue line rather than only a retention play.

One honest note on the outcome. This product has no single before/after metric, and inventing one would be dishonest. Before Saleslens, clients had no visibility into their own solution performance at all — the comparison isn't better versus worse, it's nothing versus something. That's what a necessity layer looks like: its value shows up in renewal conversations that run on evidence instead of assurances, and in report requests that stop landing on a human's desk.

next teardown · 03 / 04
A first-principles teardown of Speak, the AI tutor