An Azure communication platform for deploying applications across devices and platforms.
Hi Arup Kar & thx for join me at Q&A platform,
ur understanding is mostly correct, but there's one important distinction: associating the Teams Resource Account with ACS and granting consent are two separate operations. Both are required for the server-side TPE scenario u described.
Set-CsOnlineApplicationInstance -AcsResourceId establishes the routing association between the Teams Resource Account and ur ACS resource. After that, the Teams admin should run Sync-CsOnlineApplicationInstance to synchronize the configuration. However, this doesn't automatically authorize the ACS resource to receive and handle calls on behalf of that Resource Account.
The additional authorization is done through the Teams Phone Extension access assignments API. The ACS resource owner must issue a PUT request to /access/teamsExtension/tenants/{tenantId}/assignments/{resourceAccountObjectId}?api-version=2025-06-30, with "principalType": "teamsResourceAccount" in the request body. U can then verify the assignment using the corresponding GET request. Make sure the ID is the Resource Account's Entra object ID, not its UPN or the bot application ID.
For ur customer-developed application, this server-side consent is still required. It isn't exclusive to third-party CCaaS providers. Microsoft also confirms that Teams Contact Center Certification isn't mandatory to start building TPE solutions, although certification is recommended. The separate client-consent flow, including TeamsExtension.ManageCalls, becomes relevant when users access Teams Phone capabilities through a custom client rather than ur server-only Call Automation application.
For the PoC, I'd verify the Resource Account's bot application ID, ACS association, synchronization, Teams Phone Resource Account license, and assigned service number. Then configure the ACS Event Grid subscription and ur application's HTTPS callback endpoint. Make an inbound test call and confirm that ACS receives Microsoft.Communication.IncomingCall, that AnswerCallAsync succeeds, and that the expected Call Automation events arrive. For outbound calling, use a supported Call Automation SDK with TeamsAppSource set to the Resource Account's object ID, and verify the PSTN licensing and connectivity requirements. One detail worth checking: outbound calls using Microsoft Calling Plan numbers require the appropriate Pay-As-You-Go Calling Plan configuration.
Regarding the later move to Teams Direct Routing, u should generally be able to retain the same Resource Account and ACS association if the underlying identities and ACS resource remain unchanged. The change is primarily in the Teams PSTN configuration: configure and verify the SBC, assign the Direct Routing number, and apply the appropriate voice routing policy. I'd still revalidate the Resource Account synchronization, inbound routing, outbound calls, and caller ID after the cutover rather than assuming everything carries over automatically.
Finally, the ACS retirement announcement doesn't mean TPE itself is being retired. TPE is one of the supported Teams-integrated scenarios for continued use of ACS Call Automation. The retirement of standalone ACS Direct Routing is separate from using Teams Direct Routing with TPE, so ur planned architecture is aligned with Microsoft's supported direction.
I'd definitely complete both the Resource Account association and the server consent before testing call handling. That's the key missing step in the original provisioning sequence.
rgds,
Alex
p.s. if my answer is help - pls mark it as an answer