Mazza Builds
← All projects

9 to 5 · Internal app at Freshpaint

Path

Shows sales who's warming up and what to do next, and shows marketing what works.

9.5xas likely to turn into a deal, for the accounts Path ranks warmest

  1. What it does

    Path gathers every email, form, website visit, ad click and meeting with each target account into one timeline. It scores how warm every account is right now, tells each rep who to reach out to today and what to do next, and shows marketing which content actually comes before demos and deals.

  2. Why it's cool

    Every rep had about 40 accounts and no way to see which ones were warming up. The paid tool Path replaced was hard to set up and never answered the question marketing cared about most: did the ads lead to demos? Now sales and marketing work from the same picture.

  3. The impact

    Tested against past deals, the accounts Path ranks warmest turned into deals 9.5 times as often as average, so a rep's list for the day is one worth working.

Under the hood

Context

Freshpaint's marketing and sales touches lived in HubSpot as millions of disconnected events: emails, form fills, page views, ad impressions, meetings. Reps managing about 40 accounts each had no way to tell which were warming up, and the paid attribution tool the team used was hard to set up and never answered whether ad impressions led to demo requests. When its subscription lapsed, the per-account timeline was the part worth keeping, and Path rebuilds it in-house.

Build

A Next.js 15 and React 19 app on Fly.io, with a separate worker that syncs HubSpot into Postgres every night in 13 read-only phases: about 2.6 million touchpoints of 25 types across roughly 19,600 accounts. Warmth is a sum of decaying touches, each type weighted with its own half-life (21 days for a page view, 90 for a meeting), and the weights live in a config table so a week-over-week change is only ever compared against a night scored the same way. The next-move list is deterministic, with no LLM in the loop: plays are ranked by the lower bound of their measured lift, and each carries a one-line reason. Lift compares converting accounts against matched controls on tier, activity and date window, with a 95% interval on every figure, across four goals from demo requests to closed won, and a fixed 10% holdout never sees recommendations so their effect can be measured. LLMs stay at the edges: Gemini classifies forms and content offline for human review, and an SDR research hub runs in the worker on a capped budget. A build check fails if any code outside one module can reach HubSpot, so nothing Path computes can write to the CRM.

Result

Live on Fly.io behind Freshpaint's Google sign-in. Sales gets a warmth-ranked account list, a weekly list of who moved and a timeline for every account; marketing gets a scorecard of which content lifts each goal. In a backtest over 24,631 account snapshots, the warmest tenth of accounts converted at 9.5 times the base rate, and the scoring weights only change when a challenger beats them on held-out data.

Stack

Next.js, Postgres, HubSpot, OpenRouter

Next projectROI Calculator