# Scheduled Start & End

Auto-launch a draft at a future time. Auto-complete a running test at a future time. Both checked every 5 minutes; auto-start requires the test to be launch-ready.

Auto-launch a draft at a future time, or auto-complete a running test at a future time. Useful for coordinating a launch with a marketing campaign, or for setting a hard end date on a fixed-duration test.

Scheduled times are independent and optional. You can set just a start, just an end, both, or neither. Most teams use scheduled end alone — running tests until a campaign wraps — and start manually when they're ready. The launch-when-ready scheduled-start flow is for coordinated launches: a feature ships at 9am, the test starts at 9am, no one has to be at a keyboard.

Behind the scenes a background job sweeps every 5 minutes and transitions tests whose scheduled time has passed. There's no second-level precision — a test set to start at 10:00 might transition at 10:04. If you need exact-to-the-second timing, transition manually.

## The two fields

### Scheduled start (`scheduled_start_at`)

Auto-launch a draft at a future time.

Set on a draft. When the time arrives, Otter transitions the test to running — the same transition as a manual Start, with the same notifications and lifecycle effects.

### Scheduled end (`scheduled_end_at`)

Auto-complete a running test at a future time.

Set on any non-archived test. When the time arrives, and the test is running, Otter completes it — records the ended-at timestamp, freezes results, stops new assignments.

## How the scheduler works

- **Checked every 5 minutes.** Background work picks up scheduled tests whose time has passed and transitions them in a single batch. Expect up to a 5-minute lag.
- **Auto-start has a readiness guard.** Before flipping a draft to running, the scheduler verifies the test has at least 2 variants and at least 1 goal. If either is missing, the auto-start is skipped silently and the test stays a draft. Finish the configuration and the next tick will pick it up.
- **Auto-end only fires on running tests.** If the test is paused when the scheduled end time arrives, nothing happens — the scheduler waits. Resume the test and, if the scheduled end has now passed, Resume itself is blocked (with a prompt to update the end date first).
- **Activity log records the source.** Auto-transitions appear as `scheduled_start` or `scheduled_end` events — distinct from manual Start/Complete — so you can tell at a glance whether a transition was time-driven or hand-driven.
- **Schedule fields are draft-only edits.** Like other test settings, scheduled times can't be changed once a test leaves draft. If you need to extend a running test's end date, complete it manually, duplicate, and relaunch the duplicate with the new schedule.

> **When scheduled times help:**
>
> - **Coordinate with a campaign.** Set scheduled end to the date the campaign wraps. The test stops attributing conversions on cue, so the result reflects only the campaign window.
> - **Cap a low-traffic experiment.** Combine scheduled end with stop conditions to set both a time and a sample-size ceiling. Whichever trips first ends the test.
> - **Don't rely on scheduled start for last-minute changes.** Once the scheduled time arrives, auto-start runs without confirmation. If you're still tweaking the variants, leave the schedule blank and start manually.
> - **Times are stored in UTC.** The dashboard shows them in the project's reporting timezone for display, but the field underneath is UTC. Set times mindfully across DST boundaries.

## Frequently asked questions

### What does scheduled start actually do?

If a draft has scheduled_start_at set and that time has arrived, Otter transitions it from draft to running automatically — the same transition a manual Start would do. No new prompt, no confirmation; the test just goes live. The activity log records this as a 'scheduled_start' event distinct from a manual start, so future-you can tell whether the test launched on schedule or by hand.

### What if the test isn't ready when the scheduled start fires?

Auto-start is gated by the same readiness check a manual Start runs — at least 2 variants, exactly 1 control, at least 1 goal, exactly 1 primary goal, and a connected GA4 property if any goal is a GA4 event. If anything is missing when the scheduled time arrives, the auto-start is skipped and the test stays a draft. The check runs every 5 minutes, so if you finish the configuration before the next tick, the test will pick up and launch on the following tick.

### What does scheduled end do?

If a running test has scheduled_end_at set and that time has arrived, Otter transitions it from running to completed automatically. Like manual Complete, this records ended_at and freezes results — no new assignments, no new conversion attribution. The activity log records this as 'scheduled_end' so the audit trail makes clear it was time-driven, not a manual call.

### How precise are scheduled transitions?

Within about five minutes. A background job runs every 5 minutes and checks for tests whose scheduled time has passed. A test scheduled to start at 10:00 might actually transition at 10:04. For most use cases this is fine; if you need second-level precision, transition manually.

### Can I pause a test that has a scheduled end?

Yes. The scheduled-end checker only fires on running tests, so a paused test is safe from auto-completion. When you resume, the checker is back in effect — but if the scheduled end has already passed by then, Resume itself is blocked (with a message asking you to update the end date first). This prevents resuming into an instantly-completed state.

### What happens to scheduled times when I duplicate a test?

Both scheduled_start_at and scheduled_end_at are cleared on duplicate. The duplicate is a fresh draft — it'd be surprising for a copy to inherit a launch date pinned to the original. Set new scheduled times on the duplicate if you want them.

### What happens to scheduled times when I restore an old version?

If the snapshot's scheduled time is in the past at the moment of restore, it's coerced to nil. Future-dated times are restored as-is. This avoids restoring into a state where the scheduler immediately tries to act on a long-expired schedule — see the Version History section for the broader restore semantics.

### Can I set just a start time, just an end time, or both?

Any combination, including neither. Both fields are independent and optional. A common pattern: leave scheduled_start_at blank (launch manually when ready), set scheduled_end_at to the date a marketing campaign ends. Another: schedule both for a coordinated launch tied to a feature release.

### Why would my scheduled time not be exact even down to the minute?

Three things to know: (1) the check runs every 5 minutes, so the actual transition lags up to one batch interval; (2) the times are stored in UTC; the dashboard converts to your project's reporting timezone for display; (3) leap-second and DST edge cases are handled by the underlying job framework — there's no risk of double-fires or skipped windows, just the standard 5-minute granularity.

### Can I change a scheduled time after the test is running?

Like other test fields, schedule times are locked once a test leaves draft. To shift the scheduled end of a running test, the path is to complete it manually, duplicate it, and relaunch the duplicate with the new schedule. If this is a frequent need, contact support — we'd like to hear the use case.

---

Canonical page: https://www.otterab.com/docs/building-tests/scheduled-tests
