This integration reads your service desk’s own Microsoft tenant. It is separate from the Microsoft 365 integration that lets agents act on your end-clients’ tenants.
Set it up
You’ll need an administrator of your own Microsoft 365 tenant for step 2 — someone who can grant admin consent (typically a Global Administrator).Open the integration
Go to Integrations → Directory → Scheduling and click Microsoft Teams — Workforce Availability. The connect panel walks you through the next three steps.

Grant admin consent
Click Open consent page. Microsoft’s consent screen opens in a new tab and lists what Neo asks for — sign-in basics plus four read-only application permissions:
Neo never writes anything in your tenant, and these permissions do not cover chats, files, or mail. After you accept, you land back in the Neo dashboard — click Continue setup to return to the integration.
| Permission on the consent screen | Why Neo needs it |
|---|---|
| Read presence information for all users | Live Teams presence (Away/Offline/out-of-office) at dispatch time |
| Read all schedule items | Your Teams Shifts rota, if you use one |
| Read all group memberships | Listing your Teams and their members for the technician auto-map |
| Read all users’ full profiles | The members’ email/sign-in name — the key the auto-map matches technicians on |
Pick your team(s)
Back in the panel, the team list loads. If it still says Teams can’t be listed yet, consent hasn’t completed or is still propagating — wait a minute and click Retry. Tick the Microsoft Team(s) where your service desk lives, or leave all unchecked to scan every Team in the tenant.
Auto-map technicians
Click Run auto-map. Neo matches each PSA technician to their Microsoft account by comparing the technician’s email in your PSA against the team members’ email/sign-in name (UPN), then shows a Matched / Unmatched review. Map any unmatched technicians manually — see Mapping technicians.
Turn it on per workflow
Enable the Teams availability toggle on a Ticket Dispatch action. If your rota lives in the Teams Shifts app, also pick the rota team(s) in the toggle’s settings.
Mapping technicians
The integration runs on one piece of state: a link from each PSA technician to their Microsoft account. Dispatch only sees presence and shifts for mapped technicians.- Auto-map matches on email. The technician’s email address in your PSA must equal the Microsoft account’s email or sign-in name (UPN). Technicians whose PSA record uses a different address — an alias, a shared address, a personal email — come back as Unmatched.
- Manual mapping. Open Technicians, edit the technician, and fill in the Microsoft Teams Mapping section. A badge shows whether the mapping came from the auto-map (Auto-mapped) or was set by hand (Manual).
- Re-running auto-map never touches manual work. Manual mappings are never overwritten or cleared by auto-map runs. A full-tenant re-run (no teams selected) also clears auto-derived mappings for technicians who no longer match — for example, someone who left the company — while a run scoped to specific teams only adds and updates.
- To remove a mapping by hand, clear both fields in the technician’s Microsoft Teams Mapping section and save.
What dispatch does with it
Live presence. A technician whose presence is Away, Offline, or who has out-of-office set is treated as on a break and is skipped for work starting now. Busy, In a call, Presenting, Do not disturb, and Be right back all still count as working — being occupied is what workload balancing is for; the presence check only asks “are they at their desk and on the clock?”. Presence is a right-now signal, so it is time-scoped: when the workflow books a schedule entry further in the future, a technician on a break right now can still get that slot — only slots starting within the next ~2 hours are blocked by live presence. Shifts. If you configure the rota team(s) in the dispatch action’s Teams availability settings, Neo reads each mapped technician’s upcoming shifts and prefers technicians whose shift covers the proposed assignment time. A mapped technician with no shift in the planning window is deprioritized as likely off-rota (custom instructions can override). Shifts influence AI dispatch only; Round Robin uses the on-break presence check. Fallbacks. The integration never blocks dispatch. If Teams can’t be reached, consent was revoked, or no technicians are mapped, dispatch falls back to its normal PSA-based logic and the run output notes why presence wasn’t used. Technicians without a mapping are simply judged on the other criteria — they are never penalized for missing presence data.Check that it’s working
Run the dispatch workflow on a test ticket and open the execution’s details:- When presence was used, the dispatch reasoning references the technicians’ Teams availability (on a break vs. working).
- When it wasn’t, the run output says why in plain words — for example, “Teams availability is enabled, but none of the candidate technicians are mapped to a Microsoft user — dispatch used PSA-only availability.” That message points you back to the auto-map step.
Custom instructions
The default break rules can be overridden per workflow with dispatch custom instructions, for example:- “Treat Do not disturb as unavailable.”
- “Ignore Teams presence for P1 tickets.”
Troubleshooting
The team list says consent hasn't been granted (or keeps failing)
The team list says consent hasn't been granted (or keeps failing)
Consent must be granted by an admin of your own M365 tenant. Grants can take a minute to propagate — click Retry. If it persists, re-open the consent page and make sure the flow completed: you should land on a “Consent granted” confirmation before returning to the integration.
Auto-map returns everyone as Unmatched
Auto-map returns everyone as Unmatched
The match key is the technician’s email address in your PSA versus the Microsoft account’s email/sign-in name. Spot-check a couple of technicians: if your PSA stores a different address (alias, distribution address, personal email), either fix the PSA email or map those technicians manually on the Technicians page.
A technician on a break still got a ticket
A technician on a break still got a ticket
Two by-design cases: the assignment was a schedule entry starting more than ~2 hours out (live presence only blocks imminent work — the calendar and shifts govern later slots), or the technician shows Do not disturb / Busy / Be right back, which count as working. To change the defaults, use custom instructions (e.g. “Treat Do not disturb as unavailable”).
A technician's presence is never considered
A technician's presence is never considered
Check, in order: the Teams availability toggle is on for that workflow; the technician is mapped (Technicians page → Microsoft Teams Mapping); and they actively use Teams — accounts without a Teams license or an active session report an unknown presence, which Neo treats as “no signal” rather than on-break, so those technicians are judged on the other criteria only.
Shifts don't seem to influence ranking
Shifts don't seem to influence ranking
Shift preference requires: the rota team(s) set in the dispatch action’s Teams availability settings (picking teams in the integration’s auto-map step is not the same thing), the rota actually living in the Teams Shifts app of those teams, and the technicians being mapped. It is also a soft preference for AI dispatch only — Round Robin doesn’t consult shifts.
Security and data
- Access is read-only and confined to your own tenant — the four application permissions above, granted through Microsoft admin consent and revocable in your Entra admin center at any time.
- These permissions do not let Neo read your chats, files, mail, or calendars.
- The only thing Neo stores is the per-technician mapping (the Microsoft account ID and sign-in name on the technician record). Presence and shift data are read at dispatch time and never persisted.
Public API
The integration can also be configured programmatically:GET /public-api/teams-availability/consent-url— get the admin-consent URLGET /public-api/teams-availability/teams— list your tenant’s TeamsPOST /public-api/teams-availability/auto-map— run the technician auto-map
GET /public-api/openapi.json.