Key takeaways
- Which events belong in HubSpot vs. Stripe (and which to turn off)
- How to dedupe trial and purchase events between the two systems
- How to map HubSpot lifecycle stages to revenue-grade conversions
- How to attribute MRR, expansion, and churn back to ad campaigns
- How to send the same enriched events back to Meta, Google, and LinkedIn
The standard B2B SaaS data split
In a healthy B2B SaaS stack, HubSpot owns lifecycle data, leads, MQLs, SQLs, opportunities, and the human-touch activities around them, while Stripe owns the source of truth for revenue, trials, payments, refunds, and subscription changes.
Trying to make HubSpot the source of truth for revenue is the single most common mistake we see. HubSpot deal amounts are usually annual contract value entered by a rep, not the actual cash that hit your bank. The result: dashboards that don't tie out to your accounting system, and ad spend optimized against the wrong number.
Configure HubSpot for lifecycle, not revenue
Send the lifecycle events from HubSpot, and only the lifecycle events. The right list, in our experience, is short and stable.
- lead_created, when a contact's lifecycle stage becomes Lead
- mql_qualified, when lifecycle stage becomes Marketing Qualified Lead
- sql_qualified, when lifecycle stage becomes Sales Qualified Lead
- opportunity_created, when a deal is created in a target pipeline
- demo_booked, when a meeting is booked through HubSpot or Calendly
Configure Stripe for revenue truth
Stripe pays you, so Stripe should tell you about money. Use Cometly's direct Stripe integration with three triggers: New Trial, New Payment, and New Customer. They fire in real time and are tied to the actual financial event, not a rep's data entry.
Critical: when you turn the Stripe events on, turn the equivalent HubSpot events off, otherwise every trial and payment is counted twice and your CAC math breaks.
- Start Trial → Stripe "New Trial" trigger
- Purchase → Stripe "New Payment" trigger
- New Customer → Stripe "New Customer" trigger
- Disable HubSpot "Trial" and "Purchase" events to prevent dedupe issues
Attribute revenue back to the original campaign
Once HubSpot and Stripe are flowing into Cometly, every Stripe payment automatically inherits the touchpoints from the matched contact, the original ad click, the demo, the SQL stage change. Your dashboards now show pipeline by source, MRR by source, and LTV by source from the same model.
From there, sync those revenue events back to Meta, Google, and LinkedIn via the Conversions API. The algorithm starts optimizing toward the customers who actually pay, not the leads who fill out a form and disappear.
What good looks like after 30 days
Customers who follow this setup typically see three things in the first month: their HubSpot pipeline number reconciles with their Stripe MRR, their cost-per-customer drops because the ad platforms now optimize toward paid signups instead of trials, and their CMO can answer board questions without pinging RevOps.