Field Sales · Mapping

Spirits Territory Map

Every licensed Michigan spirits account on one map, sized by what it actually buys.

In DevelopmentReactTypeScriptViteMapLibre GLOpenFreeMapPythonUS Census GeocoderPlaywrightGitHub Pages
The Problem

What pain does this solve?

A liquor rep's territory is thousands of bars and stores, and the only public record of who buys what is a set of state spreadsheets and PDFs. Reps plan calls from memory, a distributor printout, or whoever answered last time. The numbers that say which accounts matter already exist and are public, but nobody can use them from a parking lot.

The Solution

How the tool works

Spirits Territory Map turns the MLCC purchase files into a map a rep can use on a phone. Every active license shows what it bought in 2025 and how that compares to the four years before, so the big accounts and the growing ones stand out at a glance. Near me plus a ranked list answers the field question directly: of the places around me right now, which are worth the stop. No login and no backend; add it to the home screen and it keeps working without signal.

  • One pin per active license, sized and colored by 2025 MLCC purchases, clustering with summed totals when zoomed out
  • Near me: locate, then a 5, 10, or 25 mile ring that filters both the map and the list
  • Bars (Class C and B-Hotel) or stores (SDD), plus minimum-purchase filters
  • Location card with licensee, license, year-over-year change, five-year trend, and rank, plus directions and share links
  • Ranked list of every account in range by purchases; tap a row to jump to its pin
  • Search by business name, licensee, or city; installable on a phone and usable offline
Technical Approach

Architecture decisions

A Python pipeline downloads the state's files, parses the 2025 Excel workbooks and the 2021-2024 history (published only as PDFs of an old mainframe report), and joins them to the master license list on license number and license type. Joining on the number alone looked right and was wrong: numbers repeat across license classes, and a number-only join matched 43 terminated licenses to a different, active license and showed the wrong name. Parsed totals are checked against the totals printed in each source file. Addresses geocode through the US Census batch geocoder with OpenStreetMap as the fallback, bounded to Michigan and checked against the county. The front end is a static Vite + React + TypeScript app on MapLibre GL with OpenFreeMap tiles, so there is no server and no API key. A Playwright suite checks every feature against the built data on desktop and phone, and runs before every GitHub Pages deploy.

ReactTypeScriptViteMapLibre GLOpenFreeMapPythonUS Census GeocoderPlaywrightGitHub Pages
Current Status

Where things stand

POC live: six MVP features shipped and tested, rep features next60%
In DevelopmentNo repos public yet \u2014 build is underway.
Building something similar?

Recognize this problem
in your own business?

This project started as a real frustration Ryan observed working inside companies. If you're dealing with a similar problem, let's talk — the solution might already be in progress, or we build it together.

Let's talk

Free 30-minute discovery call. No commitment.