Why is my Bluesky post not publishing?
Bluesky posts usually fail for one of seven reasons: a revoked or deleted app password, an expired session, a failed media upload, text over the 300-character limit, a rate limit, a handle or server change, or a queue that never fired. Create a fresh app password, reconnect, and test one short text-only post.
The annoying part is that most schedulers do not tell you which one it was. They mark the post as sent and move on. This guide walks through every real cause, how to spot each one in minutes, and how a confirmed-publish receipt turns a silent failure into a clear alert.
| Likely cause | How to tell | Fix |
|---|---|---|
| Revoked or deleted app password | Every Bluesky post fails at once with an auth error; other platforms still publish. | Create a fresh app password in Bluesky settings and reconnect the account. |
| Expired session | Posts worked for weeks, then stopped; reconnecting fixes it instantly. | Reconnect. If it keeps happening, the tool is not refreshing sessions properly. |
| Media upload failed | Text-only posts publish; posts with an image or video fail. | Re-export as JPEG or PNG, shrink the file, keep to four images per post. |
| Over 300 characters | Long posts fail while short ones publish; often a cross-posted caption. | Cut to 300 graphemes; write a separate Bluesky variant of the caption. |
| Rate limited | Several posts fail around the same time after a bulk import or burst. | Space the queue out; retry after the limit window clears. |
| Handle or server change | The connection broke right after you changed your handle or moved PDS. | Reconnect with your current handle; the old app password usually still works. |
| Queue never fired | No error anywhere; the post still says scheduled after its time passed. | Check the post’s time zone, then the tool’s pending and failed lists. |
Bluesky’s exact limits and media specs can change over time. Confirm current numbers in Bluesky’s own documentation before relying on them.
How does a scheduled Bluesky post actually publish?
Bluesky runs on the AT Protocol and its API is open. When you connect Bluesky to a scheduler, you sign in with an app password, the tool gets a session, and at publish time it uploads any media, then creates the post. Bluesky accepts it or rejects it. Every failure in this guide happens at one of those steps: the sign-in, the upload, the post itself, or the queue that was supposed to trigger it all. That is good news for debugging, because each step fails in a recognizably different way.
Is your app password revoked or deleted?
Bluesky does not want you handing your real password to third-party tools. Instead you generate an app password: a separate credential made for one app, revocable at any time. That is the right security model, and it is also the number-one reason scheduled Bluesky posts stop publishing. Delete the app password while cleaning up your settings and the connection dies on the spot. A reset of your main account password can also invalidate existing app passwords.
- What it looks like: every Bluesky post fails at once, usually with an authentication error, while your other platforms keep publishing.
- How to diagnose: check the connected-account status in your scheduler. A “needs reconnect” flag confirms it.
- The fix: open Bluesky’s settings, find App Passwords under Privacy and Security, create a fresh one, and reconnect the account.
- The prevention: a scheduler that alerts you the moment an app password stops working, instead of letting the queue fail silently.
Did the session expire?
When a tool signs in with your app password, Bluesky issues session tokens, and those tokens expire. A well-built scheduler refreshes the session or signs in again automatically. A poorly built one holds a dead session, and every post fails until you reconnect by hand.
- What it looks like: posting worked for weeks, then stopped for no visible reason, and reconnecting fixes it instantly.
- The fix: reconnect once. If the same account needs reconnecting again and again, the tool is not refreshing sessions properly. That is a tool problem, not a Bluesky problem.
Did the image or video upload fail?
Media goes up first. Bluesky stores each file as a blob, and the post references it. If that upload fails because the file is too large or in a format Bluesky does not accept, the whole post fails, even though the text was fine.
- What it looks like: text-only posts publish, but posts with an image or video fail.
- How to diagnose: retry the same post without the file. If it goes through, the media is the problem.
- The fix: re-export as a standard format like JPEG or PNG, shrink the file, and keep it to four images per post. For video, size and length limits have changed over time, so confirm the current specs.
Is the post over 300 characters?
Bluesky caps posts at 300 characters, counted as graphemes, so an emoji counts as one character. Everything in the post text counts, including link text. The usual trigger is cross-posting: a caption written for LinkedIn or Mastodon, where limits are higher, sails past 300 and Bluesky rejects it at publish time.
- How to diagnose: long posts fail while short ones publish.
- The fix: cut the text to 300 graphemes or write a separate Bluesky variant. A good scheduler validates length per platform when you queue the post, not after it has already failed.
Are you hitting rate limits?
Bluesky limits how much an account can write to the API in a given window. Normal posting never gets near those limits, but a bulk import, a large burst of queued posts, or an aggressive retry loop can trip them.
- What it looks like: several posts fail around the same time after a burst, and posting works again later without you changing anything.
- The fix: space the queue out and let failed posts retry after the window clears. A scheduler with automatic retry handles this without you noticing.
Did you change your handle or move servers?
Your Bluesky handle can change, for example when you switch to a custom domain. Your underlying account ID does not. A scheduler that stored your handle instead of the permanent ID can lose track of the account the day you change it. Moving your account to a different server can break a connection the same way.
- What it looks like: the connection broke right after a handle change or a server move.
- The fix: reconnect the account with your current handle. The existing app password usually still works, and creating a fresh one takes seconds if it does not.
Did the queue ever fire?
Sometimes nothing failed on Bluesky at all, because nothing was ever attempted. The post sits in your scheduler marked scheduled long after its time passed. That is a queue problem: a stalled worker on the tool’s side, or a time-zone mismatch that means your 9:00 was the tool’s 16:00.
- How to diagnose: there is no error anywhere, and no publish attempt in the post’s history.
- The fix: check the post’s time zone first, then the tool’s pending and failed lists. If queues stall regularly, that is a reliability problem worth switching tools over.
How do you diagnose a failed Bluesky post in 60 seconds?
Run these in order and you will usually find the cause fast:
- Is the connection healthy? A reconnect flag means the app password or session died. This is the most likely culprit.
- Does a short text-only test post publish? If yes, the problem is in the content, not the connection.
- Is the text over 300 characters? Count graphemes, and remember link text counts.
- Does the media meet spec? File size, format, and no more than four images.
- Did several posts fail together? That points to a rate limit after a burst.
- Did you recently change your handle or server? Reconnect with the current handle.
- No error and still “scheduled”? The queue never fired. Check the time zone.
How do you confirm a Bluesky post actually published?
Every cause above is survivable. What turns it into lost reach is not knowing it happened. That is the problem PostDodo is built around. It posts to Bluesky directly, and a post is not counted as published until Bluesky hands back a live bsky.app link you can click.
- A live-link receipt. If Bluesky did not accept the post, there is no link, and you know instantly instead of days later.
- Auto-retry on transient errors. A momentary API hiccup or a rate-limit window retries on its own rather than dropping the post.
- App-password alerts. You get told the moment an app password stops working, so the most common cause never silently kills a queue.
Where we are honest about fit: PostDodo cannot publish a post over 300 characters, force a rejected file through, or override a rate limit. No tool can. What it does is surface the real reason the moment it happens, retry what is safe to retry, and prove what actually went live. It works the same way on all ten platforms it posts to: Bluesky, Mastodon, Facebook, Instagram, Threads, X, LinkedIn, TikTok, YouTube, and Pinterest, on one flat price with no per-seat or per-channel fees.
Frequently asked questions
Why is my Bluesky post not publishing?
Check the connection first: a revoked or deleted app password is the most common cause. Then check the post: a media upload Bluesky rejected, text over the 300-character limit, or a rate limit after a burst. A short text-only test post isolates the cause in about a minute.
What is a Bluesky app password?
A separate password you generate in Bluesky’s settings so a third-party app can post for you without knowing your main password. You can revoke it at any time, which is good for security but also means a scheduler connection can die without warning. If a connection breaks for no obvious reason, create a fresh app password and reconnect.
How long can a Bluesky post be?
300 characters, counted as graphemes, so an emoji counts as one character. Everything in the post text counts, including link text. Captions written for platforms with higher limits, like Mastodon or LinkedIn, are the usual reason a cross-posted Bluesky post gets rejected.
Why do my Bluesky image posts fail when text posts work?
The media upload failed. Bluesky stores each file as a blob before attaching it to the post, and an oversized file or unsupported format makes the whole post fail. Re-export as JPEG or PNG, shrink the file, and keep it to four images per post.
Do I need a new app password after changing my Bluesky handle?
Not usually. The app password stays tied to your account, but a scheduler that signs in with your old handle can no longer find you. Reconnect the account with your current handle, using the same app password or a fresh one.
How do I know a Bluesky post really published?
Do not trust a green check that only means a request was sent. A post is confirmed when you can open it at a live bsky.app link. PostDodo treats that link as the receipt: no live link, no publish, and you get an alert instead of finding out days later.
Tired of guessing whether a Bluesky post really went out? PostDodo posts to Bluesky directly, confirms every publish with a live bsky.app link, and alerts you the moment an app password dies. One flat price covers every platform and account you connect: see pricing.