This analysis follows up on a previous analysis I did on posting frequency and follower growth on Instagram. In this analysis we’ll focus on LinkedIn, with the aim of trying to find a sweet spot for the amount of posts one should share in a given week.
What We Found
The data reveals a positive relationship between the number of posts shared in a given week and engagement metrics like average engagement rates and reach. We found that more frequent posting consistently leads to better per-post performance across all of the key metrics we looked at.
This finding is particularly interesting because it shows that posting more doesn’t just increase total engagement statistics, as one would suggest. There is evidence that it also improves the performance of each individual post.
This suggests LinkedIn’s algorithm could significantly reward active, consistent accounts by giving their content more reach, resulting in higher engagement rates.
Key Findings
Posting 2-5 times per week is the minimum effective frequency, and probably a sweet spot for most. Accounts posting just once per week consistently under-perform their own baseline engagement across all of the metrics we looked at. The step up from 1 post to 2-5 posts per week results in substantial gains in engagement metrics without having to spend a ton of energy creating more posts.
That being said, higher posting frequencies result in increasingly strong returns. The most dramatic improvements come with posting 6-10 times per week, while accounts posting more than 10 times per week get the highest engagement, per-post, of all. Accounts that post more than 10 times per week are able to achieve the following:
4x higher reach per post than single-post accounts
3x higher engagements per post
2.5x higher engagement rates
For most accounts, posting 2-5 times per week is probably the sweet spot. Additional gains can be had by posting more frequently, but we want to be mindful the amount of effort required. If you have the content and energy to do it, I’d suggest going for it! Try posting at least 6 times in a week and see how your engagement numbers react.
Methodology
This analysis examines how posting frequency affects per-post performance on LinkedIn, specifically reach per post, the number of engagements per post, and the engagement rate per post.
We analyzed approximately 2 million posts shared in the last year by LinkedIn accounts connected to Buffer. We used Z-scores and fixed effects regression to control for account-level difference and compare each account’s performance to it’s own baseline over time.
Data Collection
The SQL query below returns LinkedIn posting and engagement data for qualified profiles that posted in at least 4 weeks in the past year and received engagement.
Code
sql <-"with qualified_linkedin_profiles as ( --linkedin profiles that posted in at least 4 weeks in the past year -- and got engagement on their posts select up.profile_id , count(distinct timestamp_trunc(up.sent_at, week)) as weeks_with_posts , sum(up.engagements) as total_engagements , count(distinct up.id) as total_posts from dbt_buffer.publish_updates as up where up.profile_service = 'linkedin' and up.sent_at >= timestamp_sub(current_timestamp, interval 365 day) and up.engagements > 5 group by 1 having count(distinct timestamp_trunc(up.sent_at, week)) >= 4), posts_with_median as ( select up.profile_id , timestamp_trunc(up.sent_at, week) as week , up.id , up.reach , up.likes , up.comments , up.engagements , up.engagement_rate , up.clicks , up.shares , percentile_cont(up.engagement_rate, 0.5) over (partition by up.profile_id, timestamp_trunc(up.sent_at, week)) as median_engagement_rate , percentile_cont(up.reach, 0.5) over (partition by up.profile_id, timestamp_trunc(up.sent_at, week)) as median_reach from dbt_buffer.publish_updates as up inner join qualified_linkedin_profiles as qlp on up.profile_id = qlp.profile_id where up.profile_service = 'linkedin' and up.sent_at >= timestamp_sub(current_timestamp, interval 365 day) and up.engagements > 5)select profile_id as channel_id , week , count(distinct id) as posts , sum(reach) as total_reach , sum(likes) as total_likes , sum(comments) as total_comments , sum(engagements) as total_engagements , avg(engagement_rate) as avg_engagement_rate , avg(reach) as avg_reach , max(median_engagement_rate) as median_engagement_rate , max(median_reach) as median_reach , sum(clicks) as total_clicks , sum(shares) as total_sharesfrom posts_with_mediangroup by 1, 2"# get data from BigQueryposts <-bq_query(sql = sql)
We’ll group the number of posts sent in a given week into five separate buckets:
The plot below shows that the average reach per post increases as the posting frequency increases. This isn’t surprising, but we should be careful to account for confounders. It’s likely the case that larger accounts that get more engagement just tend to post more frequently. We’ll account for this in a moment.
Code
# plot reach per post by posting frequencyengagement_per_post %>%group_by(posting_frequency_bin) %>%summarise(avg_reach_per_post =mean(avg_reach, na.rm =TRUE)) %>%ggplot(aes(x = posting_frequency_bin, y = avg_reach_per_post)) +geom_col(show.legend =FALSE) +scale_y_continuous(labels = comma) +labs(x ="Weekly Posts Shared",y ="Average Reach Per Post",title ="Average Reach Per Post by Posting Frequency",subtitle ="LinkedIn Profiles - Excluding No Posts Weeks")
The plot below shows the average number of engagements per post by posting frequency. Again, no surprises here.
Code
# plot engagements per post by posting frequencyengagement_per_post %>%group_by(posting_frequency_bin) %>%summarise(avg_engagements_per_post =mean(engagements_per_post, na.rm =TRUE)) %>%ggplot(aes(x = posting_frequency_bin, y = avg_engagements_per_post)) +geom_col(show.legend =FALSE) +scale_y_continuous(labels = comma) +labs(x ="Weekly Posts Shared",y ="Average Engagements Per Post",title ="Average Engagements Per Post by Posting Frequency",subtitle ="LinkedIn Profiles - Excluding No Posts Weeks")
The plot below shows the average engagement rate by posting frequency. Here we see something surprising. As posting frequencies rise, average engagement rates seem to fall. The last chart showed us that the total number of engagements rose as posting frequencies rose, but it may be the case that engagement rates don’t show the same pattern.
Again, we need to control for account-level differences before coming to any conclusions.
These initial relationships show interesting patterns, but they may not tell us the full story. We need to control for differences in accounts’ inherent differences, such as follower counts.
To illustrate the need for controlling these factors, imagine a high-engagement account that naturally gets strong per-post performance and tends to post frequently, versus a smaller account with modest per-post performance that posts less often. If we simply compare across accounts, we might incorrectly conclude that posting frequency drives per-post performance, when in reality it could be that high-performing accounts simply tend to post more.
To address this issue, we use statistical methods that compare each account against itself over time, basically asking the question “when this account posts more or less frequently, how does their per-post performance change?” This within-account comparison controls for inherent differences between accounts.
How We Account for Inherent Account Differences
We use two complementary approaches to ensure you’re measuring the true effect of posting frequency:
Z-Score Analysis Instead of comparing different channels to each other, we compare each channel to its own typical per-post performance. The Z-score tells us how much better or worse a channel performed compared to its own average.
For example, if Channel A typically gets 500 reach per post and Channel B typically gets 100 reach per post, a 300 reach-per-post week would be below average for Channel A, represented by a negative Z-score, and above average for Channel B, represented by a positive Z-score.
Fixed Effects Regression This statistical technique controls for all time-invariant account characteristics. It attempts to answer the question “when the same channel varies its posting frequency across different weeks, how does this affect their per-post performance?”
This method compares each channel’s high-frequency weeks to their own low-frequency weeks, controlling for the inherent differences between accounts that remain constant over time.
Z-Score Analysis
This is the approach to calculate Z-scores for per-post metrics:
Calculate the mean and standard deviation of per-post metrics across all weeks for each channel (excluding no-post weeks)
Calculate a Z-score for each week. Z = (metric value - average metric) ÷ standard deviation
For each channel and week, the Z-score tells us how many standard deviations above or below average a channel performed:
Z = 0: Typical per-post performance for this channel Z = +1: Strong positive week (better than ~84% of weeks) Z = +2: Exceptional week (better than ~97% of weeks)
Z = -1: Poor week (worse than ~84% of weeks)
We’ll calculate Z-scores for reach per post, engagements per post, and engagement rate.
Code
# calculate channel-specific mean and standard deviation for per-post metricschannel_stats_per_post <- engagement_per_post %>%group_by(channel_id) %>%summarise(mean_reach_per_post =mean(avg_reach, na.rm =TRUE),sd_reach_per_post =sd(avg_reach, na.rm =TRUE),mean_engagements_per_post =mean(engagements_per_post, na.rm =TRUE),sd_engagements_per_post =sd(engagements_per_post, na.rm =TRUE),mean_eng_rate =mean(avg_engagement_rate, na.rm =TRUE),sd_eng_rate =sd(avg_engagement_rate, na.rm =TRUE),n_weeks =n() ) %>%# only keep channels with sufficient data and variationfilter(n_weeks >=3, sd_reach_per_post >0, sd_engagements_per_post >0, sd_eng_rate >0)# merge back and calculate Z-scores for per-post metricsengagement_per_post_with_z <- engagement_per_post %>%inner_join(channel_stats_per_post, by ="channel_id") %>%mutate(z_score_reach_per_post = (avg_reach - mean_reach_per_post) / sd_reach_per_post,z_score_engagements_per_post = (engagements_per_post - mean_engagements_per_post) / sd_engagements_per_post,z_score_eng_rate = (avg_engagement_rate - mean_eng_rate) / sd_eng_rate )# calculate summary statistics for reach per postengagement_per_post_with_z %>%group_by(posting_frequency_bin) %>%summarise(mean_engagements_z =mean(z_score_engagements_per_post),mean_eng_rate_z =mean(z_score_eng_rate),mean_z_score_reach_per_post =mean(z_score_reach_per_post, na.rm =TRUE))
# plot z-scores for enagement rateengagement_per_post_with_z %>%group_by(posting_frequency_bin) %>%summarise(mean_engagements_z =mean(z_score_engagements_per_post),mean_eng_rate_z =mean(z_score_eng_rate),mean_z_score_reach_per_post =mean(z_score_reach_per_post, na.rm =TRUE)) %>%ggplot(aes(x = posting_frequency_bin, y = mean_eng_rate_z)) +geom_col(show.legend = F) +labs(x ="Posting Frequency", y =NULL,title ="Average Engagement Rate Z-Score by Posting Frequency",subtitle ="LinkedIn Profiles -- Excluding Weeks with No Posts")
Fixed Effects Regression Models for Per-Post Metrics
Fixed effects regression compares each channel against itself over time, controlling for all time-invariant characteristics of accounts. This allows us to isolate the effect of posting frequency on per-post performance.
Reference Category: All coefficients are interpreted relative to “1-2 Posts” per week, which serves as our baseline. Positive coefficients indicate better per-post performance than the 1-2 posts baseline; negative coefficients indicate worse performance.
Model Specification: We use robust standard errors clustered at the channel level to account for potential correlation within accounts over time.
Engagement Rate Per Post Model
Code
# fit fixed effects modelfe_model <-feols(avg_engagement_rate ~ posting_frequency_bin | channel_id, data = engagement_per_post, cluster ="channel_id")# summarise modelsummary(fe_model)
The statistical analysis provides strong evidence for the posting frequency effects observed in the raw data, controlling for inherent differences between accounts.
Z-Score Analysis Results
The Z-score analysis reveals a clear pattern when comparing each account’s performance against its own baseline:
1 Post per week: Accounts consistently underperform their own average (negative Z-scores across all metrics)
2-5 Posts per week: Slight positive performance compared to baseline
6-10 Posts per week: Moderate outperformance of baseline
11+ Posts per week: Strongest outperformance relative to each account’s typical performance
This pattern holds across reach, engagements, and engagement rate, confirming that more frequent posting leads to better per-post performance even when controlling for each account’s inherent performance characteristics.
Fixed Effects Regression Results
The fixed effects models provide the strongest evidence for causal effects, comparing each account against itself over time. All results are relative to posting just 1 time per week:
Engagement Rate Model: - 2-5 Posts: +0.23 percentage points higher engagement rate per post (p < 0.001) - 6-10 Posts: +0.76 percentage points higher engagement rate per post (p < 0.001)
- 11+ Posts: +1.40 percentage points higher engagement rate per post (p < 0.001)
Total Reach Model: - 2-5 Posts: +1,182 additional reach per post on average (p < 0.001) - 6-10 Posts: +5,001 additional reach per post on average (p < 0.001) - 11+ Posts: +16,946 additional reach per post on average (p < 0.001)
Key Insights
Effect Magnitudes are Substantial: The differences aren’t just statistically significant - they’re practically meaningful. Moving from 1 post to 11+ posts per week increases individual post reach by nearly 17,000 people on average.
Progressive Returns: Each step up in posting frequency delivers meaningful incremental gains, with the largest jumps occurring at higher frequencies. This suggests LinkedIn’s algorithm increasingly rewards very active accounts.
Consistency Across Metrics: The pattern holds for both engagement rates and reach, indicating this isn’t just about one aspect of performance but overall content amplification by the platform.
Within-Account Effects: Because these are fixed effects models, we can be confident these represent true effects of posting frequency rather than just differences between types of accounts. When the same account posts more frequently, their individual posts perform better.