Lifecycles are how everything you've configured so far gets wired together. Triage classifies, assignment picks an owner, scheduled todos land on the calendar, helpdesk actions write back — but something has to decide when each of those happens for a given ticket. That something is the ticket lifecycle. Form lifecycles do the same job for custom form submissions. This is the centerpiece of admin work.
Problem: A ticket arrives. You want triage to run. Then you want it routed and assigned. When the agent moves it to In Progress, you want a time entry started. When it closes, you want a follow-up todo created and a status pushed back to the helpdesk. Without a single place that orchestrates all of that, you end up wiring each piece independently — and the moment one trigger changes, three other things break.
Horizon's answer: Lifecycles. A lifecycle is a single, declarative description of what should happen as a ticket (or form submission) moves through its states. Define it once. Horizon translates it into the underlying workflow runs that fire at each step. You think and talk in lifecycle terms; the workflow engine runs the actual machinery in the background.
There are two kinds:
| Lifecycle | Triggered by | Used for |
|---|---|---|
| Ticket Lifecycle | a ticket entering a specific status | the lifetime of a ticket — triage, routing, assignment, notifications, helpdesk actions on close |
| Form Lifecycle | a custom form being submitted on a ticket | the actions that should run when an agent submits a form (approval requests, escalations, sub-tickets, etc.) |
Both are configured at the top level of the admin nav (Ticket Lifecycle and Form Lifecycle are pinned).
The ticket lifecycle is a list of status rules. Each rule says: "when a ticket enters status X (optionally matching filter Y), do these actions."
A status rule has:
A typical baseline setup for a service desk looks like:
| Status | Filter | Action | Notes |
|---|---|---|---|
| New | (catch-all) | Triage + Route + Assign | every new ticket gets triaged and assigned |
| In Progress | (catch-all) | (no rule, or notification only) | nothing automatic when an agent starts work |
| Resolved | (catch-all) | Helpdesk action: write follow-up note | confirm resolution |
| Closed | (catch-all) | Helpdesk action: close out related todos, write final note | clean up |
You can layer in narrower rules for special cases — "when status is New AND type is Alert, route to Alert Auto-Assign policy", "when status is Resolved AND priority is Critical, send a notification to the manager". The position field decides ordering when multiple rules would match.
1 for the first rule.That single rule replaces a stack of manual configuration: when a new ticket arrives, triage runs, and once triage commits, routing picks the right assign policy and the assign policy picks the user. All in one orchestrated flow.
Test by creating a real ticket in the helpdesk. Watch the Triage Logs and Assignment Decision Log for the ticket's lifecycle in action.
When an agent submits a custom form on a ticket (covered in the next lesson), something needs to happen. A Request Manager Approval form should send a notification to the manager. A Vendor Escalation form should create a sub-ticket and notify the vendor contact. Without a form lifecycle, the form just stores data and nothing else.
Form lifecycle rules are simpler than ticket lifecycle rules — they're scoped to a single form, and they fire on submission:
Each form gets at most one lifecycle rule. When the form is submitted, the rule's actions fire in order.
The form lifecycle rule is the bridge between "the agent filled out the form" and "these specific things now happen as a result." Without it, forms are just structured data with no consequences.
You'll see both terms in the system. Here's the difference:
The Workflows page is mostly read-only for admins — it's where you go to inspect runs, debug failures, and see what the lifecycle compiled into. You don't usually edit workflows directly; you edit the lifecycle rules and let Horizon regenerate the underlying workflows.
The exception: custom workflows outside any lifecycle (e.g. a webhook-triggered automation, a scheduled cron-style task). Those live directly in the Workflows page and are configured there.
Two pages matter:
Workflow runs also have a DAG visualization widget showing the steps as a Mermaid graph. Useful for visualizing what a lifecycle rule actually does end-to-end.
When a ticket doesn't behave as expected:
is_workflow_enabled.Tip: Build the ticket lifecycle status by status, not all at once. Start with the New status and a single catch-all rule that runs triage + assign. Get that solid. Then add the Resolved and Closed rules for cleanup. Add narrower rules with filters only when you've identified a specific case the catch-all gets wrong. Lifecycles get unmanageable fast if you create twenty rules upfront — most of them won't match anything you actually see.