How Often Should You Post?

insights
Author

Julian Winternheimer

Published

December 2, 2025

Overview

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 users
all_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 performers
top_performers_data <- bq_query(sql = top_performers_sql)
Code
# Combine datasets
posting_data <- bind_rows(all_users_data, top_performers_data)

# Save data
saveRDS(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.

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.