ISSUE 15

LIVEPythonHubSpotLLMOpenRouter

CONTEXT

Freshpaint's sales contacts in HubSpot are missing the two fields that make segmentation possible: what persona someone is and how senior they are.Filling them by hand across thousands of deal contacts doesn't scale, so the fields sit empty and every list build or report starts from a guess.

BUILD

A headless Python service that runs on a fly.io cron every four hours on weekdays.Each run pulls the contacts attached to Sales-pipeline deals, sends each one to an LLM through OpenRouter, and writes the predicted persona and seniority back to their HubSpot fields.The model is a single swappable env var, defaulting to a cheap Gemini Flash Lite tier and escalated by changing one slug.Classification is vertical-aware, and a dry-run mode writes predictions to a CSV for human review before anything touches HubSpot.Already-classified contacts are skipped by change detection so reruns stay cheap, and per-run and per-company caps let a change roll out as a small canary before full volume.

RESULT

Live on fly.io, running unattended on its weekday cron.Persona and seniority now populate themselves as deals move, instead of being a field nobody gets around to filling in.
← All projects