Dynamics 365 Rescue Services: How to Fix a Failed or Stalled Implementation

A technical guide to remediating a Dynamics 365 Customer Engagement or Power Platform project that has stalled, including how an independent assessment finds the root cause and a worked remediation of Customer Service unified routing.

This guide explains the step by step process for rescuing a failing Dynamics 365 Customer Engagement (CE) or Power Platform project. We detail how our independent assessment identifies root causes, whether poor requirements, technical debt, or misconfigured modules, and our method for taking over delivery to get the project back on track, based on real rescue engagements from our Yerevan team. Solzet is a Microsoft Dynamics 365 Customer Engagement and Power Platform consultancy headquartered in Yerevan, Armenia. Taking over work another partner or an internal team could not finish is a routine part of what we do, directly for end clients and on a white-label basis for other Microsoft partners.

A rescue is not a restart. The goal is normally to protect the investment already made, keep the parts of the build that are sound, and remediate only what is genuinely broken. We find out what is actually wrong first, make the system safe to run and safe to change, then deliver against a plan you can see. Where an assessment shows part of the design cannot be salvaged, we say so plainly and scope the smallest rebuild that gets you to a working solution.

What immediate crisis steps can you take with no budget or IT staff?

Many people reach this page in the middle of the failure rather than while choosing a partner: the project has stopped, the money has gone, and there is nobody technical left to ask. Everything in this section is free, needs only the licences you already hold, and can be done by a capable business user with administrator access in about a day. Do it in this order. It protects what you still have, it stops the situation getting worse, and it makes any later rescue markedly cheaper than one that starts from a system nobody preserved.

  1. Freeze change before you do anything else

    Nothing costs less or buys more time than stopping uncontrolled change. Send one written message saying that no new configuration, no new flows, and no new deployments go into the production environment until further notice, and name the single person who can lift the freeze. Then make the freeze real: cut the System Administrator and System Customizer security roles back to the few people who genuinely need them, and stop anyone editing directly in production. If an outside partner still has access, put the freeze in writing to them too and ask for a list of everything they have in flight. A frozen system is not a fixed system, but it stops the problem growing while you work out what you are dealing with, and every step below is safer once change has stopped.

  2. Take a manual backup today and find out how long your restore window really is

    Production environments are backed up by the platform automatically, but those system backups are kept only for a limited retention window, and that window is shorter than most people assume. In the Power Platform admin center, select the environment, open its backups, and create a manual backup with a note saying why you took it. Manual backups are retained longer than system ones and cost nothing beyond capacity you already hold. While you are there, read the retention period your own tenant actually shows and write down the date the oldest usable restore point expires, because that date, rather than your budget, is the real deadline on several of the decisions ahead. Do not restore anything yet. The point today is only to make sure a point to go back to still exists tomorrow.

  3. Export the data the business cannot lose into files you hold yourself

    A backup inside the tenant protects you against the environment. Files you hold protect you against everything else, including losing access to the tenant. Work through the tables the business genuinely cannot lose, normally accounts, contacts, cases or opportunities, activities, and whatever custom table holds your core records, and export each one from a view using Export to Excel as a static worksheet, or from Advanced Find where the view does not carry every column you need. Date every file and store it outside the tenant. Two things are easy to miss: notes and attachments do not come out with a standard export, and neither does anything in a table nobody remembered to list, so walk the table list rather than working from memory.

  4. Export the configuration as well, not just the records

    The build is worth as much as the data and is easier to lose. In the maker portal, open Solutions and export the unmanaged solutions that contain your customizations, then export a copy of any Power Automate flows that live outside a solution, because those are the ones that disappear quietly when a licence lapses or a person leaves. Save the exported files with the same date stamp as the data exports. If a previous partner holds the source code for plug-ins or custom controls, ask for it in writing now, while the relationship still functions, and check whether your contract already says it belongs to you. A rescue that starts with the configuration in hand is materially cheaper than one that starts by reconstructing it from the deployed system.

  5. Turn off what is actively damaging data, and write down everything you turn off

    Damage to data is a different problem from a system that merely does not work, because it compounds daily and it is the hardest thing to undo later. Look for the things that write on their own: Power Automate flows, classic workflows, automatic record creation rules, bulk delete jobs, and any integration writing into Dataverse. Read the run history for flows failing repeatedly, and for the more dangerous case of a flow succeeding while doing the wrong thing, then switch off anything overwriting, duplicating, or deleting records. Turn off rather than delete, and keep a plain list of what you disabled, when, and why, so it can be put back deliberately instead of rediscovered. If you cannot tell whether something is damaging data, ask whether anyone would notice if it stopped for a week, and if the answer is no, turn it off.

  6. Make sure your own organization holds the keys

    A surprising number of failed projects are held together by one account belonging to somebody who is about to leave. Confirm that at least two people inside your organization hold Global Administrator and Power Platform Administrator, that you know the owner and the credentials of every service account your integrations run as, and that the connections and connection references behind your flows are not all owned by one individual. Check who owns each environment, who administers the source control repository, and whether the licences on the accounts your automation runs under are current. None of this fixes anything today, and all of it decides whether a fix is still possible next month.

  7. Run the business on the smallest manual workaround you can defend

    While the system is frozen people still have to work, and the real danger is that every team invents a different workaround. Pick one and mandate it. One shared mailbox or one queue, worked by a named person on a rota, rather than mail sitting in individual inboxes. One spreadsheet, in one place, with column headings copied exactly from the fields in Dynamics 365, so what is captured by hand can be loaded back later instead of retyped. One rule that every row carries a date, a person, and the record it belongs to. Tell users plainly what is frozen, what to do instead, and when they will hear next, because silence is what sends a team back to spreadsheets permanently. Then count the hours a week the workaround costs, because that number is what turns the conversation about paying for a fix from an argument into arithmetic.

  8. Use the support you are already paying for

    Before spending anything, use what the licences already include. A Microsoft support request raised from the Power Platform admin center or the Microsoft 365 admin center costs nothing on a standard subscription, and it is the right route for anything that looks like a platform fault rather than a build mistake: an environment that will not restore, mailbox synchronization failing across the tenant, capacity blocking work, or a service level outage. Microsoft will not redesign your solution or repair a badly built customization, so be honest with yourself about which of the two you have before raising the ticket. Check the service health pages at the same time, because now and again the crisis turns out not to be yours at all.

What can an admin actually fix with zero budget and no consultant?

If you cannot spend anything and cannot hire a consultant, there is still real work an administrator can do with no licence purchase and no developer. Simplify forms and views for each role so people see only what they use. Switch off automation nobody depends on. Clean up data with Advanced Find, bulk edit, and duplicate detection. Capture evidence of every change in case anyone audits it. And use free tooling to inventory what the environment contains. Then be honest about the boundary: some problems cannot be fixed without a developer or a spend decision, and knowing which ones lets you build an internal case instead of grinding at something that will not yield.

Do these once the crisis steps above are done, one at a time, with a dated export before anything that changes data. Menu names move between releases, so where a screen does not match, check current Microsoft documentation for the same setting.

  1. Simplify forms and views for each role

    Much of what users call a broken CRM is a screen showing everything to everyone. In the maker portal, make a copy of the main form for each role that works a table differently, remove the fields and tabs that role never uses, and assign each form to the security roles that should see it, with a sensible form order so the right one opens first. Do the same with views: one short system view per role with the columns that role actually filters on, set as the default where it helps. Where people move between several unrelated areas, a model-driven app per role that only contains the tables that role needs is also configuration, not code. Hide rather than delete fields until you are sure nothing reads them.

  2. Switch off automation that is not essential

    Separate from the damaging automation already turned off in the crisis steps, most tired environments carry automation that simply adds noise and slowness: classic workflows nobody remembers, flows sending notification emails people filter to a folder, business rules duplicating each other, and duplicate detection jobs or scheduled processes running against tables nobody uses. List them, ask each business owner whether anything depends on them, and turn off, rather than delete, what nobody claims. Keep the list of what you turned off and when. Fewer moving parts makes every later diagnosis quicker, whoever does it.

  3. Clean up data with Advanced Find, bulk edit and duplicate detection

    Use Advanced Find, or the modern advanced find and view filters in newer interfaces, to build a view of one specific problem at a time: accounts with no owner, open opportunities with a close date years in the past, contacts with no email and no activity, cases still open for customers who left. Correct them from the grid with bulk edit a page at a time, or export to Excel, correct, and import back where the change is larger. Run duplicate detection jobs and merge obvious duplicates by hand. Deactivate stale records rather than deleting them, and take a dated export before every bulk change so it can be reversed. Bulk delete jobs remove data permanently, so leave them until you are certain.

  4. Capture evidence as you go, in case anyone audits this later

    Every change above is a change to a business system, so record it. Keep one dated log of what was changed, by whom, why, and how to undo it, with the export taken before each bulk edit. Check whether auditing is enabled on the tables you are cleaning, because auditing is not retroactive and the history you will want next month only exists if it is on today. Screenshots of settings before you change them take seconds and settle arguments later. This log is also the start of the internal case for budget, because it shows what has been done without spending anything.

  5. Inventory the environment with free tooling

    You cannot prioritize what you have not listed. The Power Platform admin center shows environments, capacity, and usage; the maker portal lists solutions, tables, flows and apps; and the solution checker in the maker portal runs static analysis on a solution at no cost. Where your organization permits community tools, XrmToolBox is a widely used free desktop tool whose plugins can list metadata, plug-in steps, workflows, security roles and unused fields in far less time than clicking through screens. For Power Platform estates the Microsoft CoE Starter Kit inventories apps, flows and makers. Check your internal policy before installing any third-party tool against production.

Where do it yourself stops and a rescue becomes unavoidable

The eight crisis steps and the admin fixes above are the whole of what can be done safely without help. They hold the system still and remove the friction; they do not repair the build. These are the five points where continuing alone costs more than it saves, and each one is a condition you can check for yourself rather than a judgment somebody has to sell you.

The data is already damaged rather than simply missing

Exports and a change freeze protect what is still correct. They do nothing about records overwritten, duplicated, or written into the wrong owner or the wrong state weeks ago, and correcting that by hand is where well meant DIY does the most harm. Rows have to be classified as reload, correct in place, or genuinely lost, corrected in dependency order rather than all at once, and the correction proved against counts rather than judged by eye. If your exports and your live system disagree about numbers that matter, that is the point to stop and get help.

A restore would cost you more than the failure did

Restoring a production environment is not a partial operation. It returns everything to the moment of the backup, so a restore that repairs damage done last month also destroys every legitimate record entered since. Deciding whether that trade is worth making, or finding a way to recover only the affected subset instead, needs somebody who can see exactly what changed between the two points. It is a judgment call under time pressure with no undo, and it is a poor place to be learning.

The fault is inside code that nobody left can read

No admin screen will tell you what a plug-in registered on the Dataverse event pipeline actually does, why an unmanaged layer is overriding the managed solution underneath it, or which of four writers keeps setting a column back. Where the failure sits in plug-ins, custom API, form scripts, or stacked solution layers, there is no configuration page that reveals it and no amount of careful clicking that substitutes for reading the code and the layers.

The freeze cannot be lifted, so it has become the failure

A change freeze is a fortnight tool. If after two weeks nobody can safely lift it, because there is no test environment, no reliable release path, and no confidence about what any change will break, then the freeze has stopped being a safety measure and become the problem itself. Getting from there back to a system that can be changed deliberately is engineering work on solutions, environments, and deployment, and none of it happens from inside the admin center.

The workaround has quietly become the system

Manual workarounds are meant to be temporary. Watch the hours you started counting in the last step. Once the cost of running the business by hand for another quarter passes the cost of a bounded assessment and a first round of remediation, the do it yourself phase has already ended, whatever the budget says. The same is true when the person holding the workaround together is one resignation away from taking it with them.

Which problems cannot be fixed without a developer or a spend decision, and why?

The conditions above tell you when to stop. These are the types of problem that no amount of careful administration will resolve, with the reason, so the time goes into the case for budget rather than into another weekend in the admin center.

Logic inside plug-ins, custom API or form scripts

If the behaviour comes from compiled code or JavaScript, no admin screen can change what it does, only switch whole steps on or off. Changing it safely needs the source, a developer who can read it, and somewhere to test it.

A data model that is wrong rather than untidy

A column created with the wrong data type generally cannot be converted to another type, a table modelled around the wrong concept cannot be renamed into the right one, and relationships cannot simply be moved. Fixing it means a new structure plus a data migration with dependencies, which is design and engineering work rather than cleanup.

Integrations that fail or write bad data

The fault usually sits partly outside Dynamics 365, in middleware, credentials, an external API, or custom code on the other side. An admin can pause an integration but rarely repair one, because the part that needs to change is not in the admin center.

Unmanaged layers and a release process nobody can trust

When changes cannot be moved safely between environments, or an unmanaged layer overrides what a managed solution should control, the repair is solution and ALM engineering. Configuration done on top of it makes the layering worse, not better.

Performance rooted in code or data volume

Simplifying forms helps screens that are merely crowded. Slowness caused by synchronous plug-ins, unindexed queries on large tables, or years of unarchived records needs diagnosis with tracing and changes to code or data, not to layouts.

Problems that are really licensing or capacity

Storage over capacity, users without the licence a feature needs, premium connectors, or a capability that only exists in a higher plan cannot be configured away. They are a spend decision, and pretending otherwise usually produces a workaround that costs more in hours than the licence would. Check current Microsoft licensing documentation for your own position.

How do you build a one-page cost-of-inaction calculation that unfreezes budget?

Budget rarely moves because a system is described as broken. It moves when someone can see what the current state costs per week and what it puts at risk. The page below is a method, not a benchmark: every figure in it is one you measure yourself, with its source written next to it. There are deliberately no example numbers here, because the only figures that persuade your budget holder are your own.

LineHow to measure itVariable and formula
Hours lost per weekAsk each affected team to log, for two normal weeks, the time spent on workarounds, re-keying, and chasing information the system should hold. Use loaded hourly cost from finance, not salary.H = hours per week across all teams. Weekly labour cost = H x loaded hourly cost.
Error ratePull a random sample of recent records for the process that hurts most, such as orders, cases or quotes, and count how many are wrong, incomplete or duplicated. Estimate the time to fix one and any direct cost, such as a credit note.E = wrong records divided by records sampled. Weekly error cost = weekly volume x E x cost per error.
Revenue at riskWith the sales or service owner, list the pipeline, renewals, or billable work affected by the problem in the next quarter, such as opportunities not followed up or invoices delayed. Agree a conservative share at risk with that owner, and write down who agreed it.R = value of affected revenue in the quarter x the agreed share at risk. Report it as a range with its source.
Audit and compliance exposureList the obligations the current state puts at risk: records held in spreadsheets outside the system, audit trails not being written, retention or consent rules not enforced. Do not invent penalties. Name the obligation, the gap, and the date it will next be tested.A = a short list of named gaps and dates. Kept beside the total, not added into it.
The comparisonCarry the weekly figures to the end of the quarter and set them beside the price of the smallest fundable step, normally a bounded assessment. Round down and say so.Cost of inaction per quarter = 13 x (weekly labour cost + weekly error cost) + R, with A listed underneath.

Put the quarterly total, its three lines of arithmetic, the list of audit gaps, and the smallest step you are asking for on one page. How to present it, who to take it to, and why three priced options work better than one request are set out in the funding case on our Dynamics 365 project rescue and takeover service page, alongside a fuller table of business risks to measure.

When one of those applies, the cheapest professional step is deliberately not a programme. Where nothing is being actively damaged and what you mainly need is to know what you are dealing with, a bounded Dynamics 365 health check and technical audit produces a written diagnosis and a prioritized plan that is yours to act on with any partner or with your own team. Where work is being disrupted right now, data is being damaged, or an outgoing partner is about to hand over the keys, our project rescue and takeover service starts with an environment lockdown and emergency triage in the first days instead of a discovery phase. And where you already know what has to be fixed and simply need senior hands to do it, hiring a Dynamics 365 developer directly is usually the smaller commitment of the three. If none of them are affordable this quarter, the steps above are still worth doing in full, and our guide to hiring a consultant against building it yourself names the points where configuration runs out.

How do you run emergency triage for broken automations and data corruption?

One failure on this page deserves its own procedure, because it is the one where the cost is financial, it compounds silently, and somebody outside the business eventually asks to see the paperwork: an SLA, entitlement, or billing automation that has started writing wrong values. A flow that fails loudly gets noticed. A flow that succeeds while doing the wrong thing marks cases as breached that were never breached, misses the ones that were, and quietly writes those figures into what customers are billed and credited, for weeks, with nothing in any alert to say so.

The order below is deliberate and it is not the order instinct suggests. Evidence comes before repair, because on this failure mode the evidence expires by itself: cloud flow run history is retained for weeks, and Dataverse audit data exists only if auditing was switched on before the failure and only as far back as your retention setting allows. Correcting records first feels productive and destroys both.

  1. Establish the failure window before you touch a single record

    Every decision below depends on two timestamps: when the automation started writing wrong values and when it stopped. Take them from the process itself rather than from when somebody noticed, because the two are rarely close. For a cloud flow, open the run history and find the earliest run whose output is wrong, which is often weeks before the first complaint, since a flow that succeeds while doing the wrong thing raises no alert at all. For a plug-in, use the plug-in trace log together with the modified on dates of the records it touches. Write both timestamps in one place and treat everything inside that window as suspect until it is proved otherwise. Teams that skip this correct records at random and can never afterwards tell finance how many were affected, which is the question they will be asked first.

  2. Save the flow run history now, because it expires on its own

    Cloud flow run history is retained for a limited period, commonly around four weeks, and it is removed on a rolling basis whether or not anyone is in the middle of an investigation. Before anything else, open each suspect flow, filter the run history to the failure window, and capture the trigger inputs, the inputs and outputs of the action that writes to Dataverse, and the run identifiers. Screenshots are acceptable evidence, an export is better. Do not use Resubmit while you are still investigating, because resubmitting replays the original trigger payload against current data and writes again. If several processes run on the same table, capture all of them, because a wrong value is often the result of two writers acting in an order nobody controls rather than of one broken flow.

  3. Use Audit History to prove which process wrote the value

    Open one of the damaged records and look at its Audit History under the related records. Dataverse auditing records each change with the date, the user context the change ran under, the column, the old value, and the new value, and it is the only place that reliably separates an automation write from a person. A change stamped with a service account or with the identity that owns the flow connection is the automation. A change stamped with a named user is not, and that distinction decides whether you are dealing with a build defect or a process problem. Two cautions apply. Auditing is enabled at the organization, table, and column level, and it is not retroactive, so if it was off during the failure the history you want does not exist and the run history becomes your primary evidence. Retention is set at the organization level, so check how far back your own audit data actually reaches before planning around it. If auditing is off, switch it on for the affected tables and columns today, because you are very unlikely to be at the end of this.

  4. Pause the faulty process rather than deleting or repairing it

    Turn the process off, do not delete it, and do not start editing it into a correct version. A deleted flow takes its run history with it, and an edited flow destroys the exact version that caused the damage, which is the version an auditor will ask to see. Turn off cloud flows, deactivate classic workflows and automatic record creation rules, deactivate the SLA rather than editing its KPIs, and disable the plug-in step rather than unregistering the assembly. Then check the three things people miss. Runs already in flight can complete after the trigger is switched off, so read the run history again a few minutes later instead of assuming the last write is already in. Deactivating an SLA stops it applying to new records and does not correct the instances it has already created. And a scheduled job or an integration outside the platform may be writing the same column, in which case turning off the flow changes nothing at all. Keep a plain log of what was paused, when, by whom, and why. That log is both your route back and one of the documents in the evidence checklist below.

  5. Give finance a manual breach flag on the record itself

    Pausing the automation stops the damage and also stops the business producing the numbers it bills on, so the manual replacement has to go in the same day. Add new columns to whatever record the money is calculated from, normally the case or the agreement: a choice column for the manual determination with options such as not reviewed, breach confirmed, no breach, and cannot determine, a date for when the determination was made, a lookup to the person who made it, and a short text column for what they based it on. Never reuse the columns the broken automation was writing. Those columns are evidence, and overwriting them by hand destroys the ability to show later what the system did as against what a human decided. Then build one view filtered to the failure window and sorted by value at risk, hand it to a named person, and have them work it as a queue. Finance bills from a column that carries an owner, a date, and a reason on every row, which is a position that survives being questioned, rather than from a spreadsheet that cannot be joined back to the records it describes.

  6. Quarantine the affected records instead of correcting them as they surface

    The instinct in the first hours is to fix wrong values one at a time as people report them. Resist it. Add a simple flag column, mark every record inside the failure window as suspect, populate it in bulk from the window established in the first step, and leave the values themselves alone until the whole population is known. Correcting records while the count is still moving means nobody can ever state how many were affected, the same rows get corrected twice, and the before and after evidence is lost row by row as it is overwritten. Bulk correction, when it comes, is a planned pass rehearsed in a sandbox copied from production, with counts taken before and after and with automation and duplicate detection disabled for the duration and re-enabled from a written list. The quarantine flag is what makes that pass possible, and in the meantime it tells everyone who opens one of these records that its numbers are not to be trusted.

  7. Reconcile against a source the automation never touched

    The last triage step is arithmetic, and it is the one that ends the argument. Take the quarantined population and reconcile it against something the broken process never wrote to: the raw messages or events the automation read from, the timestamps on the underlying activities, the dated exports you took, or the ledger on the other side of the integration. Produce three numbers and hold them: how many records fall inside the failure window, how many carry an incorrect value, and what the money difference between the two positions is. Those three numbers are what let you tell a customer, a regulator, or an auditor what happened without hedging, and they are also what decides how much remediation is worth buying. Until they exist, every conversation about the failure is opinion, including yours.

Evidence checklist for auditors

When an automation has affected what customers were billed, the incident does not end when the flow is fixed. It ends months later, when a customer disputes an invoice, an internal audit picks the period, or an external auditor asks how the figures were arrived at while the system was known to be wrong. Almost everything on this list has to be produced during the triage above, because by the time it is asked for the run history has rolled off, the flow has been repaired, and nobody can remember what was switched off on the second day.

  • The failure window, as two timestamps with a source for each

    The moment the automation began writing wrong values and the moment it stopped, each traced to the run history, the trace log, or the modified on dates rather than to when a person raised it. Everything else in the pack is scoped by these two numbers, so they are stated once and used consistently.

  • Exported flow run history covering the window

    Trigger inputs, the inputs and outputs of the writing action, and the run identifiers for every suspect process. Captured during triage, because this data is retained for weeks rather than years and cannot be recovered once it has rolled off.

  • Audit History extracts for a representative sample of affected records

    For each sampled record, the old value, the new value, the column, the timestamp, and the user context that made the change, which is what demonstrates that an automation and not a person produced the figure. Note in the pack whether auditing was enabled at the time, because silence on that point reads badly later.

  • The pause log

    A dated list of every flow, workflow, automatic record creation rule, SLA, plug-in step, and integration that was disabled, who disabled it, and the reason. This shows the failure was contained deliberately, and it is also the list used to bring each item back.

  • The faulty process preserved as it was

    An exported copy of the flow, solution, or code as it stood at the time of the failure, taken before anyone corrects it. A repaired process is not evidence of what the broken one did, and the version history is normally the first thing requested.

  • The manual breach register

    The export of the manual determination columns: every record, the determination, the date, the person who made it, and what they based it on. This is what allows an invoice or a credit raised during the outage to be defended line by line.

  • The affected population and its reconciliation

    The full list of quarantined records with the three counts against it: records in the window, records written incorrectly, and the value of the difference, together with the independent source they were reconciled against.

  • The correction record

    What was changed back, when, by whom, under what approval, and the counts taken before and after each pass. A correction with no counts around it is indistinguishable from a second round of damage.

  • The communication trail and a one page statement of facts

    Who was told what and when, covering customers, finance, and any regulator, plus a single page that states the sequence of events, the numbers, and what was done about it, with a named owner and a date. Producing this page at the end of triage rather than at the start of an audit is the difference between an incident and a finding.

Triage stops the bleeding and preserves the record. It does not tell you why a process that was signed off ever behaved this way, and on almost every engagement of this kind the broken automation turns out to be a symptom of one of the three root causes below rather than an isolated defect. To find out which, and to see what else is sitting in the same state, the same inspection run on its own is our Dynamics 365 health check and technical audit, which reads the solution layers, the run history, and the code behind the behaviour and returns a written diagnosis. Where records are being damaged right now and you need somebody to take control rather than to advise, our project rescue and takeover service begins with an environment lockdown and emergency triage in the first days, and it covers the part deliberately left out of the steps above: how a bulk correction of damaged records is sequenced, rehearsed, and proved against counts before it touches production.

What are the three root causes behind most failed implementations?

Almost every stalled Dynamics 365 project we assess fails for one of three reasons, often more than one at once. Naming the right one matters, because the remediation for each is completely different and the wrong remediation burns the rest of the budget.

Poor or unowned requirements

The build reflects what someone assumed the business needed rather than how it works. Symptoms are recognizable: processes that nobody follows, mandatory fields people fill with junk to get past a form, a data model shaped around a demo instead of the real entities, and a backlog of change requests that all say the same thing in different words. No amount of extra development fixes this, because every increment is built on the same wrong picture. Remediation starts by re-establishing the real process and the decisions the system is supposed to support, then reshaping the model and the apps around it.

Technical debt in customizations and code

Plug-ins with business logic buried in them and no tests, JavaScript on forms doing what a business rule or a column should do, unmanaged solution layers stacked over managed ones, flows duplicated per environment with connections hard-wired to one person, missing or broken solution and deployment discipline, and PCF or canvas components left half-finished. The visible effect is that every change breaks something else, so the team stops changing anything. Remediation means untangling the layers, moving logic to where the platform expects it, and getting solutions and deployment into a state where a change can be released without guesswork.

Misconfigured out of the box modules

The most common and most fixable cause. Dynamics 365 already does the thing the project is failing at, but it was configured wrong or never configured at all, so the team built around it or gave up on it. Customer Service routing that never got past default queues, SLAs and entitlements that pause and warn at the wrong moments, business process flows that do not match the stages the business actually uses, security roles cloned until nobody can say who sees what, and duplicate detection or auto record creation rules that were switched on and never tuned. Remediation here is configuration work, not development, and it is usually the fastest visible win in a rescue.

How does the rescue process work, step by step?

The same sequence every time: assess independently, stabilize, agree a plan you can see, take over delivery in visible increments, and hand back a system your team can own.

  1. Independent assessment of the real system

    We examine the environment itself rather than the story around it, normally with read access to the solution, the Dataverse model, the customizations, and the run history of flows and plug-ins. We interview the people who use it and the people who built it. The output is a written diagnosis: what is sound, what is broken, what is missing, and which root causes are producing the symptoms you can see. Because we are independent of whoever delivered the project, the diagnosis is not shaped by a need to defend earlier decisions.

  2. Triage and stabilization

    Before anything new is built we make the system safe to run and safe to change: stop the failures that lose data or block daily work, contain the riskiest customizations, correct security roles that expose or hide the wrong records, and get environments, solutions, and source control into a state where a release can be made deliberately. Stabilization buys the team room to breathe and stops the situation getting worse while the plan is agreed.

  3. A remediation plan tied to business outcomes

    From the assessment we build a prioritized plan: the specific fixes, the order to do them in, what we keep, what we rework, and what, if anything, has to be rebuilt. Each item is tied to an outcome the business recognizes so you can see why it matters and what done looks like. Configuration fixes to misconfigured modules usually come first because they are fast, low risk, and visible to users. Where part of the design cannot be salvaged, the plan says so and scopes the smallest rebuild that reaches a working solution.

  4. Takeover of delivery in visible increments

    We take over delivery and work through the plan in short increments, correcting the model driven and canvas apps, repairing or rewriting flows and code, fixing integrations, and finishing the functionality the project was supposed to deliver. You see working software regularly instead of waiting for one distant go live, and each increment is tested against the real process it supports. Where your original partner is still involved, we can work alongside them on an agreed split rather than replacing them.

  5. Handover, documentation, and ownership

    A rescue is finished when your team can run the system without us. We document how the solution is built and why, leave a clean solution and deployment approach behind, and transfer knowledge to your people. You end with a working, supportable Dynamics 365 and Power Platform solution and the documentation to own it, whether we stay on for ongoing support or step away.

What does the independent assessment inspect?

The assessment is an evidence based read on the state of the environment, run with read access to the real system. It is the same inspection whether it is bought on its own as a health check or as the first step of a rescue.

Requirements and process fit

We compare what was built against how the business actually works today: the processes people follow, the decisions the system is meant to support, and the places where users have quietly routed around it. Where documented requirements exist we test them against reality rather than taking them at face value.

Configuration of the standard modules

Dataverse tables and relationships, forms, views, business rules and business process flows, and the Customer Service configuration in particular: queues, routing, SLAs, entitlements, case settings, automatic record creation rules, and knowledge management. We record what is configured, what is default, and what was rebuilt in code that the platform already provides.

Customizations, code, and solution hygiene

Plug-ins, custom APIs, JavaScript, Power Automate flows, and PCF or canvas components, read alongside the solution layering, environment strategy, and deployment approach. This is where we find the technical debt that makes the system expensive to change and risky to release.

Security, data quality, and integrations

Security roles, teams, and business units against who is supposed to see what, data quality and duplication in the tables the business depends on, and the integrations and connectors that move data in and out, including the ones that fail quietly and lose records.

Performance and platform health

Slow forms and views, synchronous logic doing work that belongs in the background, flow and plug-in failures accumulating unnoticed, storage and capacity, and the platform level settings and updates the environment is behind on.

Delivery and ownership

How work is prioritized, tested, and released, what documentation exists, and who inside your organization can actually own the system afterwards. A rescue that ends with a working system nobody understands has only moved the problem.

If you only need the diagnosis, the same inspection is available on its own as a Dynamics 365 health check and technical audit. If you already know what is wrong and need someone to assume control of delivery, that is our project rescue and takeover service. And if the project has not failed but you are trying to work out how much of it your own team can safely own, our guide to hiring a consultant against building it yourself names the points where configuration runs out.

How is a broken Customer Service unified routing setup remediated?

Misconfigured out of the box modules are the most common root cause we find, and routing in Dynamics 365 Customer Service is the clearest example. Teams reach a rescue with cases and email landing in one default queue and being triaged by hand, convinced the platform cannot do it, when unified routing was simply never configured. This is the configuration sequence we work through, and it is the same sequence whether you are setting routing up for the first time or inheriting someone else's configuration and fixing it.

  1. Turn on unified routing in the Customer Service admin center

    Unified routing is the current intelligent routing engine for Dynamics 365 Customer Service and Omnichannel for Customer Service, and it replaces the older rule based routing built on basic queues and routing rule sets. In the Customer Service admin center, open the routing settings under service configuration and enable unified routing. Provisioning takes a few minutes and adds the workstream, work classification, and assignment configuration used by every step below. Many stalled Customer Service projects are still running on default queues because this was never switched on.

  2. Create a workstream for the channel you are routing

    A workstream is the container that holds routing and work distribution settings for one stream of work. In the Customer Service admin center, go to Workstreams and create a new one. Give it a name, choose the type that matches what you are routing, which is a messaging workstream for live channels and email, a record workstream for records such as cases, or a voice workstream for calls, then set the work distribution mode to push or pick, the capacity model, and the allowed presence statuses agents must be in to receive work. Getting the type and distribution mode right here matters more than anything you configure later, because everything else hangs off the workstream.

  3. Attach the channel and its account to the workstream

    For email routing, add the email channel to the messaging workstream and point it at the queue mailbox or shared mailbox that receives the traffic. The mailbox has to be approved and enabled for server side synchronization and mail processing before anything routes, and a mailbox that fails its test and enable step is the reason a large share of email routing problems never reach the routing rules at all. For record routing of cases created from email, the automatic record creation rule that turns those emails into cases is configured separately and feeds the record workstream.

  4. Add work classification rule sets to enrich the work item

    Work classification runs first, before anything is sent to a queue. Inside the workstream, create a work classification rule set and add rules that read the incoming work item and stamp attributes onto it that later rules can act on. Rules can test the subject, the description, the sender, the customer record, or related columns, and they can also call machine learning models for sentiment, effort, or a custom classification model where you have one. This is the step where topic detection belongs. Classification does not route anything by itself, which is why routing that looks correct sometimes never fires: the attribute the routing rule tests was never set here.

  5. Build the route to queues rule set that picks the destination queue

    In the same workstream, create the route to queues rule set. This is a decision list: an ordered set of rules, each with a condition and a destination queue, evaluated top to bottom until one matches. Conditions can use anything on the work item, including the attributes set during work classification, so a topic captured in the previous step becomes the condition that selects the queue here. Order is significant. Put narrow, specific rules above broad ones and finish with a catch all rule pointing at a fallback queue, because a work item that matches no rule lands in the workstream fallback queue and is easy to lose.

  6. Create the queues and their assignment rules

    Create one queue per destination in your decision list, of the type that matches the workstream, and add the users or teams who work it as queue members. Then set how items are assigned inside the queue: highest capacity, round robin, or a custom assignment rule set where you need priority and skill ordering of your own. Skill based routing is configured here too, by attaching skills to the work item during classification and having assignment match them against agent skills. A clean set of queues that mirrors how the support team is actually organized is worth more than an elaborate rule set that routes into queues nobody owns.

  7. Test with real traffic and read the routing diagnostics

    Send genuine sample traffic through the channel and follow each item through the diagnostics in the Customer Service admin center, which show which classification rules matched, which decision list rule selected the queue, and how the item was assigned. This is how you tell an unmatched condition apart from a mailbox problem or an agent presence and capacity problem, and it is the fastest way to inherit someone else routing configuration and find out what it really does. Then document the workstreams, rule sets, and queues, because undocumented routing drifts back into trouble the first time the team reorganizes.

Microsoft moves the Customer Service admin center around between releases, so treat the names above as the shape of the configuration rather than a fixed menu path, and check the current Microsoft Learn documentation for unified routing for the exact location in your version.

How do you route chats by skill and language in unified routing without custom code?

A routing rescue we are regularly asked for after the basics is a support lead with a cutover date, no developer, and two symptoms: everything lands on one team, and the language queue is silently missed. Both are configuration faults. Capture the routing attribute with a pre-chat survey or context variable, attach skills and proficiency to agents, write classification rules that set skill and language, build queues with an assignment method that matches the team, finish with a catch all rule, and test every rule before go live. This builds on the workstream and queue sequence above rather than replacing it.

  1. Capture the routing attribute where the conversation starts

    Routing can only act on what it is given. For live chat, add a pre-chat survey question for language or product, with fixed choices rather than free text, or pass the value from your website as a context variable through the chat widget, for example from the language the visitor already chose on the site or from the signed in customer record. Declare every context variable on the workstream with the exact name and type the widget sends. For cases and email, the equivalent is a column on the case set at creation, such as a language or product column filled by the automatic record creation rule. If the value is not on the work item when routing runs, every rule that tests it silently fails to match.

  2. Define the skills and a rating model that means something

    In the Customer Service admin center, create the skills you route on, one per language and one per product or specialism, and a rating model with a small scale your team leads can apply consistently. Skills are stored as bookable resource characteristics, so any skills already set up for Field Service or scheduling in the same environment appear in the same list and need tidying first. Keep the list short. Routing on twenty loosely defined skills produces a system nobody can predict.

  3. Attach skills and proficiency to every agent who takes routed work

    Add each skill to the agents who genuinely have it, with a proficiency rating, and do it for every agent in the queues the skill routes into. A German skill on three agents and missing from the other two German speakers is how a language queue ends up with work waiting while qualified people sit idle. Make skill assignment part of agent onboarding and of the leaver process, because a skill held only by people who have left routes work to nobody.

  4. Write work classification rules that set skill and language

    In the workstream, create work classification rules that read the captured attribute and attach the matching skill with a minimum rating, for example adding the German skill when the pre-chat language answer is German, and adding a product skill from the product question. Test conditions against the exact values the survey or context variable sends, since a rule written for German never matches a widget that sends de-DE. Deterministic rules come first. The intelligent skill finder and machine learning classification are a later phase, once the rules are stable and there is labelled history to learn from.

  5. Build route to queue rules in order, ending with a catch all

    Where languages are worked by different teams, create a queue per language and route to it on the language attribute or skill, with specific rules above broad ones. Where one team covers several languages, keep one queue and let skill matching choose the agent inside it instead of multiplying queues. The last rule sends everything unmatched to a named fallback queue with an owner on every shift, and the workstream fallback queue is set to that same queue explicitly, so nothing that fails classification waits somewhere nobody looks.

  6. Choose the assignment method that matches how the team really works

    Highest capacity sends each item to the available agent with the most free capacity, which suits a pooled team of similar agents. Round robin rotates through available agents in order, which suits a team that values an even share of work over speed. A custom assignment method lets you prioritize work, match on skills with an exact or closest match, and order agents by proficiency, which is what mixed language and specialist teams normally need. Then set overflow on each queue, so work that cannot be assigned within an agreed wait, or that arrives out of hours, moves somewhere deliberate instead of waiting indefinitely.

  7. Test every rule with a test matrix and routing diagnostics before go live

    Write one row per combination that matters, such as each language, each product, a language nobody supports, a blank answer, and an out of hours arrival, with the queue and agent you expect. Send a real test conversation or case for each row, then open routing diagnostics in the Customer Service admin center and read which classification rule set which skill, which route to queue rule matched, and why the item was or was not assigned. Fix, retest the whole matrix rather than the one row, and keep the matrix for every future change. Admin center labels move between releases, so check current Microsoft documentation for exact paths.

Why does unified routing assign work to offline agents, pile it on one team, or ignore operating hours?

Work through these in order. The first check uses what routing diagnostics shows directly, and each later one covers a setting the diagnostics only hint at, so you fix the cause rather than the rule that happened to be nearest.

1. Read routing diagnostics for one failed item before changing a rule

Pick a specific conversation or case that went wrong and open its routing diagnostics. It shows the attributes the item carried, which classification rules ran, which route to queue rule matched, the queue it landed in, and the assignment outcome. Most routing arguments end here, because the diagnostics show whether the item was misclassified, misrouted, or correctly queued and then assigned badly, and each of those has a different fix.

2. A language queue silently missed: check the attribute, not the rule

When diagnostics show the item in the fallback queue or a general queue, the language value was usually never on it. The pre-chat answer did not match the rule condition exactly, the context variable was not declared on the workstream or was not sent by the widget on that page, or a case was routed before the flow that fills its language column had run. Fix the capture first. Rewriting the rule around a value that is not there only moves the miss somewhere else.

3. Everything landing on one team: check rule order and queue membership

A broad rule above a specific one, or a catch all placed anywhere but last, swallows work before the language and product rules are reached. Check too whether the same team is a member of several queues, and whether highest capacity is steering work toward whichever team happens to have the most free capacity rather than the right skills.

4. Work assigned to offline or away agents: check allowed presence per workstream

Each workstream has its own list of presence statuses in which agents can receive work, and custom presences map onto a base status that routing respects. If that list includes a status your agents use when they are not really working, routing will keep assigning to them. Check it on every workstream rather than one, check what each custom presence maps to, and check whether agents are flipping presence because of the session and browser issues in our guide to fixing Omnichannel agent disconnections. For cases the SLA keeps running while the item sits with an absent agent, so an assignment fault often surfaces first as an SLA breach.

5. Nobody available: check capacity units, capacity profiles, and skill match

An item needs capacity the agent has free. Agents with no capacity profile, a profile with a lower limit than the workstream expects, or capacity still held by conversations that were never closed look busy to routing even when they are idle. Then check the skill matching choice. Exact match waits for an agent who holds every required skill at the required rating, which is right for language but leaves work unassigned if nobody qualifies. Closest match assigns to the nearest fit, which keeps work moving but can hand a French chat to an agent without French.

6. Work waiting forever: check overflow and the fallback queue

Without overflow conditions on the queue, unassignable work simply waits. Add overflow for an agreed wait and for out of hours arrivals, with actions that move the item to a fallback queue or end the conversation with an honest message, and make sure the fallback queue has members and an owner.

When agents drop in and out of an available presence on their own, routing is only reacting to it. The session, identity, network, and browser causes behind that are covered in our guide to fixing Omnichannel agent disconnections and chat timeouts.

Why the out of hours auto reply does not fire

Out of hours behaviour rarely fails because the feature is broken. It fails because the operating hours sit on the wrong object, a holiday is missing, or the time zone belongs to whoever created the record. Check all four before raising a ticket.

Attach operating hours to the object that actually decides

Operating hours are a record you create once and attach in more than one place. On a queue they decide when work is assigned and when out of hours overflow applies. On a live chat channel they decide whether the widget is shown, hidden, or switched to its out of hours behaviour. A common fault is hours set on the queue while the chat channel has none, so the widget keeps accepting chats all night and they sit unassigned, or the reverse. Decide which object owns the behaviour you want and check both.

Add holidays to the operating hours record, not to a spreadsheet

Public holidays and planned closures belong on the operating hours record as holiday entries, for every country your queues serve. A support centre closed for a national holiday that routing does not know about accepts conversations all day and answers none of them, which reads to the customer exactly like a broken auto reply.

Check the time zone on the record and on the test

Each operating hours record carries its own time zone, and it is easy to create one in the time zone of whoever set it up rather than the time zone of the team. Check it against the team, not the admin, and remember that a team serving several countries may need a record per region. When you test, test in the team time zone, including the first and last hour of the day and a date around a daylight saving change.

Configure the out of hours message for every channel and language

The out of hours automated message has to be set on the workstream or channel the customer actually uses, and localized for each language you serve, otherwise customers see nothing or a default message in the wrong language. For email and cases the out of hours reply is a separate mechanism, normally the automatic record creation rule response or a flow, so a working chat message says nothing about email. Test each channel and language out of hours before go live.

Skills, queues, operating hours, and SLAs work as one design, and they are worth setting up together. That is the scope of our Dynamics 365 Customer Service implementation work, and where a routing setup has already failed in production, it is the kind of remediation this guide is about. Feature names and settings in this section change between releases, so confirm them against the current Microsoft documentation for your tenant.

Can Dynamics 365 route emails automatically by topic?

Yes. With unified routing in Omnichannel for Customer Service, topic is decided during work classification and acted on by the route to queues decision list. There are four patterns that work, and the choice between them is the whole design decision.

Keyword and condition rules on the message itself

The simplest approach, and usually the right first one. Work classification rules test the subject, body, sender domain, or a related customer or product record for the terms that identify a topic, and stamp the topic onto the work item. The route to queues decision list then sends each topic to its own queue. It is transparent, it is easy for your own team to maintain as the vocabulary changes, and when it misroutes something you can see exactly which rule did it.

Machine learning classification for messier language

Where topics are not separable by keywords, unified routing can call machine learning during classification, including the built in sentiment and effort models and a custom classification model where you have one available. Models earn their place when the text is genuinely ambiguous. They are a poor first move on a rescue, because a model layered over queues and rules that are already wrong just makes the misrouting harder to explain.

A topic column stamped by your own logic

When the topic depends on something outside the email, such as the contract the customer is on, the product they own, or a lookup in another system, the reliable pattern is to derive it with a Power Automate flow or a plug-in, write it to a column on the case or the work item, and let the routing rules test that column. The routing configuration stays simple and readable, and the business logic lives somewhere you can test it.

Route the case rather than the email where a case is the unit of work

If your support process works cases rather than raw email, let an automatic record creation rule convert inbound mail into cases and route those cases through a record routing workstream. Topic then lives on the case, where SLAs, entitlements, and reporting can all use it as well. Choosing between routing the message and routing the case early avoids the half configured setup where both are partly in play and neither works properly.

All four patterns assume unified routing is licensed and worth the setup. Where it is not, or where the support team is drowning and has nobody technical to configure it, the two sections below cover what a standard licence already does and a conservative routing design built on it.

What does a standard Customer Service licence give you for automatic case routing, and what does unified routing add?

With a standard Dynamics 365 Customer Service licence you can already route cases automatically at zero extra cost: automatic record creation and update rules turn email into cases and send an acknowledgement, and queues plus basic routing rule sets, classic workflows, or Power Automate move each case to the right team. Unified routing adds classification before routing, capacity and skill based assignment, diagnostics, and optional machine learning, at a real cost in setup effort and sometimes in licensing. The safe design on a zero budget is one canonical mailbox per intake stream, conservative keyword rules, an explicit unclassified queue, automatic acknowledgement, and misroutes measured before any rule is widened.

What a standard Customer Service licence already gives you

Four pieces of tooling cover most zero budget routing. Automatic record creation and update rules watch a queue mailbox, create a case from each qualifying email, link replies to the existing case instead of opening a duplicate, and can send an acknowledgement from an email template. Queues hold the work and give each team a list it owns. Basic routing rule sets, or a classic workflow or Power Automate flow that runs when a case is created, test conditions on the case and move it to a queue. And case columns such as subject, customer, product, and origin give those conditions something reliable to test. None of it needs a developer. The limits are that conditions are literal, that nothing learns from past cases, and that routing puts work in a queue rather than assigning it by agent capacity or presence.

What unified routing adds, and what it asks of you

Unified routing adds workstreams, work classification rule sets that enrich the item before it is routed, an ordered route to queues decision list, assignment inside the queue by capacity, presence, or round robin, skill matching, overflow handling, and routing diagnostics that show why each item went where it did. Record routing of cases through unified routing is available with Customer Service Enterprise, while live messaging and social channels, and some of the intelligent features, have historically needed additional add-on licensing. Microsoft changes these bundles regularly, so confirm what your own tenant includes against the current Dynamics 365 licensing guide and the Customer Service admin center before designing around any one feature.

Intelligent skill and machine learning classification, and its setup effort

The machine learning side of unified routing, such as the intelligent skill finder that predicts the skills a case needs from its text, and custom classification models, is where the setup effort climbs. A model needs a history of past cases labelled correctly, and on a team with high turnover and one shared inbox that history is usually the weakest asset in the system. It then needs someone to review predictions, retrain as products and vocabulary change, and own the result when it misroutes. Treat it as a second phase, added once conservative rules are measured and stable and the labelled history exists, rather than as the fix for a backlog. Several of these capabilities are also revised or renamed between releases, so check the current Microsoft documentation for their status and licensing.

How do you route thousands of emails a day into cases without misrouting them?

At high volume the expensive failure is not a case left unrouted, it is a case routed confidently to the wrong team, where it waits until the customer chases. The sequence below works on the standard tooling, needs no developer, and carries forward unchanged if unified routing is switched on later: the columns and the unclassified queue become the conditions and fallback of the decision list.

  1. Give each intake stream exactly one canonical mailbox

    Before any rule is written, decide how many genuinely different streams of work you have, for example customer support, billing queries, and partner or supplier requests, and give each one a single shared mailbox that is approved and enabled for server side synchronization in Dynamics 365. Every other address that receives the same kind of mail, such as old aliases, personal inboxes printed on invoices, and mailboxes created by a previous project, forwards to the canonical one or is retired with an auto reply that names the new address. One mailbox per stream means one automatic record creation rule per stream, one place to look when mail goes missing, and no duplicate cases created because the same customer wrote to two addresses. Topic is decided later by rules, not by how many mailboxes exist.

  2. Convert mail into cases with one automatic record creation rule per mailbox

    Associate each canonical mailbox with a queue and add one automatic record creation and update rule to it. Set it to create a case for mail from known and, where your process needs it, unknown senders, to link replies to the open case rather than creating another, and to map the email subject and sender onto the case. Stamp the origin and the intake stream onto the case at creation, because every routing rule and every measurement below depends on knowing where a case came from. Test the rule against real mail in a sandbox first, including forwarded chains, auto replies, and out of office messages, which are the usual sources of junk cases at volume.

  3. Send an automatic acknowledgement that sets expectations honestly

    Turn on the automatic response in the record creation rule, using an email template that quotes the case number, says which team received the request, and states the response time you actually commit to rather than an aspiration. The acknowledgement does three jobs at once: it stops customers writing again to ask whether their mail arrived, which is a large part of the duplicate volume a drowning team sees, it gives the customer a reference that threads replies back onto the case, and it removes the temptation for agents to reply with a holding message that stops the clock without progressing anything. Suppress it for mail from your own domain and for automated senders, so two systems do not acknowledge each other in a loop.

  4. Write conservative keyword rules that only route what they are sure of

    Start with a handful of rules, each one tied to a topic that has an unmistakable signal: a product name, an invoice or order number pattern, a sender domain belonging to a known partner, or a phrase used only in one kind of request. Test the subject and the customer or product columns before the body, because bodies carry quoted history and signatures that match almost anything. Order specific rules above general ones, and resist words that appear across topics, such as urgent, problem, or account. A rule set that confidently routes a minority of cases and leaves the rest alone is far more valuable than one that routes everything and is wrong often enough that agents stop trusting the queues.

  5. Catch everything else in an explicit unclassified queue with a named owner

    The last rule routes every case that no other rule matched into a queue called something unmistakable, such as Unclassified or Triage, rather than letting it fall back to a default queue nobody watches. Put a named person on it for every shift, give them a short list of destination queues, and ask them to work it oldest first. That queue is not a failure of the design, it is the design: it keeps uncertain work visible instead of misrouted, and its contents are the best evidence you will ever have of which rule to write next.

  6. Measure misroutes before widening a single rule

    Add a column that records which rule or stream routed each case and a column for the queue it was first routed to, both set once and never edited. A case that is later moved to a different queue by an agent is a misroute of the rule that placed it, and auditing on the case, or a small flow that records the first queue change, makes those moves countable. Review the moves weekly, by rule, on a view or a simple chart. At high volume, change one rule at a time and keep it long enough to compare its misroutes with the period before, and agree the misroute level you will accept before you look at the numbers rather than after. Widen or add a rule only when the evidence shows the Unclassified queue is full of cases it would have routed correctly.

  7. Bring social messages and legacy tickets into the same case model

    Email is rarely the only intake. Direct messages on social channels, web forms, and tickets still open in an old help desk all need to end up as cases with the same origin, intake stream, and routing columns, so one set of queues and one set of reports covers them. Web forms and legacy exports can create cases through Power Automate or a data import with no extra licence. Live social and messaging channels inside Dynamics 365 normally need the Customer Service messaging capabilities and their licensing, so where that is not affordable yet, forward those messages into the canonical mailbox for their stream and treat them as email until it is. Migrate only open legacy tickets into cases, stamped with their original reference, and leave closed history read only in the old tool.

Routing is one part of a service operation, and it rarely fails alone. Where queues, SLAs, case forms, and knowledge all need designing together, that is our Dynamics 365 Customer Service implementation work. Where the service desk is already failing and the platform cannot be replaced this year, our guide to stabilising customer service on a platform you cannot replace sets the order for intake, triage, and first response, and if routed cases then breach their SLAs for no obvious reason, see SLA timers that pause or show the wrong time. Licensing and feature names in this section change between releases, so check the current Microsoft documentation for your tenant.

What do buyers ask about Dynamics 365 rescue services?

What are Dynamics 365 rescue services?

Rescue services are an engagement where an independent partner takes over a failed or stalled Microsoft Dynamics 365 or Power Platform implementation and remediates it to a working state. The sequence is an independent assessment that identifies the root causes, whether poor requirements, technical debt, or misconfigured modules, then stabilization of the environment, then a prioritized remediation plan, then takeover of delivery until the system does what it was supposed to do. The aim is to protect the investment already made and keep what is sound rather than start again, unless the assessment shows the current design genuinely cannot be salvaged.

What can we do ourselves if our Dynamics 365 implementation has failed and there is no budget left?

Four things, in this order, and all of them are free. Freeze change: stop new configuration and deployments into production and cut the System Administrator and System Customizer roles back to the few people who need them. Protect what exists: take a manual backup in the Power Platform admin center, read how long your restore window actually lasts, and export the tables the business cannot lose to dated files held outside the tenant, together with your unmanaged solutions and any flows that live outside one. Stop the bleeding: turn off, rather than delete, any flow, workflow, automatic record creation rule, or integration that is overwriting, duplicating, or deleting records, keeping a list of what you disabled. Then run the business on one mandated manual workaround, with column headings copied from the fields in the system so the work can be loaded back later rather than retyped. All four take about a day, cost nothing, and make any later rescue considerably cheaper.

When does a do it yourself Dynamics 365 rescue stop being safe?

At five recognizable points. When data has been damaged rather than merely missed, because correcting records by hand without a dependency order and a reconciliation usually makes it worse. When a restore looks like the only repair, since restoring returns the whole environment to a point in time and destroys everything entered since. When the fault sits in plug-ins, custom API, or stacked solution layers, where no administration screen shows you what is happening. When the change freeze cannot be lifted because nobody can predict what a change will break. And when the manual workaround has run long enough that its cost in hours has passed the cost of a bounded assessment. At any of those points the next useful step is an independent diagnosis rather than another weekend of clicking.

How can we fix Dynamics 365 problems with zero budget and no consultant?

Stabilize first, then improve what an administrator can reach without a licence purchase or a developer. Freeze change, take a manual backup, and export the data and configuration. Then simplify forms and views for each role, switch off automation nobody depends on, clean up data with Advanced Find, bulk edit, and duplicate detection, keep a dated log of every change with an export taken before each bulk edit, and inventory the environment with the admin center, the maker portal, the solution checker, and free tools your policy allows. Stop at the boundary: logic in plug-ins or scripts, a wrong data model, failing integrations, unmanaged layers, code-driven performance problems, and licensing or capacity shortfalls need a developer or a spend decision, and the time is better spent building the case for it.

How do we simplify Dynamics 365 forms and views by role without a developer?

In the maker portal, copy the main form for each role that works a table differently, remove the fields and tabs that role never uses, and assign the form to that role through its security roles, setting the form order so the right one opens first. Create one short system view per role with the columns it actually filters on. Where people move between unrelated areas, build a model-driven app per role containing only the tables they need. All of this is configuration. Hide fields rather than deleting columns until you are sure no view, flow, report, or integration reads them.

How do we clean up Dynamics 365 data ourselves with Advanced Find and bulk edit?

Work one problem at a time. Build an Advanced Find query, or use the modern advanced find and view filters, for a single issue such as accounts with no owner or opportunities with a close date long past. Take a dated export of the result first. Correct small sets with bulk edit from the grid a page at a time, and larger ones by exporting to Excel, correcting, and importing back. Run duplicate detection jobs and merge obvious duplicates. Deactivate stale records rather than deleting them, and leave bulk delete jobs until you are certain, because they remove data permanently. Where data was damaged by an automation rather than simply left untidy, stop and read the limits on this page first.

Which Dynamics 365 problems cannot be fixed without a developer or spending money?

Six kinds. Behaviour coming from plug-ins, custom API, or form scripts, because an admin can only switch whole steps on or off, not change what the code does. A data model that is wrong rather than untidy, because column types generally cannot be converted and restructuring needs a data migration. Integrations failing or writing bad data, because the fault often sits in middleware, credentials, or code outside the admin center. Unmanaged layers and an untrustworthy release process, which need solution and ALM engineering. Performance caused by synchronous code, unindexed queries, or unarchived data volume. And licensing or capacity shortfalls, which are a spend decision by definition. Check current Microsoft licensing documentation for your own position on the last one.

How do we calculate the cost of inaction to get budget to fix our CRM?

Use four lines, each measured by you with its source written next to it. Hours lost per week: have affected teams log workaround time for two normal weeks and multiply by loaded hourly cost from finance. Error rate: sample recent records, count the wrong ones, and multiply the rate by weekly volume and the cost to fix one. Revenue at risk: with the sales or service owner, value the pipeline, renewals, or billing affected next quarter and agree a conservative share at risk. Audit exposure: list the named obligations and gaps and when they will next be tested, without inventing penalties, and keep it beside the total rather than inside it. Then carry the weekly costs to a quarter, add revenue at risk, and compare the result with the price of the smallest fundable step, such as a bounded assessment.

What free tools can we use to inventory a Dynamics 365 environment?

Start with what Microsoft already provides. The Power Platform admin center shows environments, capacity, and usage analytics. The maker portal lists solutions, tables, apps, and flows, and its solution checker runs static analysis on a solution at no extra cost. For wider Power Platform estates the Microsoft CoE Starter Kit inventories apps, flows, and makers. Where your organization permits community tools, XrmToolBox is a widely used free desktop tool whose plugins can list metadata, plug-in steps, workflows, security roles, and unused fields much faster than clicking through screens. Check your internal policy before connecting any third-party tool to production.

Our Dynamics 365 SLA or billing automation is writing wrong values. What do we do first?

Establish the failure window before correcting anything. Open the run history of the flow, or the plug-in trace log, and find the earliest run whose output is wrong, because a process that succeeds while doing the wrong thing raises no alert and the real start is usually well before the first complaint. Capture the run history for that window immediately, since it is retained for weeks rather than years. Use the Audit History on a damaged record to prove which process wrote the value, reading the user context on each change to separate an automation write from a person. Then turn the process off rather than deleting or repairing it, add manual determination columns so finance can keep billing while it is paused, and flag the whole affected population as suspect instead of correcting records one at a time. Correction comes after the population is known and reconciled, not during.

How do we tell whether a Power Automate flow or a person changed a record in Dynamics 365?

Use the Audit History on the record, under its related records. Dataverse auditing logs each change with the date, the column, the old value, the new value, and the user context the change ran under. A change stamped with a service account or with the identity that owns the flow connection came from an automation. A change stamped with a named user did not. Two limits matter. Auditing has to be enabled at the organization, table, and column level, and it is not retroactive, so if it was off during the failure the record has no history to read and the flow run history becomes the primary evidence instead. Audit retention is also set at the organization level, so confirm how far back your own data actually reaches before planning an investigation around it.

What is a manual breach flag, and why not just track it in a spreadsheet while the automation is off?

A manual breach flag is a small set of new columns on the record the money is calculated from, normally the case or the agreement: a choice column for the determination, such as not reviewed, breach confirmed, no breach, or cannot determine, the date it was made, a lookup to the person who made it, and a short note on what they based it on. A named person works a view filtered to the failure window and sorted by value at risk. A spreadsheet fails for three reasons. It cannot be joined back to the records it describes when the time comes to reconcile, it carries no owner or timestamp per row that would survive being questioned, and it disappears with the person who maintained it. One rule is absolute: the manual columns must be new. Never write the determination into the columns the broken automation was populating, because those columns are the evidence of what the system did and overwriting them by hand destroys it.

What evidence should we collect after a Dynamics 365 automation failure that affected billing?

Nine things, and most of them have to be produced during the incident because they cannot be reconstructed afterwards. The failure window as two timestamps with a source for each. Exported flow run history covering that window, captured before it rolls off. Audit History extracts for a representative sample of affected records. A dated log of everything that was paused, by whom, and why. An exported copy of the faulty process as it stood before anyone repaired it. The manual breach register with a determination, a date, and a named person on every row. The affected population with three counts against it: records in the window, records written incorrectly, and the value of the difference, reconciled against a source the automation never touched. The correction record with counts before and after each pass. And the communication trail with a one page statement of facts that has a named owner and a date on it.

How does an independent assessment differ from a large integrator health check?

The scope of the inspection is similar. Global firms such as Avanade offer Dynamics 365 health check and assessment services that review configuration, customizations, security, performance, and adoption, and a good health check from any of them is worth having. The differences are independence and size. Solzet did not build the system under review and does not resell licenses, so there is no earlier decision to defend and no upsell attached to the finding. We are a scalable senior Dynamics 365 Customer Engagement and Power Platform consultancy in Yerevan, Armenia, so the people who write the assessment are the same people who would do the remediation, and the report is written to be actionable by any partner or by your own team, including if you choose not to use us.

Can Dynamics 365 route emails automatically by topic?

Yes. In Dynamics 365 Customer Service with unified routing, inbound email is routed by topic in two stages. Work classification rules run first and stamp a topic onto the work item, either from keyword and condition rules on the subject, body, sender, or related records, from a machine learning classification model, or from a column your own Power Automate flow or plug-in has derived. The route to queues rule set then evaluates its decision list in order and sends each topic to the queue that owns it. If your process works cases rather than raw email, an automatic record creation rule converts inbound mail into cases and a record routing workstream routes those instead. Both patterns are configuration rather than custom development.

Can we route cases automatically in Dynamics 365 Customer Service without unified routing or extra licences?

Yes, for most of what a struggling support team needs. A standard Customer Service licence includes automatic record creation and update rules, which turn email in a queue mailbox into cases, link replies to the open case, and can send an automatic acknowledgement. It also includes queues, basic routing rule sets, and classic workflows or Power Automate flows that can move a case to a queue based on its subject, customer, product, or origin. What you do not get from that tooling is classification that learns, assignment by agent capacity or presence, or routing diagnostics. Microsoft positions unified routing as the successor to the older routing rules and revises licensing often, so check the current documentation before building heavily on either.

Do we need unified routing and machine learning to classify cases by topic?

Not to start. Unified routing adds work classification, an ordered decision list, capacity and presence based assignment, skills, and diagnostics, and record routing of cases is available with Customer Service Enterprise. Its machine learning features, such as the intelligent skill finder and custom classification models, carry real setup effort: a correctly labelled history of past cases, someone to review predictions and retrain as vocabulary changes, and an owner for the misroutes. Some intelligent features and live channels have needed add-on licensing, so confirm against the current licensing guide. On a team with high turnover the labelled history is usually missing, which is why conservative keyword rules with an unclassified queue come first and models come later.

What should happen to emails that keyword routing cannot classify?

They should land in an explicit Unclassified or Triage queue, routed there by the last rule in the list, never left in a default queue or guessed into a topic queue. Give that queue a named owner on every shift, a short list of destination queues, and an oldest first working rule. It keeps uncertain work visible instead of misrouted, and what accumulates in it tells you exactly which rule is worth writing next. A routing design with no explicit catch all is the most common reason cases go missing after automation is switched on.

How do we measure misrouted cases before adding more routing rules?

Stamp two columns on each case when it is routed, the rule or intake stream that routed it and the first queue it went to, and never edit them afterwards. When an agent moves a case to another queue, that is a misroute of the rule that placed it, and case auditing or a small flow recording the first queue change makes those moves countable. Review them weekly by rule. At high volume change one rule at a time, compare its misroutes with the period before, and agree in advance what level you will accept. Widen a rule only when the Unclassified queue shows cases it would have routed correctly.

Should every topic have its own support mailbox?

No. Give each genuinely different intake stream, such as customer support, billing, or partner requests, one canonical shared mailbox with one automatic record creation rule, and decide topic afterwards with routing rules. Forward or retire every other address receiving the same kind of mail, including old aliases and personal inboxes, with an auto reply naming the new address. Extra mailboxes per topic multiply the rules to maintain, create duplicate cases when a customer writes to two addresses, and push the classification decision onto the customer, who gets it wrong more often than a conservative rule does.

How do we consolidate email, social media messages, and legacy help desk tickets into Dynamics 365 cases?

Make every channel produce a case with the same origin, intake stream, and routing columns, so one set of queues, routing rules, and reports covers all of them. Email arrives through canonical mailboxes and automatic record creation rules. Web forms and exports from an old help desk can create cases through Power Automate or a data import without extra licences. Live social and messaging channels inside Dynamics 365 normally need the Customer Service messaging capabilities and their licensing, so until that is justified, forward those messages into the right mailbox and treat them as email. Migrate only open legacy tickets, stamped with their original reference, and keep closed history read only in the old tool.

What is the difference between a workstream, a routing rule set, and a queue?

A workstream is the container for one stream of work, such as email or cases, and it holds the work distribution mode, capacity model, and the routing configuration. A routing rule set lives inside a workstream and comes in two kinds: work classification rule sets, which run first and enrich the work item with attributes such as topic, sentiment, or skills, and the route to queues rule set, which is an ordered decision list that picks the destination queue. A queue is where the work waits and is assigned to an agent, with its own membership and assignment method such as highest capacity or round robin. Most broken routing we inherit fails because classification never set the attribute the decision list is testing, or because the decision list has no catch all rule at the bottom.

How do we route chats by skill and language in Dynamics 365 Omnichannel unified routing without custom code?

Configure it in this order. Capture the language or product with a pre-chat survey question using fixed choices, or pass it from your website as a context variable declared on the workstream. Create the skills and a simple rating model in the Customer Service admin center, and attach each skill with a proficiency rating to every agent who has it. Add work classification rules that attach the skill when the captured value matches, testing against the exact value the widget sends. Route to language queues where different teams handle languages, finish with a catch all rule to a fallback queue with an owner, and pick highest capacity, round robin, or a custom assignment method with exact or closest skill match to fit the team. Then test each combination with routing diagnostics before go live.

Why is Dynamics 365 unified routing assigning cases to offline agents, and why does it hurt our SLAs?

Check in this order. Open routing diagnostics for one affected item to see how it was classified, queued, and assigned. Then check the allowed presence statuses on that workstream, since each workstream has its own list and a custom presence mapped to a base status routing treats as available keeps receiving work. Check capacity profiles and units, because capacity held by conversations that were never closed distorts who looks free, and check whether agents are flipping presence because of session or browser problems. Then check the skill match setting and queue overflow. The SLA timer keeps running while a case sits with an absent agent, which is why this fault usually shows up first as breaches.

Why is the Omnichannel out of hours auto reply not working?

Usually because the operating hours record is attached to the wrong object, is missing a holiday, or sits in the wrong time zone. Operating hours on a queue control assignment and out of hours overflow, while operating hours on the live chat channel control whether the widget shows, hides, or switches to its out of hours behaviour, so check both. Add public holidays to the operating hours record for each country served, confirm the record time zone matches the team rather than the admin who created it, and configure and localize the out of hours automated message on the channel the customer uses. Email replies out of hours are a separate mechanism, normally the automatic record creation rule or a flow.

Will you have to rebuild everything from scratch?

Usually not. Most of what a rescue fixes is configuration of modules that Dynamics 365 already provides and untangling of customizations that should not have been written, and both are remediation rather than a rebuild. The assessment tells us what to keep, what to rework, and what, if anything, must be rebuilt, and the plan scopes the smallest rebuild that gets you to a working solution. Where the honest answer is that a component cannot be salvaged we say so plainly rather than layering more work on a broken foundation.

What do we get at the end of the assessment?

A written diagnosis and a prioritized remediation plan. The diagnosis records what is sound, what is broken, what is missing, and the root causes behind the symptoms you can see, with the evidence from the environment behind each finding. The plan sets out the fixes in order, tied to business outcomes, separating quick configuration wins from the work that needs development, and stating clearly anything that cannot be salvaged. The scope of the assessment is agreed before it starts, and the report is yours to act on with any partner or with your own team.

Can you take over while our original partner is still involved?

Yes. Some rescues are a full takeover of delivery and others are a split, where we remediate a specific area such as Customer Service routing, the Dataverse model, or the custom code while your existing partner continues elsewhere. We also work on a B2B and white-label basis for other Microsoft partners who need to rescue a project without the end client seeing a change of face. What matters is that ownership of each area is unambiguous, which is something the remediation plan states explicitly.

Which parts of Dynamics 365 do you rescue?

Dynamics 365 Customer Engagement and the Power Platform, which is what we build in every day: Sales, Customer Service including Omnichannel and unified routing, Field Service, model driven and canvas apps, Power Automate, Power Pages, Dataverse, plug-ins and custom APIs, and PowerApps Component Framework controls. That is the whole of our scope, kept narrow on purpose, so if the part of your project that is in trouble sits outside it we will say so at the first conversation rather than learn it on your budget.

We recommend the right solution - whether that's Microsoft Dynamics 365, Power Platform, or a custom-built CRM. Some businesses need the Microsoft ecosystem. Others need full control without licensing. We deliver both.

Need an independent read on a failing Dynamics 365 implementation?

Solzet assesses and rescues stalled Dynamics 365 Customer Engagement and Power Platform projects from Yerevan, Armenia, for clients and Microsoft partners across Europe and the US. Tell us what is broken and you will get an honest diagnosis and a plan you can act on with any partner.