The problem
Refresh planning starts with a client's device inventory: a spreadsheet or CMDB export that can run past 20,000 devices. Before anyone can plan a refresh or price it, each model needs its specs and lifecycle dates. Done by hand, that research took around two days per inventory.
What I built
As lead developer, I built a platform that turns those inventories into specs, refresh plans and ROI reports. It reached production in about two months and is used by around fifteen consultants. Research that took two days now takes about an hour.
How it works
Underneath is a LangGraph pipeline in five stages. Inventories are ingested and normalised, model names are mapped to canonical products with a consultant confirming the ambiguous ones, and research draws on vendor APIs with Bing grounding for the gaps. A verification gate sits before anything ships as a refresh plan or ROI report, with telemetry in App Insights.
Click through the stages below to see what each one does.
STAGE 01 / 05
Ingest
Client inventories arrive as spreadsheets or CMDB exports with 20K+ devices. Rows are normalised and deduplicated before anything touches a model.
› read client .xlsx / CMDB export› normalise columns› dedupe devices
TBC beats a confident guess
The rule that shaped the design: unverified fields come back as TBC instead of a confident guess. A refresh plan built on a made-up end-of-life date is worse than one with a visible gap, because nobody knows to check it. About 80% of dates resolve automatically; the rest are marked TBC for a consultant, not filled in.
Built to be trusted
Production meant more than the pipeline. The platform also runs on:
- LLM task routing and telemetry across 13 AI modules
- Celery and Redis for batch enrichment of large inventories
- Entra ID single sign-on
- Around 1,300 automated tests
- CI moved to self-hosted ARM64 runners to cut cost
Results
Around $600K in savings per client, research time down from about two days to an hour, and roughly 80% of lifecycle dates resolved without a human.
See it in context, or get in touch.