MS Teams to Zendesk Integration
Budget / Salary₹12,500–37,500
TypeFreelance project
LocationRemote
Posted1 hour ago
Brief: Teams Customer Chasers → Zendesk Automation
Oct 21, 2026 · @Edwin
Objective
Automatically turn customer chasers posted in Microsoft Teams group chats into tracked, prioritised actions on the matching Zendesk ticket. Agents keep working only from Zendesk; Teams becomes one more signal feeding the operational queue.
Today, chasers arrive in Teams and must be spotted, matched and acted on manually. The target behaviour: customer chases in Teams → the right ticket is identified from PNR, ticket number or subject → it is marked as chased → it rises in a dedicated Zendesk view.
Architecture
Customer chaser in Teams → automation captures message → extracts PNR / ticket no. → searches Zendesk → matches ticket → updates it via Zendesk API → native Zendesk trigger → Customer Chasers view → agent action.
• Why not the standard Zendesk for Teams app: it lets agents view, create and update tickets in Teams, but does not auto-match chasers or reprioritise tickets.
• Division of labour: the automation performs the external Teams → Zendesk update; native Zendesk triggers handle routing and priority afterwards. Zendesk warns against triggers calling webhooks back into the same ticket (race conditions).
• Message capture: every new customer message in the relevant Teams group chats must be captured in near real time, through a dedicated operations/service Teams account that is a member of every customer chat.
• Identity: OAuth credentials on a dedicated integration identity for production, never personal credentials.
Zendesk setup (before building the flow)
Custom field
Type
Purpose
Teams Chaser
Checkbox
Flags tickets chased on Teams
Teams Chaser Count
Number
Chaser events received
Last Teams Chaser
Date/time
Latest chase; drives duplicate suppression
Teams Match Status
Dropdown
Auto Matched / Manual Match / Unmatched
PNR
Text
Matching key (confirm it already exists)
Tags: teams_chaser (matched), teams_unmatched_chaser (exceptions). Add tags additively so existing tags are not overwritten.
Views:
• Customer Chasers — Teams Chaser = Yes. Columns: Ticket ID, Subject, PNR, Status, Assignee, Chaser Count, Last Chaser. Grouped 3+ chasers, then 1–2, then normal queue; normal SLA order within each.
• Unmatched Teams Chasers — tag teams_unmatched_chaser. The safety net.
Automation requirements
For every new customer message, the automation must:
1. Capture the message from the customer Teams group chat as it arrives.
2. Clean it to plain text (strip Teams HTML formatting).
3. Extract the PNR: the 6 characters after PNR:, spaces removed (e.g. PNR: ENIPEC → ENIPEC). Version 1 handles explicit PNR: only.
4. Extract the ticket number after TKTN: (e.g. 978-7493167546). Keep multi-ticket strings such as 160-7363702923/21/22/24 whole for now.
5. Retain the full message text for subject/request-type matching.
6. Search Zendesk tickets for the PNR (Search API, type:ticket ).
7. Evaluate the results (0, 1 or 2+ plausible tickets) against the matching rules below.
8. Update the matched ticket via the Zendesk API: internal note ("public": false — never emailed to the customer), Teams Chaser = Yes, Chaser Count + 1, Last Teams Chaser = now, Match Status = Auto Matched, tag teams_chaser.
9. Hand over to Zendesk: a native trigger surfaces the ticket in Customer Chasers.
Example note: CUSTOMER CHASER RECEIVED VIA TEAMS — PNR: ABLSJB — Customer message: Re:[Voyzant] (TIANTAI) PNR:ABLSJB, TKTN:978-7493167546, Inquiry of name correction.
Matching rules
Principle: when uncertain, don't guess. Key priority: Zendesk ticket # → PNR → ticket number (TKTN) → subject/request type.
Situation
Action
PNR + exact/near-exact subject
Auto match
PNR + TKTN + request type
Auto match
PNR + TKTN, one plausible result
Auto match
PNR + request type, one result
Auto match
PNR only, multiple tickets
Unmatched
No PNR
Unmatched
Multiple plausible results
Unmatched
Example: PNR KCAQDG returns #18201 Refund, #18244 Involuntary Reissue, #18301 Name Correction. The chaser reads "Inquiry Involuntary Reissue" with TKTN 160-7363702923, so #18244 is selected.
To raise match rates, ask customers to use a standard subject: 1589052 | PNR ABC123 | Refund Pending.
Unmatched handling
No confident match creates an exception ticket (POST /api/v2/tickets), so no chaser is lost.
• Retry first: Zendesk search indexing can lag a few minutes. On zero results, wait 2–3 minutes and search once more before raising an exception.
• Exception ticket: subject UNMATCHED TEAMS CHASER – ; internal details list PNR, TKTN, customer message, possible matches (e.g. #18201, #18244, #18301), reason, and "ACTION REQUIRED: identify the correct ticket and apply the chaser". Tag teams_unmatched_chaser.
• Routing trigger: tag teams_unmatched_chaser → Group = B2B Operations / Floor Support, Priority = High. One named owner per shift.
• Exception SLA: 0–5 min Match Required · 5–10 min Match Overdue · 10+ min Supervisor Alert.
• Teams alert: if still unhandled, the automation posts to an internal ops group chat: PNR, customer, minutes waiting, number of possible tickets, link to the Unmatched queue.
Escalation, duplicates and limitations
Escalation tiers (Zendesk triggers on Chaser Count; do not set Urgent on every message):
Chaser count
Action
1
Tag teams_chaser
2
Appears in Customer Chasers – Priority
3
Priority = High + notify supervisor
4+
Operational escalation
Duplicate suppression: if Last Teams Chaser on the same ticket is under 10 minutes old, add the note only; otherwise increment the count. Four messages in three minutes = one chaser event, each still recorded.
Limitations:
• Capture must cover the way customers actually chase: group chats, channel replies, shared channels and 1:1 chats may each need separate handling.
• Capture only works for chats the service account belongs to.
• Search index lag (see retry above).
Rollout and open decisions
No AI is needed for version 1. Build in three phases, proving each on test tickets before moving on.
1. Phase 1 – MVP: capture Teams message → extract PNR → search Zendesk → add internal note.
2. Phase 2 – Prioritisation: multi-ticket matching, chaser count, Zendesk views and escalation tiers.
3. Phase 3 – Safety net: unmatched workflow, search retry, exception SLA, Teams alerts, duplicate suppression.
4. Later: automated Teams acknowledgements to customers (e.g. "Chaser recorded against #1589052 · Status: Pending · Assigned: John · Chaser count: 2"), only once matching is reliable; fallback PNR detection without the PNR: prefix.
Open decisions:
[ ] Confirm chasers arrive via group chats (vs channels, shared channels or 1:1 chats)
[ ] Provision the dedicated Teams service account and add it to all customer chats
[ ] Zendesk admin to create fields, tags, views and OAuth credentials
[ ] Name the per-shift owner of the Unmatched view
[ ] Agree the standard customer subject format
Oct 21, 2026 · @Edwin
Objective
Automatically turn customer chasers posted in Microsoft Teams group chats into tracked, prioritised actions on the matching Zendesk ticket. Agents keep working only from Zendesk; Teams becomes one more signal feeding the operational queue.
Today, chasers arrive in Teams and must be spotted, matched and acted on manually. The target behaviour: customer chases in Teams → the right ticket is identified from PNR, ticket number or subject → it is marked as chased → it rises in a dedicated Zendesk view.
Architecture
Customer chaser in Teams → automation captures message → extracts PNR / ticket no. → searches Zendesk → matches ticket → updates it via Zendesk API → native Zendesk trigger → Customer Chasers view → agent action.
• Why not the standard Zendesk for Teams app: it lets agents view, create and update tickets in Teams, but does not auto-match chasers or reprioritise tickets.
• Division of labour: the automation performs the external Teams → Zendesk update; native Zendesk triggers handle routing and priority afterwards. Zendesk warns against triggers calling webhooks back into the same ticket (race conditions).
• Message capture: every new customer message in the relevant Teams group chats must be captured in near real time, through a dedicated operations/service Teams account that is a member of every customer chat.
• Identity: OAuth credentials on a dedicated integration identity for production, never personal credentials.
Zendesk setup (before building the flow)
Custom field
Type
Purpose
Teams Chaser
Checkbox
Flags tickets chased on Teams
Teams Chaser Count
Number
Chaser events received
Last Teams Chaser
Date/time
Latest chase; drives duplicate suppression
Teams Match Status
Dropdown
Auto Matched / Manual Match / Unmatched
PNR
Text
Matching key (confirm it already exists)
Tags: teams_chaser (matched), teams_unmatched_chaser (exceptions). Add tags additively so existing tags are not overwritten.
Views:
• Customer Chasers — Teams Chaser = Yes. Columns: Ticket ID, Subject, PNR, Status, Assignee, Chaser Count, Last Chaser. Grouped 3+ chasers, then 1–2, then normal queue; normal SLA order within each.
• Unmatched Teams Chasers — tag teams_unmatched_chaser. The safety net.
Automation requirements
For every new customer message, the automation must:
1. Capture the message from the customer Teams group chat as it arrives.
2. Clean it to plain text (strip Teams HTML formatting).
3. Extract the PNR: the 6 characters after PNR:, spaces removed (e.g. PNR: ENIPEC → ENIPEC). Version 1 handles explicit PNR: only.
4. Extract the ticket number after TKTN: (e.g. 978-7493167546). Keep multi-ticket strings such as 160-7363702923/21/22/24 whole for now.
5. Retain the full message text for subject/request-type matching.
6. Search Zendesk tickets for the PNR (Search API, type:ticket ).
7. Evaluate the results (0, 1 or 2+ plausible tickets) against the matching rules below.
8. Update the matched ticket via the Zendesk API: internal note ("public": false — never emailed to the customer), Teams Chaser = Yes, Chaser Count + 1, Last Teams Chaser = now, Match Status = Auto Matched, tag teams_chaser.
9. Hand over to Zendesk: a native trigger surfaces the ticket in Customer Chasers.
Example note: CUSTOMER CHASER RECEIVED VIA TEAMS — PNR: ABLSJB — Customer message: Re:[Voyzant] (TIANTAI) PNR:ABLSJB, TKTN:978-7493167546, Inquiry of name correction.
Matching rules
Principle: when uncertain, don't guess. Key priority: Zendesk ticket # → PNR → ticket number (TKTN) → subject/request type.
Situation
Action
PNR + exact/near-exact subject
Auto match
PNR + TKTN + request type
Auto match
PNR + TKTN, one plausible result
Auto match
PNR + request type, one result
Auto match
PNR only, multiple tickets
Unmatched
No PNR
Unmatched
Multiple plausible results
Unmatched
Example: PNR KCAQDG returns #18201 Refund, #18244 Involuntary Reissue, #18301 Name Correction. The chaser reads "Inquiry Involuntary Reissue" with TKTN 160-7363702923, so #18244 is selected.
To raise match rates, ask customers to use a standard subject: 1589052 | PNR ABC123 | Refund Pending.
Unmatched handling
No confident match creates an exception ticket (POST /api/v2/tickets), so no chaser is lost.
• Retry first: Zendesk search indexing can lag a few minutes. On zero results, wait 2–3 minutes and search once more before raising an exception.
• Exception ticket: subject UNMATCHED TEAMS CHASER – ; internal details list PNR, TKTN, customer message, possible matches (e.g. #18201, #18244, #18301), reason, and "ACTION REQUIRED: identify the correct ticket and apply the chaser". Tag teams_unmatched_chaser.
• Routing trigger: tag teams_unmatched_chaser → Group = B2B Operations / Floor Support, Priority = High. One named owner per shift.
• Exception SLA: 0–5 min Match Required · 5–10 min Match Overdue · 10+ min Supervisor Alert.
• Teams alert: if still unhandled, the automation posts to an internal ops group chat: PNR, customer, minutes waiting, number of possible tickets, link to the Unmatched queue.
Escalation, duplicates and limitations
Escalation tiers (Zendesk triggers on Chaser Count; do not set Urgent on every message):
Chaser count
Action
1
Tag teams_chaser
2
Appears in Customer Chasers – Priority
3
Priority = High + notify supervisor
4+
Operational escalation
Duplicate suppression: if Last Teams Chaser on the same ticket is under 10 minutes old, add the note only; otherwise increment the count. Four messages in three minutes = one chaser event, each still recorded.
Limitations:
• Capture must cover the way customers actually chase: group chats, channel replies, shared channels and 1:1 chats may each need separate handling.
• Capture only works for chats the service account belongs to.
• Search index lag (see retry above).
Rollout and open decisions
No AI is needed for version 1. Build in three phases, proving each on test tickets before moving on.
1. Phase 1 – MVP: capture Teams message → extract PNR → search Zendesk → add internal note.
2. Phase 2 – Prioritisation: multi-ticket matching, chaser count, Zendesk views and escalation tiers.
3. Phase 3 – Safety net: unmatched workflow, search retry, exception SLA, Teams alerts, duplicate suppression.
4. Later: automated Teams acknowledgements to customers (e.g. "Chaser recorded against #1589052 · Status: Pending · Assigned: John · Chaser count: 2"), only once matching is reliable; fallback PNR detection without the PNR: prefix.
Open decisions:
[ ] Confirm chasers arrive via group chats (vs channels, shared channels or 1:1 chats)
[ ] Provision the dedicated Teams service account and add it to all customer chats
[ ] Zendesk admin to create fields, tags, views and OAuth credentials
[ ] Name the per-shift owner of the Unmatched view
[ ] Agree the standard customer subject format
Apply on Freelancer →
Project sourced from Freelancer.com. Applications happen directly on the original platform — we never collect your data.