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 causeHow to tellFix
Revoked or deleted app passwordEvery 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 sessionPosts worked for weeks, then stopped; reconnecting fixes it instantly.Reconnect. If it keeps happening, the tool is not refreshing sessions properly.
Media upload failedText-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 charactersLong posts fail while short ones publish; often a cross-posted caption.Cut to 300 graphemes; write a separate Bluesky variant of the caption.
Rate limitedSeveral 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 changeThe 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 firedNo 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.

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.

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.

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.

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.

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.

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 do you diagnose a failed Bluesky post in 60 seconds?

Run these in order and you will usually find the cause fast:

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.

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.