Hub / Connectors / Microsoft Dynamics

Microsoft Dynamics

A managed Power Platform solution installed into your own environment: Dataverse tables, a plugin assembly, Power Automate flows, and web resources on the Case form. Where the Salesforce connector extends through Flow, this one extends through a configuration table — field mapping is data, not code.

Class In-tenant Status GA · managed solution Surface Case form + TSANET Configuration app Repo tsanetgit/MS_Power_App Updated 2026-09-13

Connector class

The second in-tenant connector, with a different extension model

Like Salesforce, everything here installs into the member's own environment and TSANet operates nothing. Intercom is the opposite pole — a TSANet-hosted gateway, because nothing can run in-tenant at all — and Zendesk sits between. What distinguishes Dynamics from Salesforce is not where the code runs but how you change its behaviour.

Both are managed packages in the member's tenant. The difference is where a member goes when the default behaviour is not what they want.
 SalesforceDynamics
Server-side codeApex classesPlugin assembly (.NET), registered on SDK messages
AutomationFlow library, clone and editPower Automate cloud flows
Field mappingWritten into the flowa configuration table
UI surfaceLightning Web ComponentsHTML + JavaScript web resources on the Case form
Feature togglesFlow activationEnvironment variables
Inbound deliveryApex REST on a public SiteRegistered webhook to Power Automate, or the scheduled poll

That third row is the one to notice. Mapping a TSANet field onto a Dynamics column is a record in the TSANet Case Mapping table, not a step in a flow — so a member can retarget the integration without opening an editor, and an admin who has never seen Power Automate can still change what lands where.

Architecture

What the solution installs

A managed solution containing six Dataverse tables, a plugin assembly registered against roughly fifteen SDK message steps, a set of Power Automate cloud flows, a model-driven configuration app, a canvas app for connection settings, and the web resources that render the collaboration UI on the Case form.

Support engineer Dynamics Case form TSANet Case subgrid Accept · Reject · Request info Send info · Close · Add note Administrator TSANET Configuration app edits Case Mapping records toggles environment variables assigns the TSANET User role Views & dashboards Dataverse tables are first-class standard model-driven views no extra plumbing needed the member's own Power Platform environment · managed solution Case form web resources ap_CaseCreateForm.html CaseTSA.js · CaseTSAButtons.js CaseResponse.js · CommonScripts.js CommonIntegration.js → plugins HTML + JS, not a PCF control Configuration apps TSANET Configuration model-driven app + sitemap Connection Settings canvas app Register webhook button where credentials and mapping live Plugin assembly TSANetPlugins.dll · server-side GetCase · GetCompany · GetForm PostCase · Approval · Note PostCaseResponseOnCreate ~15 registered SDK message steps Power Automate flows Child flow: Login → token Scheduled: cases · responses · notes On Create Case — Auto Route webhook-triggered handlers the customisation surface for routing Dataverse tables · the durable state, and it is yours ap_tsanetcase — direction · statuscode · ap_formjson (200K memo) ap_tsanetnote · ap_tsanetresponse · ap_tsanetlog ap_tsanetsetting — client id · secret · URI (400 chars) ap_casemapping — the declarative field-mapping configuration option sets: ap_direction · ap_priorities · ap_tsaresponsetypes · ap_sourcesystem Environment variables · feature toggles Auto Create TSANote by Email · Auto Create TSANote by Note Auto Routing of New Case TSANet Connect API company search · company form create collaboration case approval · approval update rejection · information · closure case notes OAuth2 or Bearer, per environment Developer · Beta · Production endpoint held in ap_tsanetsetting TSANet webhook push registered from the config app targets a Power Automate endpoint case and note events optional — polling is the default Partner member works the same case from their own connector or the web app 1 2 3 4 custom actions read / write configures reports on
Everything inside the outlined box is installed by the managed solution into the member's own Power Platform environment. Accent edges leave the environment; plain edges are internal. The green band is the durable state, held in Dataverse tables the member owns and governs.
On the UI mechanism. The published user guide describes the Case form integration as a "Lightning Web Component". That is Salesforce terminology and does not apply here — the Dynamics solution ships an HTML web resource (ap_CaseCreateForm.html) plus a set of JavaScript web resources. If you are following that guide, read "LWC" as "web resource".

Data model

Six Dataverse tables

ap_tsanetcase

The collaboration record. ap_name is the TSANet identifier (100 chars), ap_direction is inbound or outbound, and statuscode carries Open, Information, Accepted, Rejected or Closed — the API enum also has PENDINGACTION, which this option set has no value for; how the solution handles it has not been verified. ap_formjson holds the live form payload as a 200,000-character memo.

ap_tsanetnote

Notes against a case — ap_description up to 2,000 characters, plus creator name and email, related back through ap_tsanetcaseid. The API's note carries a required summary (500 characters) and an optional description (5,000), so a longer partner note is truncated here, and how the solution fills summary on outbound notes has not been verified.

ap_tsanetresponse

Formal replies on inbound cases. The response type option set covers approval, rejection, information request, information response, close and approval update. Close applies to outbound cases only — the API rejects a closure from the receiving company.

ap_tsanetsetting

Connection configuration: client id, secret, and the environment URI (capped at 400 characters). Edited through the Connection Settings canvas app.

ap_casemapping

The declarative field-mapping configuration — see below. This is the table that makes the connector reconfigurable without code.

ap_tsanetlog

Integration logging. The first place to look when a sync cycle or a plugin step misbehaves.

Four option sets ship alongside: ap_direction, ap_priorities, ap_tsaresponsetypes and ap_sourcesystem. Because these are ordinary Dataverse tables, they carry standard views, are reportable, and obey your environment's security model — a TSANET User security role granting access to the case, note and response tables ships with the solution.

Relating TSANet cases to your own tables

To surface collaborations against something other than the standard Case, add the TSANet tables to your own unmanaged solution, create a lookup from your table to ap_tsanetcase, and drop a subgrid on the form with Show related records enabled. Nothing in the managed solution needs changing.

Authentication

OAuth2 or Bearer, and they are mutually exclusive

Credentials live in ap_tsanetsetting and are entered through the TSANET Configuration app: a client id, a secret, and the environment URI. A given environment uses either OAuth2 or a bearer token — not both, and not a fallback from one to the other. Picking the wrong one for the credentials TSANet issued you is a common first-install failure. The API page documents two schemes — OAuth 2.0 client credentials, the current path, and the legacy POST /v1/login JWT; how the solution's Bearer mode maps onto those has not been verified against the solution source.

Case Mapping

Field mapping as configuration, not code

This is the connector's distinguishing feature. Rather than editing a flow to change which TSANet field lands on which Dynamics column, you create records in ap_casemapping. Three mapping types cover the three places a mapping is needed:

Mapping typeWhat it drives
Response FormPrefilling the form an agent sees when responding to an inbound case
Case CreateBuilding the Dynamics Case created when a collaboration is accepted
TSA Case default prefillSeeding a new outbound collaboration from the originating record
Because mapping is data, it moves with your environment the way data does — not the way solution components do. Plan for it in your environment-promotion process, or a mapping tuned in test will not be present in production.

Automation

What runs without an agent touching it

Three environment variables toggle the automatic behaviours, so a member can adopt them one at a time rather than all at once.

  • Auto Create TSANote by Email — a Dynamics email activity linked to the case becomes a TSANet note, so partner-visible correspondence does not have to be re-entered.
  • Auto Create TSANote by Note — the same for notes added manually to the Dynamics Case. Both toggles make platform-internal content partner-visible with no filter; unlike Zendesk's public-only rule, nothing here separates internal notes, so leave them off unless every note on a collaborating case is meant for the partner.
  • Auto Routing of New Case — the inbound path described below.
  • Case response automation — accepting a TSA case creates the corresponding Dynamics Case using the Case Create mapping, with required fields configurable.
  • Ownership and assignment changes propagate back to the collaborating member, appearing on their timeline.
  • Automatic closure after 30 days of inactivity — a platform behaviour the Salesforce page also documents; it has not been probed on this hub.

Inbound auto-routing

With Auto Routing of New Case enabled, an arriving collaboration tries to attach itself to work that already exists before creating anything new:

Inbound TSA case arrives by push or poll match on Customer Case Number no hit fall back to customer name lookup match auto-create + relate the Dynamics Case then auto-approve the collaboration no match left for manual handling the agent decides where it belongs
Matching on the partner's own case number first is what makes re-collaboration on an existing issue attach to the same Dynamics case rather than opening a duplicate. The matching logic lives in the On Create Case — Auto Route flow and is the intended place to customise: swap the match on entitlement, contract or account tier and the rest is unchanged.

Synchronisation

Polling by default, push if you register it

The solution ships with scheduled Power Automate flows that poll the Connect API on a 15-minute interval, retrieving case status and creating inbound cases, responses and notes. Agents can force an update from the main navigation rather than waiting for the next cycle.

Near-real-time delivery is opt-in: the Register webhook button in the configuration app points TSANet at a Power Automate endpoint so case and note events arrive as they happen. Registering it does not retire the schedule — the poll remains the backstop, the same belt-and-braces arrangement Salesforce and Fin / Intercom use; Zendesk's poller runs only while an agent has a tab open.

The registration is on the current webhook API: the flow behind the button subscribes on /v2/webhooks with prefixed CloudEvents types. Two details worth knowing. First, the subscription covers case creation and new notes only — responses and closures arrive with the next poll, so a case that seems slow to update after the partner acts is the schedule at work, not a fault. Second, the endpoint flow never branches on the event-type string: it validates the secret, reads the token from either payload shape, and fetches the case, which makes it immune to the bare-versus-prefixed no-op trap that catches consumers that match type strings.

Verified against the solution source at release v2.13.0.1: the registration flow calls the v2 child flow; a v1 registration flow still ships in the solution with nothing calling it, and the cleanup flow deletes subscriptions on both versions.
PathLatencySetup
Scheduled flowUp to 15 minutesShips enabled — nothing to configure
Registered webhookNear-real-timeOne button in the configuration app
Manual refreshImmediateAvailable to agents from the nav

Setup

Installation order

Import the solution

  • Request credentials and environment URLs from membership@tsanet.org
  • Install from Microsoft AppSource, or download the managed solution from the GitHub releases page
  • At make.powerapps.com, select the target environment and run Import Solution
  • Create the connections when prompted — the import validates every connection reference before it completes
  • Supply the TSANet credentials and endpoint during import

Configure

  • Open the TSANET Configuration app and enter client id, secret and URI; choose OAuth2 or Bearer
  • Assign the TSANET User security role at admin.powerplatform.microsoft.com
  • Set the three environment variables to match the automation you want
  • Create Case Mapping records for the three mapping types
  • Optionally click Register webhook for near-real-time delivery
  • Add the TSANet Case subgrid to the Case form, and to any custom table you want collaborations against

Limits & gotchas

Constraints worth knowing before you design around them

  • OAuth2 and Bearer are mutually exclusive per environment. There is no fallback between them; the wrong choice fails at the first call.
  • ap_formjson caps at 200,000 characters. Large process forms with many fields and long option lists are the realistic way to approach it.
  • Lookup search attributes target a single entity only. A polymorphic lookup will not resolve through Case Mapping.
  • The URI field caps at 400 characters.
  • Two API rules this page does not repeat. Rejections arrive as HTTP 500 unless the caller sends Accept: application/problem+json, and there is no idempotency key on create — a retried create is a second case. Both on Working with the API.
  • Scheduled flows are the default, not real time. If a member expects instant inbound delivery, register the webhook — otherwise plan around a 15-minute worst case.
  • Routing customisation needs Power Automate editor access. Field mapping does not, but changing how a case is matched does.
  • Mapping records are data. They do not travel with a solution export; include them in your environment-promotion plan.
  • Check ap_tsanetlog first when something silently fails — it is the integration's own log table.