The Best Time to Post on X Is Not 9am Wednesday — Here's How to Find Yours
The Best Time to Post on X Is Not 9am Wednesday — Here's How to Find Yours
Search this and you'll find a hundred articles confidently naming a time. 9am Wednesday. 12pm Tuesday. 5-6pm weekdays.
They disagree with each other, which should tell you something. ★They're averages across millions of accounts with nothing in common — different time zones, industries, and audiences.★ An average across everyone describes nobody.
The answer that's actually useful is your own, and computing it takes about twenty minutes.
Why published times don't transfer
Your audience has a location. A B2B account selling to Germany and a gaming account with US teenagers have opposite optimal windows. An average of the two is right for neither.
Your niche has a rhythm. Developer content does well when developers are procrastinating. Parenting content does well after bedtime. These aren't the same hours.
Your account size changes what matters. ★Below a few thousand followers, timing barely registers★ — your posts reach people through search and reposts more than through the timeline. Timing matters most for accounts big enough that a chunk of the audience is online simultaneously.
⚠️ The honest version: for most small accounts, ★posting consistently beats posting at the "right" hour★ by a wide margin. If you're choosing between "post daily at a random time" and "post twice a week at the optimal time", pick the first.
If you want the actual answer for your account rather than an average, the data is one call away — the method is below.
★The sampling trap that invalidates most analyses★
Before any code, the thing that makes most people's answer wrong:
If you've only ever posted at 9am, you have no data about 3pm.
You'll compute an average for 9am and nothing for 3pm, then conclude 9am is best. ★What you actually measured is your own habit, not your audience's behaviour.★
This is the single most common analytical error in this topic, and it's self-reinforcing: you conclude 9am works, so you keep posting at 9am, so you never get data about anything else.
The fix: deliberately post at varied times for two to three weeks before analysing. Randomise across the hours you'd realistically use. ⚠️ A biased sample doesn't just give a weak answer — it gives a confident wrong one.
What to measure
Not raw engagement. A post from when you had 500 followers isn't comparable to one from when you had 5,000.
★Rate against views, not followers.★ Views count who the post actually reached; followers counts people who followed you once and never came back. The distinction matters throughout analytics.
Use the median, not the mean. ★One viral post will drag an average until the whole analysis is meaningless.★ If a single post at 2pm did 50× your normal numbers, the mean says 2pm is magic. The median says it was one post.
Bucket by hour and weekday separately before combining. Weekday-vs-weekend is often a bigger effect than hour-of-day, and averaging them together hides it.
Computing it
import requests
from collections import defaultdict
from datetime import datetime
from statistics import median
BASE = "https://api.socialapi.tech"
KEY = "your_api_key"
HDRS = {"X-API-Key": KEY}
def fetch_posts(username, pages=5):
out, cursor = [], None
for _ in range(pages):
params = {"username": username, "limit": 100}
if cursor:
params["cursor"] = cursor
r = requests.get(f"{BASE}/v1/user/last_tweets",
params=params, headers=HDRS, timeout=60)
r.raise_for_status()
body = r.json()
if not body["data"]:
break
out.extend(body["data"])
cursor = body.get("meta", {}).get("next_cursor")
if not cursor:
break
return out
def rate(post):
"""Engagement over views. Views can be 0 on very new posts."""
views = post.get("view_count") or 0
if not views:
return None
return (post.get("like_count", 0) + post.get("retweet_count", 0)
+ post.get("reply_count", 0) + post.get("quote_count", 0)) / views
def by_hour(username, min_sample=3):
buckets = defaultdict(list)
for p in fetch_posts(username):
r = rate(p)
if r is None:
continue
# created_at is UTC — convert to your audience's frame if needed
dt = datetime.strptime(p["created_at"], "%a %b %d %H:%M:%S %z %Y")
buckets[dt.hour].append(r)
rows = []
for hour, rates in sorted(buckets.items()):
# ★refuse to report a bucket with too few posts★
if len(rates) < min_sample:
continue
rows.append((hour, median(rates), len(rates)))
return sorted(rows, key=lambda x: -x[1])
print(f"{'hour':>5} {'median rate':>12} {'posts':>7}")
for hour, med, n in by_hour("yourhandle"):
print(f"{hour:>4}h {med:>11.2%} {n:>7}")
skipped = "hours with fewer than 3 posts are omitted — not enough to judge"
print(f"\n({skipped})")
★The min_sample guard is the most important line.★ (Timestamps and engagement come back together, so the bucketing is one pass.) Without it, an hour where you posted once and got lucky ranks first, and you'd reorganise your schedule around a single data point.
Reading the output honestly: if your top hour and your median hour are within a factor of two, ★timing isn't your lever★ — content and consistency are. Go work on those instead.
Scheduling
The other half of this search term: once you know your time, how do you post then?
X has a built-in scheduler in the compose box — the calendar icon lets you pick a date and time. Free, and enough for most people.
Third-party schedulers add queues, bulk upload, and cross-platform posting. ⚠️ They require write access to your account, which is a real consideration — what that permission tier means.
★To be clear about what we don't do: we're read-only. We can tell you when to post; we can't post for you, and no read-only API can.★
Questions people ask
What is the best time to post on Twitter? There's no universal answer. Published times are averages across unrelated audiences. Compute yours from your own posting history.
What are the best times to post on X in 2026? Same answer — it depends on your audience's time zone and habits. A general figure describes an average nobody has.
Is 9am really the best time to tweet? It's a commonly cited average. Whether it's right for you depends on where your audience is and when they're online.
How do I find my best posting time? Bucket your posts by hour, compute median engagement rate per bucket, and ignore buckets with fewer than three posts.
Why do different sites give different best times? They're averaging different sets of accounts. The disagreement is the evidence that no single answer exists.
Does posting time actually matter? For large accounts, somewhat. ★For small accounts, consistency matters far more.★
How many posts do I need before I can tell? At least three per time bucket, and ideally several weeks of varied posting. Fewer than that is noise.
Why is my analysis showing 9am as best when I only post at 9am? ★That's the sampling trap — you have no data about other hours.★ Vary your posting times before analysing.
Should I use mean or median engagement? Median. One viral post distorts a mean beyond usefulness.
Should I rate against followers or views? Views. Followers includes people who never see your posts.
What time zone does Twitter use? Timestamps come back in UTC. Convert to your audience's zone, not your own, if they differ.
How do I know my audience's time zone? X doesn't expose it directly. Infer it from when your engagement actually peaks — which is what this analysis measures.
Does the day of the week matter? Often more than the hour. Bucket by weekday separately before combining.
Is weekend posting worse? Depends entirely on your niche. Consumer content often does better; B2B usually worse.
How often should I post? More relevant than when, for most accounts. Consistency beats optimal timing.
Does posting more increase reach? Up to a point. Beyond it you compete with yourself and risk looking automated.
Can I schedule tweets on Twitter? Yes — the calendar icon in the compose box. Free and built in.
How do I schedule a tweet? Compose, click the calendar icon, pick date and time, then Schedule.
Can I schedule tweets for free? Yes, with X's built-in scheduler. Third-party tools add features and require account access.
What's the best Twitter scheduler? The built-in one, unless you need queues or cross-platform posting. ⚠️ Third-party means granting write access.
Can I edit a scheduled tweet? Yes, before it posts. Scheduled posts are in the drafts area.
How many tweets can I schedule? There's a cap in the built-in scheduler, generous enough for normal use.
Do scheduled tweets get less reach? No evidence they're treated differently. The content and timing matter, not how it was submitted.
Can I schedule threads? The built-in scheduler handles single posts. Threads generally need a third-party tool.
Does an API let me schedule posts? Only one with write access. ★A read-only data API can't post — ours can't and doesn't try.★
How do I automate posting? That requires write access through the official API. What a developer account involves.
What if my best time is inconvenient? Schedule it. That's exactly what the scheduler is for.
Should I post at the same time every day? It builds a habit for your audience, but it also means you never learn about other hours. Vary occasionally.
Does timing matter for replies? More than for posts — replies compete on recency in a busy thread.
How long does a tweet stay relevant? Most reach happens in the first few hours. Rare posts keep travelling for days.
Can I test posting times with an A/B test? Not a true A/B — you can't post the same content twice. Compare medians across time buckets over weeks instead.
Why did my engagement drop after changing times? Could be timing, could be ordinary variance. Give it several weeks before concluding.
Do hashtags change the best time? No, but they change discoverability — see hashtag measurement.
Is there a worst time to post? Usually the hours your audience is asleep. Your own data shows this more reliably than a general chart.
How do I track posting time performance over time? Record the analysis monthly. Audiences shift, and last quarter's answer may not hold.
Do I need a big account for this analysis? You need enough posts per bucket. A small account posting daily accumulates that within a couple of months.
What if I post at the same time as a competitor? Not a real problem — you're not competing for a slot, you're competing for attention.
Can I see when my followers are online? Not directly. Peak engagement times are the observable proxy.
The short version
Ignore published best times. They're averages across audiences unlike yours, which is why they contradict each other.
Compute your own — bucket by hour, use median engagement rate against views, require at least three posts per bucket.
★Vary your posting times first. Analysing a biased sample gives you a confident wrong answer, which is worse than no answer.★
Our API returns posts with engagement counts and timestamps, so the analysis above is a short script over your own history. Read-only, flat price per call, no rate limit of your own to manage.
What it can't do: post or schedule for you. That needs write access, and X's built-in scheduler already handles it for free.
Related reading: measuring engagement properly · why one viral post distorts averages · testing for visibility problems · what write access means.