Measuring social when every network reports something different
A cross-network social report fails on two things: metrics that do not mean the same thing, and metrics that were never reported being stored as zero.

Social metrics from different networks cannot be added together, because the networks do not count the same events and do not report the same set of numbers. A report that works does three things: it normalises every incoming metric to one fixed vocabulary, it stores a metric that was not reported as missing rather than as zero, and it compares across networks only on a metric that every network in the comparison actually returns. Everything else — impressions against views, reach against viewers — is a total that no reader can act on.
A total across networks assumes the underlying counts answer the same question, and social metrics rarely do. One network counts an impression each time the post is rendered in a feed; another counts a view once a person has stopped scrolling for some interval it does not publish. A repost and a quote are different actions with different reach. A save is private and a share is public. Summing them produces a number that goes up when nothing changed except which network was busy that week, which is the failure mode a dashboard is supposed to prevent.
Normalising to a fixed vocabulary is what makes the numbers storable at all. Market4 stores social post metrics against sixteen named metric types — clicks, comments, engagement rate, follows, impressions, likes, post count, quotes, reach, reactions, reposts, saves, shares, total time watched, viewers and views — and that list is declared once and passed to the database schema, so a metric name in the code and a metric name in the collection cannot drift apart. The vocabulary does not make two networks agree; it makes the disagreement visible, because a network that never reports saves has an empty saves field rather than an invented one.
A metric that was never reported and a metric that was reported as zero are different facts, and storing both as 0 makes every average computed over them wrong in the same direction. Buffer refreshes post metrics roughly once a day, and a network that has not reported yet returns no metric at all rather than a zero. In Market4's schema all sixteen metric fields default to null for exactly this reason: null means nobody has told us, 0 means we were told nobody engaged. An average that treats "not measured yet" as "measured, nothing happened" drags every channel's mean downwards, and it does so most on the newest posts, which are the ones being judged.

First click, linear, time decay and position-based were withdrawn in November 2023. What remains in the GA4 attribution reports is data-driven, paid and organic last click, and Google paid channels last click — and one of the three is still the one arguments end on.

Market4 turns one release note into a changelog page, a blog post, a mail-out and a week of social posts — and then tells you which of them brought anyone back.
| Metric | What it counts | Comparable across networks |
|---|---|---|
| Clicks | People who left the network for your link | Yes, it is the same event everywhere |
| Impressions, reach, views, viewers | Four different definitions of being seen | No, compare each within its own network |
| Likes, reactions | Approval, sometimes with a choice of icon | Loosely, and only as a trend |
| Shares, reposts, quotes | Redistribution, with or without added comment | No, the actions differ in what they carry |
| Engagement rate | A ratio whose denominator the reporter chose | Only if the two denominators are known and match |
Clicks survive the comparison because the event is defined by the destination rather than by the network: somebody left a feed and arrived on a page you control. That is also the one social metric you can verify independently, since the arrival shows up in your own analytics with the campaign parameters you attached to the link.
Not into a number anyone should act on. Each network defines an impression against its own rendering and de-duplication rules, and neither publishes enough detail for the two to be reconciled. The sum moves when the mix of networks changes even if nothing about the posts changed. Report impressions per network, and use clicks when a single cross-network figure is needed.
Leave a gap. A missing metric is not a zero, and drawing it as one invents a measurement. In Market4's storage every metric field defaults to null so that the two cases stay distinguishable all the way to the chart. If a series has more gaps than points, the honest summary is that the network has not reported enough to say anything yet.
Only when both denominators are known and identical. An engagement rate is interactions divided by something, and the something varies: impressions on one network, followers on another, reach on a third. Two rates built on different denominators can be ordered wrongly by a factor of several. Compute the rate yourself from the raw counts if you need to compare it.
Buffer refreshes post metrics roughly once a day, so a report built at nine in the morning and one built at six in the evening can show the same numbers. Engagement also keeps accruing for days after a post, which means a post measured on its first day will look worse than the same post measured a week later. Compare posts at the same age rather than on the same date.
The Data API answers questions you can express in its dimensions. The BigQuery export hands over the events themselves, with the costs and caveats that come with owning them.

Impressions fell is a chart. Twelve queries sitting at position eight to twenty with below-average click-through, so rewriting their titles is the obvious change this week, is an insight. The difference is a required field.