Posts, daily insights and followers from each network
Per-client yardstick, format and daily snapshot
Performance by post, profile and month
Report, dashboard and AI agent
What it solves
- Reach and engagement in the report match what the client sees in the app.
- Follower history exists even after the API only shows today's number.
- The top post of the month comes from the same yardstick on every network, with no job posts or ads mixed in.
Business questions it answers
Ask your agent these questions once the case is live.
What you need
- Instagram, LinkedIn, Facebook Pages and TikTok connected per client profile
- A daily snapshot of followers and profile stored from day one
- The yardstick agreed with each client: reach or views, and what goes into the ranking
What you get
- A table per post with format, reach, views, interactions and engagement rate
- A daily series per profile with followers, gains and reach
- Month big numbers against the previous month, on the same yardstick
- An AI agent that answers about organic without mixing it with paid media
Where to activate
Big numbers, top post and follower growth, with the yardstick stated in the footer.
Answers which post did best and how much the profile grew, without confusing organic and paid.
Ranking by format and content pillar, with the post image.
The sources are simple. The work is storing history starting now and fixing each client's yardstick before the first report. The detailed view has the business rules, the pitfalls and the acceptance test. Or send everything straight to your agent with the Nekt MCP.
Each network delivers organic data its own way: Instagram replaced impressions with views, LinkedIn calls reach unique impressions and TikTok has no reach at all. Followers and profile data are only today's number, so whoever did not store history cannot say how many followers the client gained in March. And whoever sums daily reach delivers a number larger than the real one, which the client does not recognize in the app.
How it is usually done, and the rule
Each row is a mistake that already happened in practice.
Reach counts unique people. Summing reach across days or posts counts the same person more than once. For the month, use the 28-day reach the network itself deduplicates (instagram_insights_rolling_days28 on the last day) or show reach per post. Interactions, likes, comments and views do add up.
Agree on the coverage metric with the client and keep it. On Instagram, the API discontinued impressions in April 2025 and now delivers views. LinkedIn has no post views: the approximation is impressionCount, with uniqueImpressionsCount as reach. Store in a column which source field produced each number.
Followers is the value on the last day of the period. Follower gain is end minus the end of the previous period, or the sum of daily gains when the network provides them (on LinkedIn, organic plus paid followerGains). Repeating the latest number on every past row creates a flat history that never happened.
Profile, followers and cumulative video and page metrics are current state only. Write one row per profile per day after each sync, with the reference date set to the previous day in the client's time zone and an idempotent write (running twice the same day updates the same row). Never overwrite the history table.
Post metrics (media_insights, post_statistics) are cumulative over the post's life and keep growing after the month. In the ranking and the post count, the post stays in the month it was published, and the report states up to which date metrics were read. Daily account metrics (insights_rolling_day) stay on the insight day.
On Instagram, media_type alone does not separate Reels: VIDEO with media_product_type REELS is Reels, CAROUSEL_ALBUM is Carousel, IMAGE is Static and STORY is Story. Stories last 24 hours and have their own metrics: they stay out of the ranking and the post target, counted separately.
Remove from the ranking job and recruiting posts, posts with no organic statistics (dark posts and ad variations on LinkedIn) and boosted content when the yardstick is organic. Interactions per thousand followers (interactions / followers at period end x 1000) compares posts across profiles of different sizes.
Engagement rate = interactions / reach, or / views if that is the client's yardstick, computed from period sums and never as the average of daily or per-post rates. TikTok provides neither reach nor saves: there the rate is (likes + comments + shares) / views, and the report says the yardstick is different.
Profile reach and engagement do not exist in Meta Ads tables, which are paid media. If the client's profile is not connected, the answer is that there is no organic data, not a number taken from Facebook Ads. A piece produced is also not a piece published.
Daily insights and follower counts sync at different times and one lags the other. Join the two series by day keeping the days from both (FULL OUTER JOIN), otherwise the most recent day disappears from the chart.
Yardstick per network
The field that answers each metric, per network. Declare the official yardstick in the client's context.
Definitions
Pitfalls that already happened
Summing daily reach for the month produced a reach well above what the app showed, because the same person was counted on several days.
Use the network's 28-day reach or reach per post.
After April 2025 Instagram's impressions field stopped arriving and the report started showing zero, as if the profile had stopped.
Switch to views and record the change date in the context.
The table kept only today's total, repeated on every row. The growth chart came out flat and the monthly gain, zero.
Daily snapshot in append from day one.
Recruiting posts boosted by HR led the LinkedIn impressions ranking and hid the brand content.
Filter job posts and posts with no organic statistics.
Filtering the page aggregate with share = '' returned zero rows, because the field comes as null, not empty. Breaking down by country with pageStatisticsByGeoCountry also zeroed months where the array came empty.
Test null and empty together and use the totalPageStatistics totals.
Insights and followers synced at different times and a plain join dropped the most recent day.
A join that keeps the days of both series.
Acceptance test
The case is done when every item passes.
- For one profile and one closed month, views and interactions match the network's native dashboard or the client's reporting tool (difference below 2%).
- No monthly reach is a sum of daily reach: monthly reach equals the network's 28-day reach on the last day.
- Followers at each month end come from that day's snapshot, and month end minus previous month end equals followers gained.
- Stories do not appear in the ranking, and the sum of posts by format equals total posts published.
- The posts table has one row per post and per network.
Agent package
Paste into Claude, ChatGPT or any client with the Nekt MCP connected.
Organic social media - The organic source is the profile's own (Instagram, Facebook Pages, LinkedIn organic, TikTok). Meta Ads tables are paid media and never answer profile reach or engagement. With no organic source for the client, say there is no data. - Reach does not add up across days or posts. Monthly reach = the network's 28-day reach on the last day, or reach per post. - Coverage yardstick per network: Instagram = views (impressions was discontinued in April 2025); LinkedIn = impressionCount, with uniqueImpressionsCount as reach; TikTok = view_count. - Engagement rate = sum of interactions / sum of the client's declared base, over the same period. TikTok has no reach or saves. - Followers = snapshot value on the last day of the period. Followers gained = end minus end of the previous period. - A post belongs to its publishing month; post metrics are cumulative up to the read date, which must be stated. - Instagram format: media_type + media_product_type. Stories stay out of the post ranking. - The ranking excludes job and recruiting posts and posts with no organic statistics. - On LinkedIn, the page aggregate in daily_share_statistics is the row with share and ugcPost null or empty. Per-client exceptions: - <client>: official yardstick is <views | reach>; engagement rate over <base>. - <client>: Instagram has no connector; monthly numbers come from <reporting tool>, validated through <month>. - <client>: posts with <term> in the caption stay out of the ranking.
Build the "Organic social media" case in my Nekt workspace following the rules at https://academy.nekt.com/en/industrias/agencias/redes-sociais-organicas.md. 1) Find the source tables and confirm the columns the rules use. 2) Create a transformation at the stated grain applying every rule. 3) Run the acceptance test and show me the result of each item. 4) Create the case's context document in the workspace, leaving my clients' exceptions open for me to fill in.
Variations
Classify each post into a pillar from caption words or hashtags and compare engagement by pillar.
Cost per follower = spend on follower campaigns / followers gained on the same network and day.
Comment sentiment per post, for the brand health section of the report.