Odysı
See if we fit
Case Study Automation

Find where you should sell next.

Odysi Reach for retail is a prospecting engine and a sales dashboard in one. It reads your sales book, finds the independent stores in any area that could carry your brands, scores them by how well they fit, and drafts the outreach, surfacing the places you could sell but don't yet.

Product Odysi Reach for retail
Built on Odysi Reach, our B2B outbound pipeline
Status Built & validated, iterating
Stack React · Supabase · Claude · Firecrawl
Read
The problem

Both jobs were still done by hand.

A brand selling through independent retail had two slow, manual jobs. Reading the sales book meant working a spreadsheet by hand, with no fast way to slice it by agent, country, account, or campaign over campaign.

And finding new stores to sell into depended almost entirely on field reps walking the same ground. The blind spot was everything outside the book: the compatible stores nobody had mapped.

FIG. I · White spaces 4 found
Your accounts Compatible White space
We started by narrowing

Three pains came up. We took the two that paid for themselves, analysis and discovery, and deliberately parked the third, a larger CRM-style build, so the tool could ship before the selling season instead of promising everything.

What we built

Where the two tools meet is the whole point.

One private web app with a sales dashboard and a prospecting engine. The interesting part is where they meet.

01

A sales dashboard

Upload the sales spreadsheet and get an instant read: revenue, active accounts, campaign-over-campaign movement, a per-agent view, a heat-mapped country map, new, returning and churned accounts, and where revenue is concentrated.

02

A prospecting engine

From a city and a radius, it finds the independent stores that could carry your brands, reads each store's own site to see which brands it already stocks, and rates the fit by the strength of those brands rather than the raw count.

03

Know who you're looking at

Every store is cross-referenced against your own book and labelled active, lost, or pure prospect. Then it finds the decision-maker and drafts outreach that references the brands the store already carries.

04

White spaces

The cross-over: places where the engine finds compatible stores but the sales data shows no customer. The one thing neither tool does alone, and the core idea of the product.

Deliberately out of scope: a social-media intelligence module (priced separately), department stores and pure ecommerce, a full agent CRM, and a mobile-first build. The app is responsive but not mobile-first.

How it works

How the prospecting engine actually works.

A React frontend over Supabase (Postgres and Deno edge functions), with scraping through Firecrawl, contacts through Hunter, and send through Gmail. Every table is walled off by row-level security, so each user only ever sees their own data.

How a search runs

Geography-first
Step 01
Pick a city and a radius on the map, and a minimum fit.
Step 02 · Discover
Generate the right searches from your brands' channels and pull every candidate store in range.
Step 03 · Filter the noise
Skip a long list of known chains and big retailers before anything is scraped, to cut cost and noise.
Step 04 · Read each store
Scrape the store's own pages and confirm only the brands that actually appear, with no extrapolation.
Step 05 · Score the fit
Rate each store by the strength of the brands it carries. One strong brand is enough to rate High. A collection of weak matches is not.
Step 06 · Contact & outreach
Find the decision-maker and draft an email that references the brands the store already carries, ready to send.
Answer fast, finish in the background

The top few candidates are analyzed inline and returned immediately. The rest go to a background worker and stream into the page as they finish, so the search feels instant without dropping anything.

Read, don't guess

It only confirms a brand that genuinely appears on a store's own pages. When a site is too thin to read, a constrained web search backs it up, confirming a match only when store and brand truly co-occur.

Strength over count

Each brand carries a strength tier you set. A store's quality is set by its best brand, so a single strong stockist outranks a pile of weak ones. The badge you filter by matches the result one to one.

Built to hold up

The background queue claims jobs safely so nothing is processed twice, caps retries, and requeues anything stuck. Row-level security walls every table, and admin checks run through a guarded path to prevent privilege escalation.

Built on Odysi Reach

The prospecting engine is not built from scratch. It adapts Odysi Reach, our existing B2B outbound pipeline, so most of the plumbing was already proven. The genuinely new work was the geography-first discovery, the multibrand scoring, the customer cross-reference, and the sales dashboard.

We named the limits

Contact discovery needs a store to have its own domain; the engine only sees brands a store actually publishes; fuzzy matching can occasionally over-match.

We rated these up front, so they're known trade-offs rather than surprises the user finds later.

How we de-risked it

We checked our assumptions against reality.

A common assumption was that store locators were unreliable. Before committing the architecture, we checked the actual brand list and found that most of them ran working locators carrying multibrand retailers. That evidence shaped the build instead of a hunch.

Then the dashboard started returning near-zero revenue. The spreadsheet parser was skipping formula cells. We fixed it, and then audited the corrected numbers cell by cell against the source file with an independent tool before trusting a single figure. We did not assume the dashboard was right; we proved it.

What we actually did Documented
01 Assumption tested against real data
02 Silent data bug caught in the dashboard
03 Numbers audited against the source file
04 Known limits named before launch
Not a formal QA suite. Real bugs found, numbers proven against source, limits named.
Where it stands

It's built and validated, and we're still sharpening it.

Built & validated
Both halves work, and the numbers are proven.

The dashboard is the most advanced part, with its data validated against source. The prospecting engine is substantially built: geography-first search, chain filtering, two-stage analysis, signal scoring, customer cross-reference, and the contact-and-outreach pipeline are all in place.

Dashboard validated against source
Prospecting pipeline functional end to end
Reliability-engineered: safe queue + row-level security
Built largely on existing Odysi Reach infrastructure
Still being iterated
Honest about what is not done.

Some pieces remain on the roadmap, and there is known, named technical debt to pay down. Delivery ran past the original target. There are no usage or commercial metrics, so we report none rather than invent them.

White-spaces view, end to end
Settings & search history
Named technical debt to pay down
What's next

From one engagement toward a product.

Most of the engine is reusable, so the path forward is to harden it into something more brands could run, and to make white spaces the thing you open the app for.

01

Make white spaces the default view rather than a side effect.

02

Finish settings and search history, and pay down the named debt.

03

Harden the engine into something more brands can run.

About Odysi

A small product studio. We prototype, automate, and ship.

Small is the feature: you work directly with the people building the thing, and we care more about something that holds up in production than something that looks good in a pitch.

Prototype. Automate. Grow.

Want to find where you should sell next? We're easy to talk to.

Related solution AI prospecting for retail brands Read the solution