Dynamics 365 Integration and Omnichannel Breakdowns: Emergency Triage Before You Rebuild
How to detect records an integration is silently losing, prove where they were lost, classify the cause and contain the damage within a day.
Dropped chats, lost orders, wrong dispatches and records that silently stop syncing come from one of four layers: the channel, the routing ruleset, the connector or the downstream system. Check them in that order. For chats, read the Omnichannel conversation and session records. For records, compare daily counts by business key on both sides, then read the Power Automate run history, the plug-in trace log, System Jobs and any Service Bus dead-letter queue. Contain within a day: stop the failing writer, keep messages queued, capture payloads and replay by key once fixed. Rebuild only when the design cannot replay or deduplicate. ERP and SAP endpoints are treated as external systems.
What does an integration that silently loses records look like?
Nobody reports "the integration is losing records". They report a business symptom, usually days after the loss began, and usually to someone who does not own the integration. The first job is to translate the symptom into the boundary where data should have crossed and did not. The table maps the complaints we hear most often to the place worth looking first.
| What the business says | What has usually happened | Look first at |
|---|---|---|
| "The customer says they ordered, but the warehouse never shipped." | The order was created in Dynamics 365 and never reached the ERP, or reached it and was rejected there. | Daily order counts by order number on both sides, then the outbound flow or plug-in run for that order. |
| "The technician went to the wrong address" or "the job went out with the wrong parts." | An update to the account, asset or work order arrived before the create it depended on, or was overwritten by an older message. | The modified-on history and audit log of the record, and the order in which the messages were processed. |
| "Payments are late but nothing errored." | The payment or invoice status never came back from finance, so the CRM still shows the item as open. | Records stuck in an intermediate status for longer than the normal cycle, counted per day. |
| "Some records sync and some do not." | A mapping fails for a subset: an unmapped choice value, a lookup that cannot be resolved, a field too long for the target. | The failed or skipped items in the run history, grouped by the value that differs. |
| "It all stopped on Monday." | An identity or secret expired, a connection lost its owner, or a flow was turned off. | Connection and connection reference status, app registration secret expiry dates, and the flow on or off state. |
In what order should you diagnose the channel, the routing, the connector and the downstream system?
Work from the point where the customer or the business event entered, towards the system that should have received it, and stop at the first layer where the record is missing. Checking the downstream system first is tempting, because that is where the complaint lands, but it tells you only that the record is not there, not where it was lost.
| Layer | Question to answer | Artefact in Dynamics 365 or Power Platform |
|---|---|---|
| 1. Channel | Did the event enter the platform at all? | For chats, the conversation record in Customer Service. For records, the row in Dataverse and its created-on timestamp and audit history. |
| 2. Routing ruleset or trigger | Was the event picked up by the rule, trigger or plug-in step meant to act on it? | Workstream and routing diagnostics for conversations; the flow trigger history, trigger conditions and filtering columns; the plug-in step registration and its filtering attributes. |
| 3. Connector or integration layer | Did the outbound call run, and what did it send and receive? | Cloud flow run history with inputs and outputs, plug-in trace log, System Jobs for asynchronous steps, Service Bus queues and dead-letter queues. |
| 4. Downstream system | Did the target accept the message and actually post it? | The response body, not only the status code, plus the target system interface log, read by the team that owns that system. |
Are dropped chats the same problem as lost integration records?
No, and treating them as one problem slows both fixes down. Chats that disconnect, time out or vanish from an agent session are an Omnichannel identity, routing or network issue, and we have a separate, step by step guide for that: how to fix Dynamics 365 Omnichannel agent disconnections and chat timeouts. The only overlap is when a chat or case creates a record that is then meant to flow into another system. Once the conversation record exists in Dataverse, the rest of this page applies.
How do you detect missing records before a customer does?
Error alerts alone cannot catch silent loss, because silent loss is by definition the case where nothing errored. Two controls catch it: reconciliation and alerting on silence.
- Count by business key per day on both sides. For each integrated entity, count the records created or changed per day in Dynamics 365 and the matching records received in the target, keyed by the identifier both systems share: order number, invoice number, work order number. Compare the keys, not only the totals, because one duplicate and one loss cancel each other out in a total.
- Add a value check for anything financial. Alongside the count, compare the sum of amounts per day. A count that matches with a sum that does not points at a mapping or rounding fault rather than a lost record.
- Alert on silence, not only on error. If an order flow normally runs dozens of times a working day, zero successful runs in a working morning is an incident, even though nothing has failed. A scheduled check that counts recent successful runs or recently synced rows, and alerts when the number falls to zero, catches expired secrets, turned-off flows and stalled queues that raise no error at all.
- Run the monitor under a different identity from the integration. A check that authenticates with the same expired secret goes quiet at the same moment as the thing it watches.
- Watch the age of records in intermediate states. Items sitting in "sent to ERP" or "awaiting confirmation" longer than the normal cycle are the earliest sign that responses are no longer coming back.
- Send the alert to a named owner and a shared channel, not to the mailbox of whoever built the flow. Power Automate failure notices go to the flow owner, who may have left.
How do you prove where a record was lost?
Before anyone changes anything, capture evidence at the boundary for one specific missing record. A single traced record settles arguments between the CRM team and the ERP team faster than any meeting. Several of these artefacts are retained only for a limited time, so capture them the day you find the loss.
| Artefact | Where to find it | What it proves | Watch out for |
|---|---|---|---|
| Cloud flow run history | Power Automate, the flow details page, filtered to the time of the missing record | Whether the trigger fired, which actions ran, and the exact inputs sent and outputs received | Run history is kept for 28 days. A run marked Succeeded can still have skipped the write inside a condition or a scope that swallowed an error. |
| Payload capture | A log step in the flow or integration that stores the outbound message and the response body, keyed by business identifier | Exactly what left Dynamics 365 and exactly what the target said back | Secure inputs and outputs hide values in run history by design, so capture has to be deliberate. Store only what your data protection rules allow. |
| Plug-in trace log | Plug-in trace log table, once logging is set to Exception or All in system settings | What a synchronous or asynchronous plug-in did, and the exception it hit | Trace log records are removed by a system bulk delete job after a short period, and logging set to All adds overhead, so switch it back afterwards. |
| System Jobs (asynchronous operations) | Settings, System Jobs, filtered to Failed, Waiting and Waiting for resources | Asynchronous plug-ins, classic workflows and service endpoint posts that failed or never completed | Cleanup jobs remove old system jobs, and a job that is still Waiting is not yet a failure. |
| Service Bus dead-letter queue | The Azure Service Bus queue or subscription the Dataverse service endpoint or integration posts to | Messages that exceeded the maximum delivery count or expired, with the reason recorded on the message | Dead-lettered messages stay until someone receives them, which makes them the most reliable replay source you have. |
| Audit history | The record itself, where auditing is enabled for the table and columns | Who or what changed the record, when, and from which value to which | Only columns with auditing enabled are recorded, so gaps are normal. |
What actually causes an integration to lose records?
Once one missing record is traced, the cause almost always falls into one of five families. Classifying it matters because each family has a different containment and a different permanent fix.
| Cause | Typical evidence | Permanent fix |
|---|---|---|
| Authentication or secret expiry | Everything stops at once. 401 or 403 responses, connections flagged as invalid, an app registration secret or certificate past its expiry date, or a connection owned by someone who left or changed their password. | Run integrations as application users or service principals rather than people, record every secret and certificate expiry date, and alert well before each one. |
| Throttling and API limits | Loss grows with volume: month end, bulk imports, a backlog after an outage. 429 responses from Dataverse service protection limits, which are evaluated per user over a sliding five-minute window, or connector throttling in the run history. | Honour the Retry-After header, batch and spread the load, and make sure a request that exhausts its retries lands somewhere replayable instead of being dropped. |
| Mapping | A subset fails consistently: one choice value with no match in the target, a lookup that cannot be resolved, text longer than the target field, a date shifted by a time zone, decimal precision lost on amounts. | A tested mapping table owned by both sides, and a rule that an unmapped value fails loudly rather than being skipped or defaulted. |
| Ordering | An update applied before its create, an older message overwriting a newer one, or duplicates after retries. Common with parallel flow runs, asynchronous plug-ins and queues without sessions. | Make every write idempotent with upsert on an alternate key, carry a version or modified-on value so stale messages are ignored, and use ordered delivery where the business truly needs it. |
| Rejection on the ERP or SAP side | Dynamics 365 shows success because the call returned 200, but the response body carries an error, or the document was received and then failed to post inside the ERP. | Read and act on the response body and the posting status, write the result back to the CRM record, and let the ERP team fix the rule on their side. |
How do you contain the damage within a day without rebuilding?
Containment has one aim: stop customer-visible damage today while preserving everything you need to repair the data tomorrow. The general freeze discipline, turning processes off rather than deleting them, and the three reconciliation numbers are set out in our Dynamics 365 rescue services guide. For an integration specifically, the day looks like this.
- Stop the writer that is doing damage, not the capture. If the outbound side is writing wrong data into the ERP, turn off that flow or disable that plug-in step, but leave the source records and any queue intact so messages accumulate rather than disappear.
- Turn on payload capture and plug-in tracing for the affected path before you touch the fix, so the next failure is recorded in full.
- Build the gap list. Using the daily key reconciliation, list every business key present on one side and missing on the other for the whole failure window, not only the records customers have complained about.
- Fix the narrow cause. A renewed secret, a corrected mapping value, a retry policy or a restored connection owner is usually a same-day change, promoted through your normal path rather than typed into production.
- Replay by key, not by date range. Resend only the listed keys, through an idempotent upsert, so a replay cannot create the duplicates that a second run of a date range would.
- Protect the customer-facing process while you replay: a manual check on dispatches or shipments for the affected keys, and a named person who confirms each one has landed.
- Put the silence alert in place before you close the incident, so the same failure cannot run unnoticed a second time.
When does a broken integration genuinely justify a rebuild?
Most silent loss is fixed without a rebuild: an expired secret, a missing retry, a mapping gap. Rebuilding because an integration embarrassed everyone once is expensive and often reintroduces the same faults. A re-architecture is justified when the design itself prevents the controls above from working.
- Writes cannot be made idempotent, because there is no shared business key or alternate key, so every replay risks duplicates.
- Nothing can be replayed: messages are sent once, with no queue, no stored payload and no way to resend a single record.
- Changes are detected by polling for rows modified since the last run, and records are lost whenever a run fails, overlaps or the clock drifts.
- The logic is spread across flows, classic workflows, plug-ins and scripts that nobody can read, so a fix in one place breaks another.
- The volume has outgrown the pattern, and the integration now lives permanently at the service protection limits.
- The same five causes keep recurring after each fix, which means the containment has become the operating model.
- If a rebuild is justified, the CRM side of it is also the moment to check the platform still fits. 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. For some organizations the honest answer is a custom CRM built without Microsoft licensing, integrated directly with the ERP they already run.
If you do rebuild, which platform should the CRM side sit on?
Can afford licensing and want the Microsoft ecosystem
Dynamics 365
Microsoft 365, Teams and Outlook integration, a mature partner ecosystem, Copilot, and apps for sales, service and field operations that are configured rather than built.
Need full control and zero licensing
Custom CRM
A CRM built on React, Node.js, PostgreSQL or .NET that you own outright: your data model, your hosting, no per-user subscription, and features shaped exactly to your process.
Not sure which fits
We help you decide
A short discovery weighs licensing budget, process complexity, integrations and long-term ownership, then recommends one path. We deliver both, so the recommendation has no reason to lean.
What does Solzet fix, and what stays with your ERP or SAP team?
Solzet fixes the CRM side and the integration between the systems: Dynamics 365 Customer Engagement and Dataverse, plug-ins, Power Automate cloud flows and desktop flows, service endpoints and the queues, retry, logging, reconciliation and alerting around them. We do not configure, implement or repair the ERP or SAP system itself, and we do not deliver Dynamics 365 Finance, Business Central, Finance and Operations or other ERP implementations. We treat ERP endpoints as external systems: we trace the message to their boundary, show your ERP team or partner exactly what was sent and what came back, and work alongside them while they fix their side.
That split is usually what ends the loop where each team is certain the fault is on the other side, because the traced record shows plainly where it stopped.
When should you bring in a rescue partner instead of patching it yourself?
Patch it yourself when one cause is traced, the fix is narrow and the replay list is complete. Bring in help when records are being damaged rather than only missed, when nobody left can read the code the integration depends on, when the same failure has returned after two fixes, or when the original partner has stopped answering. Our Dynamics 365 project rescue and takeover service covers the emergency first days, including the identities your integrations run as, and a Dynamics 365 health check and technical audit runs the same inspection outside a crisis. Solzet brings senior consultants and full-stack developers with 8+ years of Dynamics 365 and Power Platform delivery, working from Yerevan in GMT+4.
What do people ask us?
How do I know if my Dynamics 365 integration is losing records?
Compare counts by business key per day on both sides of the integration, for example order numbers created in Dynamics 365 against order numbers received in the ERP. Compare the keys rather than only the totals, add a sum of amounts for financial records, and alert when an integration that normally runs every day goes silent. Error alerts alone will not show silent loss, because nothing errored.
Why does a Power Automate flow show Succeeded when the record never arrived?
Usually because the write was skipped inside a condition branch, an error was caught by a scope configured to run after failure without failing the run, or the target returned a success status with an error in the response body. Open the run, expand every action and read the outputs, not only the run status.
Where can I see why a Dynamics 365 plug-in or service endpoint failed?
Set plug-in trace logging to Exception or All in system settings and read the plug-in trace log table, and check System Jobs filtered to Failed and Waiting for asynchronous plug-ins, workflows and service endpoint posts. If the integration posts to Azure Service Bus, read the dead-letter queue, which records why each message could not be delivered. Capture these quickly, because trace logs and old system jobs are cleaned up automatically.
Can throttling make Dynamics 365 records go missing?
Throttling itself returns an error rather than losing data, but it causes loss when the caller gives up after its retries and nothing stores the failed request. Dataverse service protection limits return a 429 response with a Retry-After header. An integration that honours that header and sends exhausted requests to a replayable queue does not lose records under load.
How do we replay missing records without creating duplicates?
Replay by the list of missing business keys rather than by date range, and write through an upsert on an alternate key so a record that did arrive is updated rather than created twice. If the integration has no shared key to upsert on, that is one of the signs it needs re-architecting.
Does Solzet fix SAP or ERP integration problems?
Solzet fixes the Dynamics 365 and Power Platform side and the integration layer: flows, plug-ins, service endpoints, queues, mapping, retry, logging and reconciliation. We do not configure or repair SAP or any ERP system, and we do not implement Dynamics 365 Finance, Business Central or Finance and Operations. We trace the failure to the ERP boundary and work alongside your ERP team or partner on their side.
Is a dropped Omnichannel chat an integration failure?
Rarely. Chats that disconnect or time out are normally an identity, routing or network issue in Omnichannel for Customer Service, and our separate guide to agent disconnections and chat timeouts covers that diagnosis. It becomes an integration question only when a record created from the conversation fails to reach another system.
Do we need to rebuild a Dynamics 365 integration that keeps losing records?
Usually not. Expired secrets, missing retries and mapping gaps are fixed in place. A rebuild is justified when writes cannot be made idempotent, nothing can be replayed, changes are detected by fragile polling, the logic cannot be read, or the same causes return after every fix.
Where should you go next?
Dynamics 365 project rescue and takeover
The emergency first days of a takeover, including the identities your integrations authenticate as.
Dynamics 365 rescue services guide
Freezing change, containing damaged data and reconciling the failure window before a rescue.
Omnichannel agent disconnections and chat timeouts
The step by step diagnosis for chats that drop, time out or vanish from an agent session.
Power Automate consulting
Cloud flows and desktop RPA engineered with retry, logging and alerting that production depends on.
Dynamics 365 health check and technical audit
The same inspection of integrations, flows and plug-ins, run before anything breaks.
Custom CRM Development
CRM on React, Node.js, PostgreSQL and .NET for organizations that need full control without Microsoft licensing.
Which solution is right for your business?
Tell us what you need. A senior consultant replies within one business day with a recommendation - Dynamics 365, Power Platform, or a custom-built CRM - not a sales script.