Hi @bryce-corey , that “everything enrolls at once and hammers the API” pain is real.
In 2025 The cleanest fix inside HubSpot is to let the workflow’s Custom Code action retry for you and add jitter so calls don’t land in the same second. In Node, don’t swallow the 429.
Throw it so HubSpot retries the step automatically; the docs are explicit about this for both Node and Python (https://developers.hubspot.com/docs/api-reference/automation-actions-v4-v4/custom-code-actions )
Pair that with a small randomized delay before each outbound call so 10k enrollments don’t align. Even 0–9 seconds of jitter usually collapses collisions nicely.
Outside the code, stagger the firehose. A simple way is to pre-slice your audience into static lists and trigger the workflow list by list on a schedule, or rotate to a temporary “throttle owner” and gate each branch with a short delay so only a fraction progresses at any moment. That keeps concurrency under control without changing your business logic
One clarifier to size the throttle: are you calling HubSpot APIs, external APIs, or both from the custom code?
Two extra considerations. First, honor any Retry-After header you get on 429s and back off progressively; the built-in retries do their part, but a bit of exponential backoff in your code is cheap insurance
Second, if you’re authenticating as a public app, note HubSpot’s burst limit is now 110 requests per 10 seconds, not 100, which gives a touch more headroom but still demands batching and jitter
(https://developers.hubspot.com/changelog/increasing-our-api-limits )
Hope this helps. If consistency between HubSpot and your finance or ops system is the gap, Stacksync keeps them mirrored as changes happen.