One of the most common questions we get is “how often should I post?” While we’ve analyzed the causal effects of posting frequency in other studies, this analysis takes a different approach: we simply observe how often top-performing accounts actually post compared to the average user.
We analyzed posting patterns across major social platforms to understand if high-engagement accounts post more or less frequently than typical users.
What We Found
It’s pretty clear that people that receive the most engagement have consistently higher posting frequencies throughout the year than the average account.
It’s notable that text-based platforms like X, LinkedIn, and Threads show the largest differences in posting frequency between top performers and average users. Visual platforms like Instagram and TikTok show more variability week to week, but top performers still tend to post more frequently on average.
As always, correlation does not imply causation. We cannot conclude that posting more frequently causes higher engagement. It could be that successful accounts have more resources to post frequently, or that higher engagement motivates people to post more often.
I’d recommend testing on your own accounts to find the optimal posting frequency that balances quality and quantity for your specific audience.
Methodology
This analysis compares weekly posting frequencies between: 1. All users: Median posts per week across all qualified accounts 2. Top performers: Median posts per week for accounts in the top 10% of total weekly engagement
Engagement Definitions by Platform:
Instagram: Likes + Comments + Shares
Facebook: Reactions + Comments + Shares
X: Likes + Retweets + Comments
LinkedIn: Total engagements (native field)
Threads: Likes + Reposts + Replies + Quotes
Bluesky: Likes + Comments + Reposts
TikTok: Reach
YouTube Shorts: Views
Pinterest: Comments + Saves + Reactions
We calculated the median number of posts per week for all users and for the top 10% of users by total engagement that week, then compared these medians over time.
Data Collection
The SQL queries below return the median posting frequency per week for 1) all eligible users and 2) users in the top 10% of engagement for that specific platform. Users are eligible if they have posted at least 10 times in the past year and have posted in at least 4 different weeks.
All Users Query
Code
all_users_sql <-" with qualified_profiles as ( select profile_id , profile_service from dbt_buffer.publish_updates where sent_at >= timestamp_sub(current_timestamp, interval 365 day) and profile_service not in ('startPage', 'googlebusiness') group by 1, 2 having count(distinct timestamp_trunc(sent_at, week)) >= 4 and count(distinct id) >= 10 ) , posts_per_week as ( select timestamp_trunc(up.sent_at, week) as week , up.profile_service , up.profile_id , count(distinct up.id) as posts_in_week , 'All Users' as group_type from dbt_buffer.publish_updates as up inner join qualified_profiles as qp on up.profile_id = qp.profile_id where up.sent_at >= '2025-01-01' group by 1, 2, 3, 5 ) select week , profile_service , group_type , approx_quantiles(posts_in_week, 100)[offset(50)] as median_posts from posts_per_week group by 1, 2, 3"# get data for all eligible usersall_users_data <-bq_query(sql = all_users_sql)
Top Performers Posting Frequency
Code
top_performers_sql <-" with qualified_profiles as ( select profile_id , profile_service from dbt_buffer.publish_updates where sent_at >= timestamp_sub(current_timestamp, interval 365 day) and profile_service not in ('startPage', 'googlebusiness') group by 1, 2 having count(distinct timestamp_trunc(sent_at, week)) >= 4 and count(distinct id) >= 10 ) , weekly_engagement as ( select up.profile_service , timestamp_trunc(up.sent_at, week) as week , up.profile_id , count(distinct up.id) as posts_in_week , case when up.profile_service = 'instagram' then sum(up.likes + coalesce(up.comments, 0) + coalesce(up.shares, 0)) when up.profile_service = 'facebook' then sum(up.reactions + coalesce(up.comments, 0) + coalesce(up.shares, 0)) when up.profile_service = 'twitter' then sum(up.likes + coalesce(up.retweets, 0) + coalesce(up.comments, 0)) when up.profile_service = 'linkedin' then sum(up.engagements) when up.profile_service = 'threads' then sum(up.likes + up.reposts + up.replies + up.quotes) when up.profile_service = 'bluesky' then sum(up.likes + coalesce(up.comments, 0) + coalesce(up.reposts, 0)) when up.profile_service = 'tiktok' then sum(up.reach) when up.profile_service = 'youtube' then sum(up.views) when up.profile_service = 'pinterest' then sum(up.comments + up.saves + up.reactions) when up.profile_service = 'mastodon' then sum(up.shares + up.favorites + up.comments) else null end as total_weekly_engagement from dbt_buffer.publish_updates as up inner join qualified_profiles as qp on up.profile_id = qp.profile_id where up.sent_at >= '2025-01-01' group by 1, 2, 3 ) , ranked_profiles as ( select profile_service , week , profile_id , posts_in_week , total_weekly_engagement , percent_rank() over ( partition by profile_service, week order by total_weekly_engagement desc ) as engagement_percentile from weekly_engagement where total_weekly_engagement is not null ) , top_performers as ( select profile_service , week , profile_id , posts_in_week from ranked_profiles where engagement_percentile <= 0.10 ) , posts_per_week as ( select week , profile_service , posts_in_week , 'Top 10%' as group_type from top_performers ) select week , profile_service , group_type , approx_quantiles(posts_in_week, 100)[offset(50)] as median_posts from posts_per_week group by 1, 2, 3"# get data for top performerstop_performers_data <-bq_query(sql = top_performers_sql)
Code
# Combine datasetsposting_data <-bind_rows(all_users_data, top_performers_data)# Save datasaveRDS(posting_data, "top_performer_simple_data.rds")
Median Posting Frequencies Per Week
Let’s look at the median posting frequency across the entire year for all users and those in the top 10% of engagement.
In general, accounts in the top 10% of engagement tend to post a lot more than the average account.
Weekly Trends
Now let’s look at how posting frequency varies week by week throughout the year.
Code
# Get unique median values per weekweekly_medians <- posting_data %>%distinct(profile_service, week, group_type, median_posts)# Plot weekly trendsweekly_medians %>%ggplot(aes(x = week, y = median_posts, color = group_type, group = group_type)) +geom_line(alpha =0.5) +geom_smooth(se =FALSE, method ="loess", span =0.3) +facet_wrap(~profile_service, scales ="free_y", ncol =3) +scale_color_brewer(palette ="Set1") +labs(title ="Weekly Posting Frequency Throughout the Year",subtitle ="Median posts per week for all users vs. top performers",x ="Week",y ="Median Posts Per Week",color ="Group" ) +theme_minimal() +theme(legend.position ="bottom",axis.text.x =element_text(angle =45, hjust =1) )
It’s pretty clear that people that receive the most engagement have consistently higher posting frequencies throughout the year than the average account.
It’s notable that text-based platforms like X, LinkedIn, and Threads show the largest differences in posting frequency between top performers and average users. Visual platforms like Instagram and TikTok show more variability week to week, but top performers still tend to post more frequently on average.
Caveats
As always, correlation does not imply causation. We cannot conclude that posting more frequently causes higher engagement. It could be that successful accounts have more resources to post frequently, or that higher engagement motivates people to post more often.
I’d recommend testing on your own accounts to find the optimal posting frequency that balances quality and quantity for your specific audience.
Conclusion
Top performers post more frequently than average users on most platforms, but this doesn’t prove that posting more causes higher engagement. The relationship between posting frequency and success is complex and likely depends on content quality, audience expectations, and platform algorithms.
Focus on finding the sustainable posting frequency that allows you to maintain high content quality rather than trying to match top performers’ volume.