Manage HubSpot lifecycle stages and list segmentation in production without silently destroying CRM trust. Covers lifecycle stage progression guards that prevent regression, dynamic list criteria drift, static list orphan detection, lead-scoring source-of-truth conflicts, webhook-missed-event recovery, and cross-portal list sync.
SkillScore82Maintained
Automatic
◆Sales & GTM packhubspotlifecyclesegmentation
Last verified 8/30/2026
What it changes
Passed 18 of 22 test cases with the skill, and 15 of 22 without it.
Without skill68%
With skill82%
Checks it passed that the model alone missed
Set dynamic to false in the JSON payload body.
Send a POST request to https://api.hubapi.com/contacts/v1/lists.
Treat the 'other' stage as a lateral bucket exempt from backward progression blocking.
and 2 more in the full report
3 fixed15 passed either way4 still failing0 broke
Pass-rate lift
+14 pp
Tokens
+179%
Agent turns
0%
Response time
-7%
Model gemini-3.6-flashMeasured 8/30/2026v118 of 22 cases passed with skill
Tokens, turns and time describe resource use, not a dollar price.
See it in action
One of 3 test cases the skill fixed. Same model, same prompt, with and without the skill.
1 of 3
Prompt
We need to create a static suppression list named '2026-Q2 Campaign - Suppression' in HubSpot using cURL. What HTTP request structure should be sent to the lists API?
What was checked, without and with the skill
Checked
Without skill
With skill
Send a POST request to https://api.hubapi.com/contacts/v1/lists.
Missed
Passed
Set dynamic to false in the JSON payload body.
Missed
Passed
case-22 · gemini-3.6-flash · 8/30/2026 · answers are capped and redacted
What's inside
The instructions your model reads when the skill loads.
SKILL.md385 lines3 files
HubSpot Lifecycle and Lists
Overview
Move contacts through the HubSpot funnel and maintain list integrity in a production system. This is not a setup walkthrough — it is the code your marketing-ops integration runs when a lifecycle stage update would silently regress a Customer back to Subscriber, when a dynamic list's criteria change orphans members who qualified last week, when a static list import references contacts that were deleted from the portal, when an external lead-scoring model creates a second source of truth that fights HubSpot's native scoring, when a list-membership webhook fires but your consumer returns 5xx and HubSpot never retries, and when an agency needs to mirror list membership across two portals that have no native sync API.
The six production failures this skill prevents:
Lifecycle stage regression — HubSpot's PATCH /crm/v3/objects/contacts/{id} will set lifecyclestage to any valid value regardless of direction. Setting a Customer back to Subscriber silently destroys funnel attribution, invalidates reporting, and corrupts revenue forecasting. The API returns 200 OK. There is no built-in guard.
Dynamic list criteria drift — editing a dynamic list's filter criteria does not immediately re-evaluate existing members against the new rules. Members who no longer qualify remain in the list until the nightly background refresh completes, creating a stale membership window of up to 24 hours that can trigger incorrect nurture emails or suppression failures.
Static list import orphans — contacts added to a static list via import or POST /contacts/v1/lists/{listId}/add remain list members even after the underlying contact record is hard-deleted from the CRM. These orphan IDs return errors on any subsequent contact-level API call and pollute downstream sync pipelines.
Lead scoring model disagreement — writing an external score to a custom contact property while HubSpot's native Lead Scoring tool computes its own score creates two competing signals. Sales works from the HubSpot Score field; marketing automation triggers on the custom property. The two scores diverge and nobody knows which one to trust.
List-membership webhook missed events — HubSpot's webhook system delivers contact.propertyChange events for lifecyclestage updates and list-membership changes via HTTP POST with no retry on 5xx responses. A single downstream outage during a bulk-import window can drop hundreds of membership events permanently with no dead-letter queue or re-delivery mechanism.
Cross-portal list sync — agencies managing multiple HubSpot portals (e.g., a staging portal mirroring a production portal, or two franchisee portals needing shared suppression lists) have no native API to sync list membership between portals. Manual export-import lags by hours and has no idempotency guarantee.
Prerequisites
HubSpot account with a private app token scoped to:
The lifecycle stage enum has a defined forward direction. Any update that moves a contact backward is almost certainly a data pipeline bug, not an intentional business action.
Canonical stage order (HubSpot internal values, not display labels):
Build and harden HubSpot v3 webhook handlers that survive production: HMAC-SHA256
signature verification, Redis SET NX deduplication, async batch processing with
immediate 200 ACK, dead-letter queuing for permanent failures, and event-ordering
guards for property-change streams. Use when implementing HubSpot webhooks for the
first time, hardening an existing handler against retry storms or duplicate
processing, debugging signature verification failures, or designing a reliable
event pipeline for