Daily churn-risk alerts from PostHog to HubSpot and Slack
Catch paid users going quiet before they cancel. Each weekday morning, surface drop-offs from product usage and route them to the right account owner.
Every weekday at 9am, run an agent workflow that finds paid users at risk of churn and routes them to my Customer Success team. The trigger is a cron schedule.
Step 1. Pull churn signals from PostHog. Use the PostHog Execute HogQL Query operation to find paid users where both of these are true: (a) their count of key product events over the last 14 days dropped by 50% or more compared to the prior 14-day window, and (b) their last_seen is more than 7 days ago. Treat 'key product events' as logins plus core feature usage events (the agent should ask me which events to use during setup if not obvious from the project). Return at least: user distinct_id, email, name, current 14-day event count, prior 14-day event count, drop percentage, and last_seen timestamp. Only include users on a paid plan (filter on a person property like plan, tier, or is_paid).
Step 2. Decide who is really at risk. The HogQL result is the candidate set, not the final list. Have the agent reason about each candidate and drop obvious noise: brand-new users with tiny baselines, users who churned long ago, users where the drop is one missing day rather than a sustained pattern. Keep the ones that look like a real fade. Rank the survivors by severity (bigger drop and longer silence is worse).
Step 3. Update HubSpot for each at-risk user. For each user that survived step 2, use HubSpot Search Contacts to look up the contact by email. If a contact is found, use HubSpot Update Contact to set a churn_risk property (value should reflect severity, for example 'high' or 'medium'), and use HubSpot Create Task to assign a check-in task to the contact's owner with a clear subject like 'Check in with {name} — usage dropped {X}%', due in 1 business day. If no contact is found, skip the HubSpot writes for that user but keep them in the summary.
Step 4. Post a ranked summary to Slack. Use Slack Send a Message to post to the Customer Success channel (the agent should ask me which channel during setup). The message should list at-risk users ranked by severity, one line each, including: name (or email if name missing), drop percentage, last session timestamp in human-friendly form (for example '9 days ago'), and a direct PostHog person URL so the CSM can jump straight into the user's activity. Call out any users that had no HubSpot match so the team can fix the data. If zero users are at risk, post a short 'No churn risks today' message instead so the team knows it ran.
Tone for the Slack message: concise, scannable, no emoji walls. Lead with the count, then the ranked list. The CSM should be able to act on the message without opening a doc.
Ask me during setup for: the PostHog project to query, which events count as key usage, the paid-user filter to apply, the HubSpot churn_risk property name, and the Slack channel to post into.
Additional information
What does this prompt do?
- Scans your PostHog data every weekday morning for paid users whose activity has dropped or who haven't come back in over a week.
- Flags the riskiest accounts inside HubSpot by tagging the contact and assigning a check-in task to the account owner.
- Posts a ranked summary to your Customer Success Slack channel with the user, drop percentage, last session time, and a one-click link back into PostHog.
What do I need to use this?
- A PostHog account with product events for your paid users.
- A HubSpot login that can read contacts and create tasks, with a churn risk property on the contact record (or willingness to add one).
- A Slack workspace and the channel where your Customer Success team handles at-risk accounts.
How can I customize it?
- Change the schedule. Run it every weekday at 9am, once a week on Monday, or twice a week, whatever rhythm your CS team works on.
- Tune what counts as 'at risk'. Pick the events that represent real usage in your product, the drop threshold (for example 50% vs 70%), and how many days of silence trigger a flag.
- Change the destination. Post to a different Slack channel, only ping the account owner directly, or skip the HubSpot task and just send a Slack digest.
Frequently asked questions
Do I need a paid PostHog plan to use this?
Does it have to be HubSpot?
How does it pick who to assign the check-in task to?
What happens if an at-risk user has no matching HubSpot contact?
Can I change which events count as 'activity'?
Spot churn before it happens.
Connect PostHog, HubSpot, and Slack once, and Geni runs this check every weekday morning so your team can save accounts before they leave.