Goal: scheduled campaigns you can still stop.
Step 1. Generate a batch_id when building the campaign and include it on every message in the batch.
Step 2. Set send_at to the unix timestamp of the desired send time, within 72 hours. Per-recipient timing differences go in personalization-level send_at, which overrides the message value.
Step 3. Confirm the batch: list the scheduled batch and sanity-check count and timing before the send time.
Step 4. If a mistake is found, cancel the batch by its batch_id. Cancellation only works before the send time; after delivery starts it is too late.
Step 5. Reschedule by creating a new batch with corrected content; never reuse a cancelled batch_id.
Verify: a test batch schedules, appears in the batch list, cancels cleanly, and produces no delivered events. Pitfall: scheduling more than 72 hours out is rejected; long campaigns need rolling batches.