Once helpdesk integration is live, the next foundational layer is the people side. Horizon needs to know who works tickets, what teams they're on, and when they're working. Almost every other configuration in the system — triage routing, assignment policies, watchlist deadlines, scheduled todos — assumes this layer exists.
Problem: Tickets need owners. Notifications need recipients. Calendars need owners. Panels need someone to log in. Every one of those things needs the same underlying record: a person.
Horizon's answer: A user is the Horizon-side identity for a person who works in your account. Each user can:
Where users come from
You generally don't create Horizon users by hand. New agents get created in your helpdesk provider (ConnectWise, Autotask, Zoho, HaloPSA), and Horizon ingests them on the next sync. After the helpdesk user mapping covered in helpdesk integration runs, those people show up under People → Users automatically.
The flow is: hire someone → create them in the helpdesk → wait for sync → map them in Horizon → finish their Horizon-side configuration. The "create them in the helpdesk" step is where the source of truth lives, so you don't have to manage two systems out of sync.
What you do manage in Horizon
Once a user exists, you configure their Horizon-side behavior under People → Users:
Three relation managers appear on the user edit page:
| Relation | What it does |
|---|---|
| Accounts | which Horizon accounts this user can access (multi-tenant orgs only) |
| Teams | which teams this user is a member of |
| Notification Contacts | how to reach this user — email addresses, in-app preferences, any other configured channels |
Treat a new user as production-ready once team membership, notification contacts, and a business hours plan are all set. An agent with no team can't be picked by team-based assignment policies. A user with no notification contacts won't receive anything Horizon tries to send them.
Problem: Not every person who logs into Horizon should be able to rewrite triage rules, edit lifecycles, or change how tickets get assigned. Most users should be confined to the panel where they actually do their work — Agent or Dispatch. A small number of people need the keys to the back end.
Horizon's answer: User's can have one of two roles: User or Admin. An Admin can then access the Admin Panel to make changes.
How to grant admin access
The user can now switch to the Admin panel from the panel switcher in the top bar.
What admins can do that regular users cannot
In short: anything that affects how the system behaves for everyone else lives in the Admin panel.
Tip: Keep the admin list short. Admin changes apply account-wide and can have ripple effects — a tweak to a triage policy or lifecycle can change where tickets land for the whole team. Two or three admins is plenty for most accounts. If you need to give someone limited configuration ability, that's a coverage gap, not a reason to grant full admin access — flag it to support.
Tip: Admin access is independent of team membership. An admin doesn't need to be on any team to configure the system, but if you also want them to take tickets, give them team membership separately. Conversely, removing
someone from a team does not revoke their admin access — you have to untick Admin in Panel Access explicitly.
Problem: You don't assign tickets to "the company" — you assign to a group. Tier 1, NOC, Onboarding, After-Hours, Project Services. Without a way to express those groupings, every assignment rule has to enumerate individuals.
Horizon's answer: A team is a named group of users. Teams are how Horizon expresses "this ticket goes to that group of people" without naming each person.
Teams show up everywhere:
Teams are managed under People → Teams.
Creating a team
A user can be a member of more than one team. There's no concept of primary team — when assignment runs, every team the user belongs to is considered.
Tip: Resist the urge to model your org chart. Teams are operational groupings used for routing and assignment, not your HR structure. "After-hours on-call rotation" is a fine team. "Marketing" probably isn't, unless marketing actually works tickets.
Problem: Your team isn't online 24/7. Some agents are in different timezones. Some teams cover business hours only, others cover after-hours. If Horizon doesn't know when people are working, it can't make sane decisions about "when is this ticket due?", "who's available right now?", "what's a reasonable booking slot to offer?"
Horizon's answer: Business Hours Plans. A business hours plan defines a working schedule — days of the week, hours per day, holidays, exceptions — and a timezone. Plans get linked to users (and teams use them transitively through their members).
Business hours plans live under Settings → Business Hours, but conceptually they belong with people. Once you've set up users and teams, this is the next thing you configure.
Creating a business hours plan
Why timezone lives on the plan, not the user
Different users on the same team may be in different timezones, and the same person may be covered by different plans at different times (e.g. "normal hours" and "holiday coverage"). Putting timezone on the plan instead of the user gives you the flexibility to model that.
In practice, most accounts create a small number of plans — one per office or coverage region — and link each user to the plan that matches their schedule.
What business hours actually drive
Once plans are set up, downstream features use them:
Without business hours, Horizon defaults to wall clock — which is rarely what you want for an MSP that doesn't run 24/7.
Tip: Set up your most common plan first (e.g. "US Central 8-5") and link the bulk of your users to it. You can model edge cases (after-hours rotation, regional coverage) once the common case is solid. Don't try to model every user's exact schedule on day one.
You know the people layer is set up correctly when:
Tip: People configuration is high-leverage and easy to get almost right. The mistake most accounts make is half-finishing — users created but no team membership, teams created but no business hours, business hours created but not linked to users. None of that breaks loudly. It just makes downstream features behave subtly wrong. Audit this layer end-to-end before moving on.