Hold Queued Messages (cancel scheduled steps)
li_cancel_stepsCancel specific scheduled sequence messages so they are never sent, and NOTHING ELSE. This is the tool for "hold tomorrow's Day-3, the wording is wrong" β a narrow hold on the steps you name, and nothing more.
π¨ WHAT MAKES IT DIFFERENT FROM li_mark_stopped AND li_mark_outcome, which were the only way to do this: those hand the SEQUENCE off. They set the message to handed_off and advance the contact, and handed_off is terminal for the sequence β no further automated step goes out, the contact reads as closed everywhere, and acceptance can no longer revive them (only a new message from them reopens the conversation, which the inbox sweep (about hourly) still watches for). So "hold one message" could only be said as "this person is finished with". This writes MessageStep.status = 'canceled' on the steps you name and touches no message status, no contact status and no outcome.
SO THE SEQUENCE STAYS ALIVE. The remaining steps are still pending on a live message and the drip carries on from the next one β and the next one is RE-CHAINED: if you hold the step the clock was pointing at, the one after it is re-stamped with its own delay so it actually comes due, instead of sitting pending with no time on it for ever. Each result says which step was re-pointed and when, under rescheduled. Absent means no re-chain was needed (the held step was not the scheduled one, or nothing follows it) β never that one was skipped.
Step ids come from li_campaign_contacts (every step carries its id) or li_contact_dossier. Holding several at once is fine and expected; a step named later in the same call is never used as a re-chain target, so holding Day-3 and Day-7 together cannot strand Day-14.
Refused per row, with the rest of the batch still applied: a step that is not pending (nothing is queued for it, so holding it would change nothing), a step whose sequence is replied / handed_off / completed / failed (it will never be sent), and a step on a campaign you cannot see (reported as 'Not found', the same as one that does not exist).
β οΈ A HOLD CANNOT CURRENTLY BE UNDONE, and no other tool will do it either β stated plainly because an instruction that cannot run is worse than none. li_edit_step only touches a step that is still pending, so it refuses a held one; li_reset_contact refuses a sequence that is pending / in_progress / awaiting_connection, which is exactly what this tool leaves behind. So hold a step when you want it NOT sent, and if the message is one you still want to send, reach for li_edit_step on it BEFORE holding it β rewriting the wording is reversible where holding is not. To stop reaching somebody altogether, that IS li_mark_stopped or li_mark_outcome.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Why β written onto the timeline, ONE entry per sequence rather than one per step, so six held steps across two people is two entries. | |
| stepIds | Yes | The steps to hold, up to 200 β their `id` from li_campaign_contacts or li_contact_dossier. Each is applied and reported on its own. |