In this analysis we’ll compare engagement metrics for X Premium accounts to regular X accounts. We’ll also compare engagement rates for different types of posts, including link posts, posts with images, videos, and any other media.
Summary
Our analysis shows a significant divergence in performance metrics between Premium and regular X accounts that has accelerated since around January of 2025.
Premium X accounts typically get ten times the reach of regular accounts, with Premium Plus subscribers seeing the highest reach of all account types. While this could partly be attributed to Premium accounts having larger follower bases, the advantages these accounts receive on the platform likely create a self-reinforcing cycle where increased visibility leads to more followers, which in turn supports even greater reach.
The engagement rate trends tell a more interesting story. Prior to January 2025, Premium and regular accounts moved in similar directions for engagement rates, suggesting that X treated both account types similarly. However, something changed at the start of this year. Since then, engagement rates for Premium accounts have been growing while rates for regular accounts have decreased so severely that the median engagement rate for non-Premium accounts has been zero for the past two months.
This penalty appears to hit certain content types more than others. Link posts from regular accounts in particular have been affected, with their median engagement rates dropping to zero since March 2025. This suggests that X may be actively suppressing external link sharing from non-paying users, possibly to encourage users to keep conversations and traffic within the platform or to incentivize Premium subscriptions.
The fact that engagement rates for regular accounts have effectively reached zero represents more than just a tweak to the algorithm. It could suggest a more fundamental restructuring of how content is distributed on X. For businesses and creators relying on organic reach through regular X accounts, these findings indicate that Premium subscription may no longer be optional for meaningful platform engagement.
Data Collection
The SQL query below returns engagement statistics for more than 18.8 million posts from 71K X accounts over the past year. Of the 71K accounts, around 27% are Premium accounts.
Code
sql <-" with closest_analytics as ( select up.id as update_id , up.sent_at , up.profile_id , pp.service_id , ta.checked_at_date , ta.followers_count , row_number() over ( partition by up.id order by abs(date_diff(date(up.sent_at), ta.checked_at_date, day)) ) as rn from dbt_buffer.publish_updates as up inner join dbt_buffer.publish_profiles as pp on up.profile_id = pp.id left join dbt_buffer.analyze_twitter_analytics_user_daily_totals as ta on pp.service_id = ta.service_id and abs(date_diff(date(up.sent_at), ta.checked_at_date, day)) <= 30 where up.sent_at > '2024-08-01' and up.reach > 0 and up.profile_service = 'twitter' ) select distinct up.id as update_id , date(up.sent_at) as date , up.profile_id , up.media_type , ch.is_premium_channel , ch.service_subscription_type as profile_type , up.reach , up.likes , up.comments , up.retweets , ca.followers_count as followers from dbt_buffer.publish_updates as up inner join dbt_buffer.core_channels as ch on up.profile_id = ch.id left join closest_analytics as ca on up.id = ca.update_id and ca.rn = 1 where up.sent_at > '2024-08-01' and up.reach > 0 and up.profile_service = 'twitter'"# get data from BigQueryposts <-bq_query(sql = sql)
Next we’ll tidy the data a bit and calculate an engagement rate. For us that will be (likes + comments + retweets) / reach.
The plot below shows the median reach per account type per month. We can see that X Premium accounts typically get ten times the reach that regular X accounts get.
Code
# plot median reach by profile typeposts %>%filter(!is.na(is_premium_channel) & reach >0) %>%group_by(month, is_premium_channel) %>%summarise(med_reach =median(reach, na.rm = T)) %>%ggplot(aes(x = month, y = med_reach, color = is_premium_channel)) +geom_line() +geom_point() +scale_y_continuous(labels = comma, limits =c(0, 1000)) +theme_hc() +theme(legend.position ="right") +labs(x =NULL, y =NULL, color ="Is Premium",title ="Median Reach Per Post",subtitle ="X Premium Profiles Typically Get 10x More Reach")
We can also beak median reach down by the specific account types. As one might expect, Premium Plus accounts typically see the highest reach.
Code
# plot median reach by account typeposts %>%filter(!is.na(is_premium_channel) & reach >0) %>%group_by(month, profile_type) %>%summarise(med_reach =median(reach, na.rm = T)) %>%ggplot(aes(x = month, y = med_reach, color = profile_type)) +geom_line() +geom_point() +scale_y_continuous(labels = comma, limits =c(0, 2200)) +theme_hc() +theme(legend.position ="right") +labs(x =NULL, y =NULL, color ="Account Type",title ="Median Reach Per Post",subtitle ="X Premium Profiles Typically Get 10x More Reach")
It’s important to note here that it may be the case that X Premium accounts have more followers. However, that may be partly due to the fact that they are featured more prominently on X. This cycle of being featured prominently leading to more followers could conceivably lead to reach being significantly higher for Premium accounts
Engagement Rates
The plot below shows the median engagement rate per account type per month. There are a few things to note here:
Engagement rates, measured as the sum of likes, comments, and reposts divided by reach, are pretty low on X.
There is a diverging trend between Premium and regular accounts. Engagement is growing for Premium accounts and shrinking for regular accounts, so much so that the median engagement rate for regular accounts has been 0% for the last two months.
Prior to January of 2025, engagement rates for Premium and regular accounts were moving in the same direction. Something changed in January, and engagement rates started decreasing only for regular accounts.
Code
# plot median engagement rate profile typeposts %>%filter(!is.na(is_premium_channel) &!is.na(followers)) %>%group_by(month, is_premium_channel) %>%summarise(posts =n(),profiles =n_distinct(profile_id),med_eng =median(engagement_rate, na.rm = T)) %>%ggplot(aes(x = month, y = med_eng, color = is_premium_channel)) +geom_line() +geom_point() +scale_y_continuous(labels = percent) +theme_hc() +theme(legend.position ="right") +labs(x =NULL, y =NULL, color ="Is Premium",title ="Median Engagement Rate on X",subtitle ="Engagement rate = engagements / reach")
Now we’ll break down engagement rates by account type. We can see that it’s mainly the regular, non-paid accounts who have been penalized. Their engagement rates dropped all the way to zero in recent months, while paid account types have not.
Code
# plot median engagement rate profile typeposts %>%filter(!is.na(is_premium_channel) &!is.na(followers)) %>%group_by(month, profile_type) %>%summarise(posts =n(),profiles =n_distinct(profile_id),med_eng =median(engagement_rate, na.rm = T)) %>%ggplot(aes(x = month, y = med_eng, color = profile_type)) +geom_line() +geom_point() +scale_y_continuous(labels = percent) +theme_hc() +theme(legend.position ="right") +labs(x =NULL, y =NULL, color ="Account Type",title ="Median Engagement Rate on X",subtitle ="Engagement rate = engagements / reach")
Engagement Rates Per Post Type
The plot below shows engagement rates for each post type, for both Premium and regular accounts. Here we can see that link posts for regular accounts have really been penalized – their median engagement rates have dropped to zero since March of 2025.
Code
# plot median engagement rate profile type and media typeposts %>%filter(!is.na(is_premium_channel) &!is.na(followers) & media_type !="media") %>%mutate(is_premium_channel =ifelse(is_premium_channel, "Premium", "Regular")) %>%group_by(month, is_premium_channel, media_type) %>%summarise(posts =n(),profiles =n_distinct(profile_id),med_eng =median(engagement_rate, na.rm = T)) %>%ggplot(aes(x = month, y = med_eng, color = media_type)) +geom_line() +geom_point() +scale_y_continuous(labels = percent) +facet_wrap(~is_premium_channel) +labs(x =NULL, y =NULL, color ="Is Premium",title ="Median Engagement Rate on X",subtitle ="Engagement rate = engagements / reach")