PLG B2B SaaS, three operational scenarios
PLG RevOps lives with a CRM that records the state of the pipeline and the customer list as of right now. How each deal or account got where it is, and what customers are actually doing in the product, usually lives in a warehouse or a billing system that isn't the CRM.
Scenario 1 of 3
The Phantom Seats
HubSpot says an account is on an 8-seat plan. The product database shows 23 active users in the last 30 days. Sales reps quote upgrade conversations against what HubSpot says, missing unbilled revenue. This is common at PLG companies where the Hightouch sync quietly lags reality.
The shape I'd start with is a scheduled job that compares HubSpot's paid seat count to the warehouse's active-user count each month. When they disagree, it records the gap with a dollar figure from the contract. That becomes a simple queue an AE can work, raising the bill or opening an expansion.
A production implementation of this pattern: Nine scheduled reconciliation services with checkpoint sync and circuit breakers
Revenue at risk
$131,651.0
12 accounts · HubSpot says one seat count, BigQuery says another
| Account | HubSpot seats | BigQuery users | $ impact |
|---|---|---|---|
| Meridian Labs | 8 | 23 | $22,800 |
| Johnson-Carlson | 41 | 48 | $17,266 |
| Newton and Sons | 58 | 66 | $17,178 |
The shape of the seat-drift query
-- one row per account where the billed seats and last-30d
-- active users disagree. Assumes hubspot_companies and
-- product_events are landed in the warehouse nightly by a
-- Hightouch reverse-ETL sync (or similar).
WITH active_users AS (
SELECT
account_id,
COUNT(DISTINCT user_id) AS active_user_count_30d
FROM product_events
WHERE event_ts >= current_date - interval '30 days'
GROUP BY 1
)
SELECT
h.account_id,
h.account_name,
h.billed_seats AS hubspot_seats,
COALESCE(a.active_user_count_30d, 0) AS warehouse_users,
GREATEST(COALESCE(a.active_user_count_30d, 0) - h.billed_seats, 0) AS overage_users,
(GREATEST(COALESCE(a.active_user_count_30d, 0) - h.billed_seats, 0)
* h.contract_per_seat_rate) AS dollar_impact
FROM hubspot_companies h
LEFT JOIN active_users a USING (account_id)
WHERE COALESCE(a.active_user_count_30d, 0) > h.billed_seats
ORDER BY dollar_impact DESC;
Scenario 2 of 3
The Stale PQL
A free user hit a usage threshold 14 days ago. The PQL was scored, routed to an AE in HubSpot, and never followed up. The score has decayed below threshold, and the signal is now invisible outside a weekly Hex notebook review.
What I'd sketch is a scorer that watches in-product behavior and flags accounts on usage patterns that historically convert. If a high-scoring account sits untouched in an AE queue for two weeks, it resurfaces with the original signals and HubSpot context so the AE can re-run the play in one click.
PQLs decayed without follow-up
14
$52K – $163K ARR at risk · 32–100% conversion band
Ibarra-Suarez
routed to Mike ReyesMitchell-Kim
routed to Jenna LarssonScenario 3 of 3
Forecast Variance
End of quarter. The CRO needs forecast confidence. HubSpot shows $4.2M committed pipeline, last quarter the team booked $2.9M against $4.4M at a 66% close rate, but with stage-skipping the standard pipeline view hides. Commission disputes are stacking up because deals were re-credited mid-quarter and nobody has an audit trail.
The way I'd approach it is to store the full history of every deal's stage moves, not just where it sits right now. That history unlocks a real pipeline coverage ratio, catches stage-skips HubSpot hides, and builds a clean commission audit you can actually defend.
Q2 2026 · 81 days remaining
1.4×
pipeline coverage · target 3.0× · last Q variance -34%
AE pipeline hygiene
| AE | Pipeline | Coverage | Stage skips | Overdue |
|---|---|---|---|---|
| Jenna Larsson | $1,590,204 | 1.6× | 2 | 10 |
| Mike Reyes | $1,250,808 | 1.3× | 4 | 10 |
| Priya Shah | $829,356 | 0.8× | 4 | 4 |
| Sarah Kim | $337,560 | 0.3× | 3 | 4 |