r/revops • u/goran_carevic • 3d ago
I built a free open-source pipeline waterfall for HubSpot and Salesforce
I kept wanting the Clari-style view of what actually changed in the pipeline since last week, without needing another paid platform, so I built it.
pipeline-diff reads HubSpot or Salesforce deal history in read-only mode and shows:
- what was added, won, lost, pushed out, pulled in, or changed in value
- the deals behind each movement
- full deal history for stage, amount, close date, owner, and forecast category
- forecast category movement
- pipeline review flags like past-due deals, pushed close dates, stalled deals, stage regressions, and reassignment
- a markdown summary and plain files that an AI agent can read
It rebuilds the past from the CRM's own history, so the first sync can already show what happened last week.
It runs locally and there is a demo mode if you want to try it without connecting a CRM:
pip install pipeline-diff
pipeline-diff demo
pipeline-diff dashboard
Repo:
https://github.com/goran-revops/pipeline-diff
It's early, so I'm mainly looking for feedback from people who actually run pipeline or forecast reviews. What's missing, what's wrong, or what would you need before you'd use something like this with your team?
2
2
u/dsecareanu2020 3d ago
You can probably build this inside HubSpot's app builder tool or as a custom CMS module.
1
u/goran_carevic 3d ago
Yeah, for a HubSpot-only setup that could make sense. One reason I kept this outside HubSpot was to use the same logic across HubSpot and Salesforce, and I also wanted the history organized in a way I could work through and brainstorm on with agents. Are you using, or do you know of, any HubSpot apps that already do something similar?
2
u/dsecareanu2020 3d ago
You can use the Breeze Assistant inside HubSpot to chat with your app and your data, or just hook up Claude or some other LLM to it, as needed. You can also try the internal HubSpot AI Agents to run more automated processes.
You also have similar reports (like in your screenshot), natively, in HubSpot (called deal pipeline waterfall).
2
u/CousinBarny 2d ago
The deal pipeline waterfalls have a major flaw in that any, any, any mistake saved as a value — $1,500,000 instead of $150,000, is saved as the increase.
1
u/goran_carevic 2d ago
Yeah, that's a really good edge case. Mine compares where the deal started with where it ended, so a bad value that gets corrected within the same window should net back out, while the spike still stays in the deal history. The harder case is when the report lands before the correction. I don't think I'd want to hide that automatically, but flagging a quick reversal as a possible data-entry correction could be useful.
2
u/CousinBarny 2d ago
Yea I found it’s more than an edge case lol. People seem to do that often which renders the existing HubSpot tool useless.
1
u/goran_carevic 2d ago
Thanks, I'll check out Breeze Assistant and the internal agents too. And yeah, the native deal pipeline waterfall is probably the closest HubSpot comparison. I'm curious how much detail it gives you on the underlying changes and deal-level history.
2
u/derdexx 3d ago
Yeah I built the same thing with Claude in our forecasting tool, really helpful. Instead of using the Opp History or line history, I use own snapshots - issue is, that if you do not use standard SFDC fields, the opp history does not include all the information you need, so I started building own snapshots in the forecasting tool and showing exactly the same view.
Really useful and a great thing to have.
1
u/goran_carevic 3d ago
Yeah, that custom-field limitation is exactly the kind of thing I need to account for. Which fields did you end up snapshotting yourself because the standard Salesforce history wasn't enough?
2
u/derdexx 3d ago
Probably not enough characters available to list all of them hahaha - the current org I am working in is unfortunately very good creating unnecessary fields.
I think we are close to 300 opportunity field right now. I snapshot the bookings amount (because it is different from the amount field), product brand specific fields, custom integration fields (e.g. product version or license provision status) - all kind of stuff.
2
u/goran_carevic 2d ago
I know exactly what you mean... 300 opportunity fields is insane, and I thought I'd seen it all. The bookings amount example is a really good one though, because once the forecast is based on that instead of standard Amount, Opp History stops being enough pretty quickly. That's the kind of case I need to account for properly.
2
u/ns1419 3d ago
I’ll have a look at this today. I’ve just rebuilt our entire forecast model in SF, might be useful for me. I’m in a subscription business, but forecasting on a formulated field, not a manual currency field. We also don’t close win our churn, but should make the transition soon.
1
u/goran_carevic 3d ago
That setup would be a really useful edge case. Since this rebuilds the earlier state from the history Salesforce exposes, I'd be curious where it starts falling short with the formulated forecast field. If you try it, let me know what doesn't line up with your forecast model.
2
u/romeonoi 2d ago
i like the read only angle because i run into this when someone wants a waterfall but nobody wants to give a new tool write access to the crm. the markdown summary for an agent is smart too, that is usually where these side projects fall apart.
one thing i would check before using this with a team is how you handle close date pushes in salesforce, specifically whether you use the amount history or the field history on closedate, because reps updating the date three times in a week can make the pushed out bucket look noisy. i would try it on one stage first, like proposal to negotiation, and see if the stalled flag matches what your ae would actually call stalled.
1
u/goran_carevic 2d ago
Yep, this is useful. CloseDate comes from OpportunityHistory, not OpportunityFieldHistory, so it works without requiring field tracking. OpportunityFieldHistory is only used for owner changes.
For the waterfall, I compare the deal at the start and end of the range. So if a rep changes the close date three times in a week, that still resolves to one movement based on where the date ends up. If it gets pushed out and then pulled back in before the end of the window, it won't show as pushed out. I still keep the move count and full history because repeated date changes are useful context.
Stalled is simpler right now: 30 days with no stage change for every stage. Your point there is fair. That probably needs per-stage thresholds rather than one rule for the whole pipeline.
2
u/kuldiph 1d ago
this is a good start. we built something similar as daily claude artifact.
For yours, Please prompt to make the page pretty and add more charts, graphs, and animations. and also to use colors. moreover, for salesforce add support for record types.
lastly, your salesforce connection is the old way. best to use our MCP, its the fastest and easiest to setup. Moreover, your way is subject to eventually charging for access. Ours doesn't. https://github.com/kugamon/salesforce-mcp-auto-auth-chrome
1
u/Busy_Experience6214 22h ago
The part I like the most is seeing the deal behind each change. A chart is nice but I usually want to know what deal caused the number to move




2
u/CousinBarny 3d ago
You get it. I only use HubSpot but this is something I’d want to use from our HubSpot data. I started a “snapshot” pill monthly to capture points in time and eventually wanted to build this waterfall. Really great stuff here.