How Metrics Are Calculated
How Analyze works out engagement rate, averages and % change, what "Public data only" means, which numbers each platform provides, and why a number can look different from what you expect.
This guide explains where the numbers in Analyze come from: how each post’s engagement rate is worked out, how the averages and % changes are calculated, and why a number can look different from what you expected.
You’ll find these numbers on Reports (under Analyze in the sidebar). To learn your way around the page itself, see Reports Overview.
Where the numbers come from
Analyze uses two sources:
- Your public posts. Orsa reads the public posts on each channel’s account once a day, around 2:00 a.m. UTC. That gives likes, comments, views and, on some platforms, shares and saves. It also reads your follower count each day.
- Your Meta CSV file (Instagram only). Reach, and Instagram saves and shares, aren’t public. To get them, you upload a report exported from Meta Business Suite. See Upload a Meta CSV Report.
Numbers aren’t live. They’re a snapshot from the last time a post was read. Recent posts are re-read every day, older ones less often. For the full schedule, see How Discover Updates. Your own channels follow the same schedule.
Engagement rate for a post
Each post gets its own engagement rate. Which formula is used depends on whether the post has a Reach number.
When the post has Reach (from your Meta CSV):
Engagement rate = all interactions ÷ Reach × 100
All interactions means likes + comments + shares + saves + replies + link clicks + sticker taps + profile visits + follows + navigation. Most of these only come from the CSV.
When the post has no Reach (public data only):
Engagement rate = (likes + comments + shares) ÷ followers × 100
Followers is the account’s follower count from the daily update closest to the day the post went out. If there’s no follower count within 30 days of that day, the post has no engagement rate and the table shows -.
YouTube accounts (when you compare against a YouTube competitor):
Engagement rate = (likes + comments) ÷ views × 100
A worked example
A bakery’s Instagram reel gets 120 likes, 15 comments, 10 shares and 25 saves. The bakery has 4,500 followers.
- With a Meta CSV that says the reel reached 3,400 accounts: (120 + 15 + 10 + 25) ÷ 3,400 × 100 = 5.0%
- Without a CSV, Instagram’s public data has no shares or saves: (120 + 15) ÷ 4,500 × 100 = 3.0%
The same reel shows a different rate depending on the data you have. Compare posts using the same kind of data.
Averages in Overview on Average
The Overview on Average cards show the average per post for every post published in your date range. Each card is a simple average: add up the numbers, then divide by the number of posts that have that number.
- Engagement Rate is the average of each post’s own rate. Posts without a rate are left out. When the report has full data, only posts with Reach are averaged.
- Likes, Comments, Shares and Saves leave out posts whose count is hidden. A hidden count is left out, not counted as zero.
- Views only averages posts that have a view count, such as reels. Photos don’t pull the average down.
- Reach averages the Reach from your Meta CSV. It only shows when the report has full data.
- With full data, Comments and Saves leave out Stories.
Example: three posts got 200, 100 and a hidden like count. Average likes = (200 + 100) ÷ 2 = 150, not 100.
Percent change and the previous period
Every card shows this period’s number, the previous period’s number (prev:) and the change between them.
Change = (this period − previous period) ÷ previous period × 100
- Green up arrow: the number went up. Red down arrow: it went down.
- 0%: no change. —: there isn’t a number to compare.
- If the previous period was 0 and this period isn’t, the change shows 100%.
- Engagement rate change is relative. A rate going from 4.0% to 5.0% shows 25%, not 1%.
The previous period depends on the date range you pick:
| Date range | Compared with |
|---|---|
| Last 7 Days, Last 30 Days, Last 90 Days, Custom Range | The same number of days just before it |
| This Month | All of last month |
| Last Month | The month before it |
Days run on UTC time.
Trend labels: Improving, Declining, Stable
Each row in Performance by Content Type, Pillar, Content Idea and Audience has a trend label.
Orsa averages the % changes in engagement rate, reach, likes, comments and views for that row. Then:
- Improving: the average change is above +5%.
- Declining: the average change is below −5%.
- Stable: anything in between.
When neither period has Reach (for example with public data only), Reach is left out of the average instead of counting as no change.
The label also shows how strong the trend is, like Improving (strong): strong when the average change is over 20%, moderate over 10%, weak otherwise.
Example: a pillar’s engagement rate is up 20%, likes up 10%, comments down 4%, views up 6%, and there’s no Reach. The average of the four is +8%, so the row says Improving (weak).
Full data vs. public data only
Each report runs in one of two modes, based on how much Meta CSV data it has.
Full data. At least 90% of the posts in your date range and its comparison period have a Reach number from your Meta CSV. You see every card, including Reach, Shares and Saves, and the CSV-only columns in the posts table.
Public data only. Less than 90% of those posts have Reach. A Public data only badge appears next to Overview on Average. Hover over it to see the exact share, for example “40% of posts in this range and the comparison period before it have Meta CSV data”. In this mode:
- Engagement rates use followers, not Reach.
- The Reach card is hidden. In the breakdowns, Avg Views replaces Avg Reach.
- Only the numbers the platform makes public are shown. See the next section.
- Posts that only exist in your CSV (not found in the public posts), and Stories, are left out.
- The posts table hides Replies, Profile Visits, Link Clicks, Sticky Taps and Navigation.
The mode is checked each time you change the channel or dates. One month can be full data and the next public only.
Which numbers each platform provides
With public data only, Analyze shows the numbers each platform makes public:
| Platform | Numbers shown |
|---|---|
| Engagement rate, likes, comments, views | |
| TikTok | Engagement rate, likes, comments, views, shares, saves |
| YouTube | Engagement rate, likes, comments, views |
| Engagement rate, likes, comments, shares | |
| Engagement rate, likes, comments, shares, views |
With full data (Instagram with a Meta CSV), you see every number, including Reach.
Reports lists your Instagram, Facebook, LinkedIn, TikTok and YouTube channels. Only Instagram can have full data, because Meta CSV uploads are Instagram only.
Stories
Public posts don’t include Stories. Stories only reach Analyze through your Meta CSV.
- With full data, Stories count in the averages, except Comments and Saves.
- With public data only, Stories are left out.
Restricted profiles
Sometimes Orsa can’t fully read an account’s public data, for example when the account has age or country limits. A yellow note then appears above the numbers:
This account’s public data couldn’t be fully collected (restricted profile), so these numbers may not be reliable.
Check the account is public. Open it in your browser while logged out. If you can’t see its posts there, Orsa can’t either. A Meta CSV upload can fill the gaps for your own Instagram account.
Why numbers can look off
- They’re a snapshot. Likes and views aren’t live. Posts older than 10 days update less often, and posts older than about 35 days keep their last numbers.
- A new post isn’t there yet. Posts arrive with the next daily update, around 2:00 a.m. UTC.
- Instagram’s own app shows different numbers. Instagram Insights uses Reach and private data. Without a Meta CSV, Analyze uses followers and public counts.
- Hidden like counts. If an account hides likes, those posts are left out of the likes average. Their engagement rate counts likes as 0.
- The mode changed. Moving the dates can switch a report between full data and public data only. Rates then use a different formula.
- Saves and Shares from your CSV went back to 0. The daily update can replace them on posts from roughly the last month. See Upload a Meta CSV Report.
- Your follower count jumped. Without Reach, rates divide by followers. A big change in followers changes the rate.
- Brand Pulse shows a different engagement rate. Brand Pulse looks at all channels together. See Brand Pulse.
Tips for the best results
- Upload a Meta CSV for your Instagram account. It’s the only way to get Reach, saves and shares, and the more accurate engagement rate.
- Cover the comparison period too. Full data needs Reach on 90% of posts in both your date range and the period before it. For Last 30 Days, export about the last two months.
- Compare like with like. Don’t compare a full-data rate with a public-only rate. Check for the Public data only badge first.
- Look at the post count. An average of two posts swings a lot. Longer date ranges give steadier numbers.
- Read engagement rate change as relative. 25% up on a 4% rate means 5%.
Common questions
Why is the engagement rate blank (-) on some posts? The post has no Reach and there’s no follower count from within 30 days of its publish date. This can happen for posts from before the channel was added.
Why don’t I see Reach, Shares or Saves? The report is in public data only mode. Instagram doesn’t make these public. Upload a Meta CSV that covers your date range and the period before it. See Upload a Meta CSV Report.
Why does the change say 100% when the previous period looks empty? When the previous period was 0, any increase shows as 100%.
Why did my engagement rate change after I uploaded a CSV? Posts with Reach switch to the Reach formula, which counts more interactions and divides by Reach instead of followers.
Is the engagement rate the same one Instagram shows? Not exactly. Analyze uses the formulas on this page. Instagram may count interactions differently.
What does the “Public data only” badge mean? Fewer than 90% of the posts in your dates and comparison period have Meta CSV data. Numbers come from public data only. Hover over the badge to see the exact share.
Was this helpful? Tell us what worked or what was missing athello@orsa.social.