Six weeks after the safety campaign closed, the CCO asks what its ROI was. You have SharePoint news page views, a Viva Engage community that grew by three hundred members, three newsletter sends with open rates in the fifties, and an intranet banner that ran for a fortnight. You can produce numbers all afternoon. You cannot produce that number, and weak analytics are not the reason. The campaign was never defined as a measurable object before it launched. Everything you hold is organised by channel and by date. The question is organised by audience and by intent. Those two do not convert into each other after the fact.
Why the ROI question arrives too late to answer
Channel analytics answer channel questions. SharePoint reports on sites and pages[1]. Viva Engage reports on communities. Your newsletter platform reports on sends and lists. Each is internally coherent, and not one of them knows that six assets, published across four surfaces over eleven days, were one thing.
So the retrofit begins. Someone exports page views for the campaign pages, adds the community post views, adds the newsletter opens, and produces a total. That total is wrong in three ways at once. It counts the same person up to four times. It includes people who were never the audience, because a campaign page on the main intranet collects traffic from anyone browsing. And it is silent on the population that mattered, plant operators on rotating shifts who rarely open a desktop browser at all. Inflated, unsegmented and uncorrected for overlap, it invites exactly the follow-up you cannot survive. The overlap half of that is a general problem, treated in the piece on measuring cross-channel internal communications.
Define the campaign as an object before it launches
The fix is unglamorous and takes an hour. Before the first asset ships, write four things down where the whole team can see them.
- The target population, in attributes you actually hold. Not “everyone”, not “the business”. Function, site, country, language, contract type, shift pattern: whichever exist in Entra ID or the HR extract you can join to[2]. An audience you cannot express in attributes you hold is an audience you cannot measure reach against. Our note on audience segmentation covers structuring those once so every campaign reuses them.
- The window, including the observation period after it. A campaign running 3 to 14 March is not measured on 14 March. Behaviour lags exposure. Decide in advance that you will look again on 28 March, and that the second look is the real one.
- The asset set, listed individually. Every SharePoint news page URL, every Viva Engage post, every Teams channel post, every newsletter send ID, every Viva Connections card. The actual identifiers, not a description of the plan. This list is the join key, and nothing in Microsoft 365 builds it for you across channels.
- The behaviour you expect to change, and the system that records it. The field that separates a reach report from an ROI report, and the one that gets skipped.
The fourth field is the one everybody skips
A safety campaign expects near-miss reports to rise, and those live in the EHS system. A benefits campaign expects completed enrolments, in the HR platform. A policy campaign expects acknowledgements, in the LMS. The outcome is always recorded somewhere internal communications does not own, which is exactly why the conversation has to happen before launch rather than after.
If nobody can name that system, you are running a campaign with no outcome measure. That is sometimes legitimate: an awareness campaign before a reorganisation has no transaction attached. Say so at the start. Declaring in week one that the campaign will be judged on reach and comprehension is a far stronger position than promising ROI in week one and producing page views in week twelve. Gallagher’s State of the Sector research keeps finding measurement at the top of the capability gaps the profession names for itself[3].
Three levels of claim, and what each one costs to support
Not every campaign needs the top level, and deciding in advance which one you are aiming at is most of the work.
| Level | The claim | Evidence it requires | What it still cannot prove |
|---|---|---|---|
| 1. Delivery | The campaign reached 74 per cent of the target population at least once, and 41 per cent of the manufacturing population | Asset list joined to identity, de-duplicated across channels, joined to organisational attributes | That anyone understood it or acted on it |
| 2. Engagement | Within the target population, engagement was concentrated in office sites and thin on shift-based sites | Level 1 plus depth measures per segment: read time, replies, click-through to the action | That engagement caused the behaviour |
| 3. Outcome contribution | Near-miss reporting rose 18 per cent in exposed sites against a stable baseline in unexposed sites | Level 2 plus the outcome system, a pre-period baseline, and a comparison group | That communication was the only cause |
Level 3 is where the honesty matters most. A campaign almost never runs as a controlled experiment; it runs alongside a manager cascade, a policy change and a training module. The defensible sentence is contribution, not causation: the exposed population moved and the unexposed population did not, over the same period, which is consistent with the campaign having contributed. Write that sentence yourself, in the report, before someone else writes a stronger one for you.
What ROI can honestly mean here
Most internal campaigns have no revenue line, so a return multiple is a fiction. Two framings hold up in front of a finance audience. The first is cost per reached member of the target population: total cost, including agency fees, production and a fair estimate of internal time, divided by de-duplicated people reached inside the segment. It is comparable across campaigns and it falls sharply once you stop buying reach you already had. The second is avoided cost, where the outcome carries a known unit value: an enrolment that no longer needs a chase call, an acknowledgement that closes an audit finding. The broader mechanics are in our guide to calculating the ROI of internal communications.
Assembling it in Power BI, and what that genuinely costs
Campaign measurement is where teams reach for Power BI first, because no native surface joins four channels for them[4]. That route can work, but three things have to be said out loud first.
First, the Microsoft Graph reporting API is not consistently reliable and produces days with missing data[5]. On an always-on intranet dashboard a missing Tuesday is an annoyance. On an eleven-day campaign it is a tenth of the measurement window, and a chart that draws a line between the neighbouring points shows a smooth curve that never happened.
Second, customers have observed KPI values in Power BI that do not reconcile with the native SharePoint reports for the same period. If your slide says 4,100 and the site owner’s native panel says 3,600, the meeting stops being about the campaign. How to handle that is set out in the piece on making your intranet numbers defensible.
Third, a dependable build needs a robust ingestion process and scheduled reconciliation against the native figures, with a named owner. Budget for the pipeline rather than the dashboard. The failure modes are documented in our review of SharePoint analytics in Power BI.
A fourth point is specific to campaigns: no campaign join key exists across Microsoft 365. Viva Engage has a genuine native campaigns feature built on hashtags, and it is good at what it does[6], but it stops at the edge of Viva Engage. Whatever you build, the taxonomy is applied by hand and held together by discipline: a naming convention on URLs, the hashtag, the send ID. When campaign reporting quietly degrades a year in, this is what broke.
The honest position on staying native
If your campaign lives in one channel, native is the right answer and you should stop reading here. A campaign that runs entirely inside Viva Engage is well served by the native campaign view, an intranet-only campaign by SharePoint page analytics. Both are free, already switched on, and require no project.
The break comes at the second channel, and at the target-population question. Native reporting counts activity inside a product. It does not de-duplicate a person across four products, and it does not know that person is a shift technician in Valenciennes. Tryane sits in that gap: it reads SharePoint, Viva Engage, Teams and your newsletter platform together, joins that activity to organisational structure through Entra ID or an HR file, and keeps history across product transitions. It is SOC 2 Type 2 certified and GDPR compliant by design, hosts in the EU by default with US data residency on request, and deploys in a couple of hours over single sign-on with no agent to install.
What a defensible campaign report looks like
One page. The target population as defined before launch, with its size. Reach against it, de-duplicated, split by the two or three segments that matter. Engagement depth for those segments. Cost per reached member. The outcome measure with its baseline and comparison group, if there is one. And a single line naming what the report does not claim. That last line makes the rest credible, and it is the one most teams leave out. Our set of internal communication KPIs covers the measures that survive an executive audience.
Frequently asked questions
Can I calculate campaign ROI from data I already have?
Partly. Delivery and engagement can usually be reconstructed if you can still identify the asset list and de-duplicate people across channels. The target population definition and a pre-period baseline cannot, so the outcome claim is unavailable. For a campaign that has run, report levels one and two and instrument level three for the next.
Does the Viva Engage campaigns feature solve this?
Inside Viva Engage, largely yes. It gives a campaign a real identity through a hashtag and reports participation against it, which is more than you get anywhere else natively. It does not extend to SharePoint news, Teams or email, so it answers the community half of a multi-channel campaign and leaves the rest to you.
What if the outcome system belongs to another function?
That is the normal case, and it is a relationship question rather than a data question. Ask the EHS, HR or compliance owner for one aggregate figure per site per month, not record-level access. An aggregate is enough for a contribution claim. Ask before launch: asking afterwards reads as hunting for a favourable number.
How do we avoid double counting someone who saw the campaign in three places?
You need one identity key across the channels, which in a Microsoft 365 estate means the Entra ID object rather than an email address or a display name. With it, de-duplication is straightforward. Without it, every cross-channel total is inflated by an unknown amount that shifts with the channel mix, so the trend is as unreliable as the level.
Does Tryane replace Power BI?
No, and many customers run both. Tryane produces the joined, de-duplicated, segmented view and feeds it onward through an API, so Power BI keeps its place as the surface where communication data sits alongside finance and HR data. What changes is that the pipeline, the identity join and the reconciliation stop being your team’s project.
Sources
• Microsoft Learn, SharePoint site usage and portal health
• Microsoft Learn, campaigns in Viva Engage
• Microsoft Learn, Microsoft Graph reporting API
• Microsoft Learn, Microsoft Entra ID
• Gallagher, State of the Sector
Further reading
• How to calculate the ROI of internal communications
• Measuring cross-channel internal communications
• When Power BI and SharePoint disagree
• Audience segmentation for internal communications
• Measuring the performance of a content calendar
Tryane runs a 15-minute working session with Heads of Internal Communication, taking one campaign you have already run and showing what reach against the target population actually looked like on your own tenant. Book a slot with Jérémy to schedule yours.
