Skip to main content
POST
Realign Sequence Enrollments

Realign Sequence Enrollments

Changing a live sequence’s sending window deliberately leaves contacts who are already waiting on an email-bound delay step alone: they keep the wake-up time their delay produced. That means a widened window never reaches them, and a narrowed window pushes them to the next allowed day - a full extra cycle on a weekly sequence. This endpoint pulls those waits forward instead. It never cancels or re-enrolls anyone.

Guarantees

  • A wait only ever moves earlier, never later.
  • A wait never moves to a different local day in the window’s timezone, so nobody changes weekly cycle.
  • A wait never moves earlier than now, so nothing is sent retroactively.
  • Per-step “wait until weekday” gates are respected: a contact is never moved earlier than the step’s own window opening.
  • Sequence windows never advance SMS, webhooks, branches, or other non-email actions.
  • Running it twice is a no-op. Waits already sitting at their opening report already_at_window_start.

Request

string
required
Sequence ID.
array
Step IDs to limit realignment to. Use nodeIds from Get Sequence or currentNodeId values from List Enrollments. Defaults to every step when omitted; when provided, it must contain at least one non-empty ID.
array
Up to 500 subscriber IDs to limit realignment to. Defaults to every waiting contact when omitted; when provided, it must contain at least one non-empty ID.
string
Opaque continuation cursor. When a response has hasMore: true, pass its nextCursor here to continue after the enrollments already scanned.
boolean
When true (the default), returns the new wait times without writing them. Set it to false to queue a background apply job.

Why an enrollment did not move

unchangedReasons counts each reason:

Paging through a large sequence

Each job moves at most 1,000 enrollments and inspects at most 20,000. An applied request returns HTTP 202 with a jobId; poll GET /api/v1/sequences/{sequenceId}/enrollments/realign-sending-window/jobs/{jobId} until it completes. When the completed result has hasMore: true, pass its nextCursor back as cursor to queue the next bounded job.

Responses