Integrations between building and maintenance systems are usually judged on whether the work order appears. That is the easy half. The hard half is whether, long afterwards, anyone can reconstruct what happened: which point reported it, what the value was, who was notified and when, who picked it up, what was done, and whether the condition actually went away. That reconstruction is what a contract dispute needs, what a compliance question needs, and what any serious attempt to improve the operation needs. It is also the part that gets designed last, if at all.
The message up front: the audit trail is one correlation identifier, generated at the first event and carried unchanged through every subsequent record in both systems, plus a defined set of timestamps each sourced from a known clock. Everything else is detail. Without the correlation identifier you are matching records by asset and time, which fails exactly when you need it most, during a busy period with several similar faults. Decide the identifier, the timestamp set and which system is authoritative for each state, before go-live rather than after the first dispute.
1. What the trail is actually for
Three distinct uses, with different requirements, and knowing which you are serving avoids building the wrong thing:
- Answering a challenge. A tenant, a client or a contractor disputes response times. You need an unambiguous, tamper-evident sequence with sourced timestamps. This is the demanding use and the one that sets the design.
- Demonstrating a process. An auditor or a certification body wants evidence that alerts are handled consistently. They are usually more interested in a sample being complete and consistent than in any individual case.
- Improving the operation. Where is the time going between the building noticing and the technician arriving. This needs the same timestamps but tolerates far less precision, and it is the use that delivers most of the value week to week.
A trail built for the first will serve the other two. One built only for the third usually will not survive the first.
2. The chain of custody
Five objects, in order, each referencing the one before it:
- The source event. A point changed state in the building system. This is the ground truth, and it exists whether or not anything downstream happened.
- The alert. The event as the integration received and interpreted it, after any deduplication. One alert may represent many events, which is why the deduplication design in alert deduplication between BMS and CMMS has to be auditable too.
- The case. The persistent problem record, where one exists. Alerts attach to it over time, as described in converting repeated BMS faults into one CMMS case.
- The work order. The instruction to do something, with its own lifecycle and its own classification under CMMS work order types.
- The outcome. What was found, what was done, and the evidence that the condition cleared.
The common design error is to join these by asset and approximate time, because that works in testing. It fails under load: two similar faults on adjacent units within the same hour become genuinely ambiguous, and that is precisely the busy period someone will later ask about.
3. The correlation identifier
One opaque identifier, created when the integration first accepts an event, written into every record it produces in both systems, and never modified.
- Generate it in the integration layer, not in either end system. Neither the building system nor the maintenance system has visibility of the whole chain, and an identifier owned by one of them disappears if that one is replaced.
- Make it opaque and unique. Do not encode the asset, the date or the site into it. Encoded identifiers get parsed by somebody downstream and then cannot be changed when the encoding turns out to be wrong.
- Put it somewhere queryable in the maintenance system. A dedicated indexed field, not buried in the description text. If it is only in free text, the trail exists but cannot be reported on, which defeats most of the purpose.
- Keep it stable through grouping. When several alerts collapse into one case, each alert keeps its own identifier and the case records all of them. Replacing them with a single new one loses the ability to answer "when did the building first report this".
- Return it to the building system where possible. Writing the resulting work order reference back against the alarm closes the loop and lets an operator looking at the alarm list see that a job exists. Many systems support a comment or a text property for this; where they do not, the link lives one-way and the integration layer carries it.
4. The timestamps, and whose clock they come from
This is where most trails quietly lose their value. A sequence of times from unsynchronised clocks can show effect before cause, and once a reader notices that, the whole document stops being evidence.
| Timestamp | What it marks | Whose clock | Why it matters |
|---|---|---|---|
| Event time | When the condition occurred in the field | The controller or device | The only time that describes the building. Everything else describes your systems |
| Ingestion time | When the integration received it | The integration layer | The gap against event time exposes collection delay and buffering |
| Alert time | When it became an actionable alert after dedup and rules | The integration layer | Separates "the building knew" from "we decided it mattered" |
| Notification time | When a person was told, per channel and recipient | The notifying system | The start of any response-time obligation. Record each attempt, not just the first |
| Acknowledgement time | When a human accepted ownership | Whichever system is authoritative, see section 5 | The measure escalation keys on |
| Work order created | When the job record appeared | The maintenance system | Often mistaken for the start of the clock. It is not; the event is |
| Attendance time | When someone reached the asset | Mobile app or manual entry | The least reliable timestamp in the set. Treat it accordingly |
| Work completed | When the task finished | The maintenance system | Not the same as the condition clearing |
| Condition cleared | When the point returned to normal | The controller | The independent check on the repair, and the one most often not captured |
| Record closed | Administrative closure | The maintenance system | Distinguishes the work ending from the paperwork ending |
Three rules make this set usable. Store everything in UTC and render in local time, because estates cross time zones and daylight-saving transitions produce an hour that happens twice. Record the source of each timestamp alongside the value, so a later reader knows which clock it came from. And never overwrite an event time with an ingestion time when the device did not supply one; mark it as absent instead, because a silently substituted timestamp is worse than a missing one. The device-clock problem underneath all of this is real and is worth reading about in BACnet objects, device instances and addressing.
Capture the condition clearing, not just the job closing
Of every timestamp in the table, the one most often missing and most worth having is the moment the point returned to normal, taken from the building system rather than from the person who did the work. It is the only independent evidence that the repair worked. A job closed while the condition is still active is a specific, checkable defect, and so is a condition that cleared before anyone attended. Neither is visible without this timestamp, and both are common. Capturing it costs one more subscription on an alarm point you are already reading.
5. Acknowledgement and closure are different states in different systems
This is the specific confusion that produces most reconciliation problems, and it is worth setting out carefully because the two states look equivalent and are not.
Alarm acknowledgement lives in the building system. It means an operator has seen the alarm and taken ownership of it. It does not mean the condition has gone, and in most systems the alarm remains active and displayed until the underlying point returns to normal. Acknowledging is about attention.
Work order closure lives in the maintenance system. It means the task is finished and the record is complete. It does not mean the alarm was acknowledged, nor that the point cleared. Closing is about work.
Four combinations therefore exist, and three of them are informative:
- Acknowledged and closed, point clear. The normal, healthy case.
- Closed but the point is still in alarm. Either the repair did not work, or the alarm needs resetting and nobody did, or the alarm threshold is wrong. All three are worth knowing and none is visible unless you are checking.
- Point cleared but the work order is still open. Often an intermittent fault that resolved itself, which is a distinct situation with its own handling, covered in what to do when a BMS fault clears before a technician arrives. Sometimes it is just an administrative backlog.
- Never acknowledged, but a work order exists and completed. Means the building system's alarm list is not being worked, and the integration is carrying the whole process. Common, and fine, provided somebody decided it deliberately.
The design decision to make explicitly: which system is authoritative for acknowledgement. Allowing it in both guarantees divergence. My recommendation is that the maintenance system owns acknowledgement, because that is where the work and the accountability live, and the integration writes acknowledgement back to the building system rather than the other way round. But either choice works if it is made once and written down. What does not work is leaving it undecided and discovering the ambiguity during an investigation.
6. Reconciliation, and the checks worth running
Two systems holding related state will drift. Reconciliation is a scheduled comparison that surfaces the drift rather than waiting for someone to notice it.
- Alerts with no work order. Should be explainable by a deduplication or suppression rule, with the rule named. Anything unexplained is a dropped message and an integration defect.
- Work orders with a correlation identifier that matches no alert. Usually a replay or a duplicate delivery, occasionally a manual entry that copied an identifier.
- Closed work orders whose point is still in alarm. The highest-value check on the list, for the reasons in section 5.
- Open work orders whose point cleared long ago. Administrative backlog, or intermittent faults needing a different disposition.
- Acknowledgement state disagreeing between systems. Should be impossible if section 5 was decided. If it occurs, the write-back is failing silently.
- Timestamp sequences that are impossible. Acknowledgement before notification, attendance before creation, completion before attendance. These indicate clock problems, and one impossible sequence discovered by an auditor undermines every sequence you have.
Run these as a scheduled report with an owner, not as a query someone remembers to run. A reconciliation nobody reads is the same as no reconciliation, and the drift it would have caught accumulates silently.
7. What counts as evidence at each step
An audit trail that records only state transitions answers "what happened" but not "on what basis". A few additional fields change that, cheaply:
- At the event: the point identity, the value that triggered it, the threshold it crossed, and the quality or status flags at that moment. A value without its threshold cannot be judged later.
- At the alert: which rule fired, its version, and what it suppressed. Rules change, so the version matters when reconstructing a decision taken months ago.
- At notification: channel, recipient role, recipient identity at the time, and delivery result. "Notified" without a delivery result is an assertion, not evidence.
- At the work order: who it was assigned to and when, plus every reassignment. Reassignments are where response time disappears and they are routinely not recorded.
- At the outcome: structured problem, cause and action codes rather than free text, following failure codes on a problem, cause, action model. Free text makes the trail readable by one person and analysable by nobody.
8. How long to keep it, and who can see it
Audit trail data has a different retention profile from operational telemetry. The raw sensor readings behind an alert can often be thinned aggressively; the trail itself is small, textual and occasionally needed years later, so it is usually worth keeping far longer than the data that produced it. That split is the practical reason to treat them as separate retention classes rather than applying one policy to everything, which is the argument in BMS data retention policy for facilities teams.
Two further points. The trail will contain personal data, because it names who was notified, who acknowledged and who attended; whatever data protection regime applies in your jurisdiction therefore applies to it, and that should be established rather than assumed. And access needs to be deliberate: the trail is exactly the record that becomes contentious in a dispute, so who can read it, who can export it, and the fact that it must not be editable by the people it describes are all design decisions. The role model for that is covered in RBAC design for CAFM systems.
9. The gaps that show up when someone finally looks
| Gap | How it shows up | The fix |
|---|---|---|
| No correlation identifier | Records matched by asset and approximate time; ambiguity during busy periods | Generate one in the integration layer, indexed at both ends |
| Only one timestamp | Work order creation treated as the start of the clock | Capture event time separately and report the gap between them |
| Mixed clocks | Impossible sequences in the record | UTC storage, recorded source per timestamp, device clock discipline |
| Notifications not logged | "We told them" with nothing behind it | Log per attempt with channel, recipient and delivery result |
| Reassignments invisible | Unexplained delay between assignment and attendance | Record every assignment change with its timestamp |
| No clear-time capture | No independent evidence the repair worked | Subscribe to the alarm point's return to normal |
| Suppressed alerts discarded | Gaps in the sequence that cannot be explained | Retain suppressed events against the case with the rule that suppressed them |
| Trail editable by its subjects | Credibility collapses the first time it is questioned | Append-only where the system allows; otherwise restrict and log edits |
Honest limits
Two. First, the attendance timestamp is the weakest link in almost every trail, because it usually depends on somebody pressing a button at the right moment rather than on a system observing an event, and no amount of design fixes that; treat it as an indication rather than as evidence, and say so when the trail is used. Second, this article is about structure and traceability, which is my own domain. Whether a given record set satisfies a particular legal, contractual or certification requirement is a question for your legal or compliance advisers and for the body setting the requirement, and nothing here should be read as establishing that it does.
The idea to walk away with
An audit trail is not a log, it is a joined sequence. Logs already exist in both systems and are nearly useless for this purpose precisely because nothing joins them. The correlation identifier is the join, and it costs almost nothing to add at design time and a great deal to retrofit, because retrofitting means reprocessing history that was never keyed.
So the practical minimum is small: one identifier generated at the first event and carried everywhere, event time captured separately from every system time, acknowledgement authoritative in exactly one system, condition-clear captured from the building rather than from the technician, and a scheduled reconciliation with a named owner. That set answers almost every question anyone will ask later.
Final thoughts
A useful test, and an uncomfortable one: pick a work order from three months ago that originated in the building system, and reconstruct the full sequence from first event to condition clearing, using only what the systems hold. Note how long it takes and how many gaps you have to fill by asking someone.
Most organisations find they can establish roughly half of it, and that the missing half is always the same half: when the building first knew, who was actually notified, and whether the condition really cleared. Those three are the ones worth fixing, and all three are design decisions rather than products.
Disclosure
Alongside advisory work I also build a CMMS and CAFM platform, so I have a commercial interest in this category. Nothing above is a recommendation for it, and no vendor named here has paid for inclusion or had any editorial input. Weigh the analysis accordingly.
Can you reconstruct what happened?
Independent review of alert-to-work-order traceability: correlation identifiers, timestamp sourcing, acknowledgement authority and the reconciliation checks that catch drift between the two systems. 22+ years across CMMS, CAFM, EAM and ERP implementations.
Book a conversationRelated reading: Alert deduplication between BMS and CMMS, Repeated faults into one case, BMS data retention policy, BMS and CAFM integration architecture, RBAC design for CAFM systems, Failure codes: problem, cause, action.
Muhammad Abbas
CMMS / CAFM Manager & Independent Advisor · 22+ years across enterprise CMMS, EAM, CAFM and ERP implementations in utilities, oil and gas, manufacturing, government and facility operations.
Work with me