Schedules

Schedules

A schedule is a stored action that runs at a specific time or on a recurring basis. Common uses: pause Apple Search Ads at midnight when your audience is asleep, resume at 7am, rotate creatives on Monday morning.

List schedules

adduck schedule list
$ adduck schedule list

  ID    LABEL            ACTION  PLATFORM  AT      ENABLED
  ──────────────────────────────────────────────────────
  sc-1  nightly-pause    pause   apple     00:00   yes
  sc-2  morning-resume   resume  apple     07:00   yes
  sc-3  weekend-budget   budget  reddit    Fri     yes
  sc-4  monday-rotate    rotate  meta      Mon     no

Add a schedule

adduck schedule add [flags]
FlagDescription
--label <name>Human-readable name for the schedule.
--platform <name>Which platform to act on.
--action <type>One of: pause, resume, budget, rotate.
--campaigns <ids>Comma-separated campaign IDs. Omit to target all campaigns on the platform.
--at <time>Time to run. See format section below.
--budget-amount <n>Required for --action budget. Amount in dollars.
--disabledAdd the schedule in disabled state. Enable later with schedule enable <id>.

Examples

# pause all apple campaigns at midnight adduck schedule add \ --label "nightly-pause" \ --platform apple \ --action pause \ --at "00:00" # resume them at 7am adduck schedule add \ --label "morning-resume" \ --platform apple \ --action resume \ --at "07:00" # raise reddit budget on weekday mornings adduck schedule add \ --label "weekday-boost" \ --platform reddit \ --action budget \ --campaigns "abc123" \ --budget-amount 150 \ --at "Mon,Tue,Wed,Thu,Fri 09:00"

Time formats

The --at flag accepts several formats:

FormatExampleMeaning
HH:MM00:00Daily at midnight (local time)
Day HH:MMMon 09:00Every Monday at 9am
Days HH:MMMon,Wed,Fri 08:00Multiple days, same time
Weekday HH:MMWeekday 07:00Monday through Friday
Weekend HH:MMWeekend 10:00Saturday and Sunday
YYYY-MM-DD HH:MM2026-12-25 00:00One-time run on a specific date

All times are in your local system timezone unless you set ADDUCK_TIMEZONE in your environment.

Running schedules

Schedules don't run themselves. You need something to call adduck schedule run on an interval:

# add to your crontab (runs every minute) * * * * * /usr/local/bin/adduck schedule run --config /path/to/adduck.json

adduck schedule run checks all enabled schedules and executes any whose time has come. It's idempotent -- running it twice in the same minute won't trigger an action twice.

Actions

pause

Pauses the targeted campaigns. Obeys guardrails and protected campaign list. If a campaign is already paused, it's skipped.

resume

Resumes paused campaigns. If a campaign is already active, it's skipped.

budget

Sets the daily budget on targeted campaigns to --budget-amount. Subject to maxBudgetChangePct and maxDailyBudgetMicros guardrails. Fails and logs if the guardrail would be violated.

rotate

Cycles through campaigns in a round-robin pattern. On each run, the previously active campaign is paused and the next one in the list is resumed. Used for rotating creative sets or A/B variants on a schedule.

# rotate between 3 apple campaigns, one at a time, every Monday adduck schedule add \ --label "creative-rotation" \ --platform apple \ --action rotate \ --campaigns "111,222,333" \ --at "Mon 00:00"

Rotation state (which campaign is currently active) is stored in the schedule entry in adduck.json. You can manually advance it with adduck schedule rotate <id>.

Remove a schedule

adduck schedule remove <id>

Removes the schedule from adduck.json. The schedule ID is shown in adduck schedule list.

Enable / disable

adduck schedule enable <id>
adduck schedule disable <id>

Disabled schedules show in adduck schedule list but are skipped when adduck schedule run executes.

Schedule logs

Every schedule execution is logged with a timestamp and result. View recent runs:

adduck schedule logs [--id <schedule-id>] [--limit <n>]