Why social media schedulers post twice, and how to make sure yours doesn't
A post goes out twice when a scheduler retries after a network didn't answer. Here's why that happens, and the three checks that stop it.
By Indably, . 3 minute read. Read as Markdown
Most double posts aren't a glitch on the network's side. They happen when a scheduling tool sends a post, doesn't get an answer in time, and sends it again.
What actually happens
A scheduler publishes by sending a request to the network: “post this caption, with these photos, to this Page.” Most of the time the network answers within a second or two with the new post's ID. Sometimes it doesn't:
- the connection drops after the request has left,
- the network takes longer than the tool is willing to wait,
- or the network answers with a temporary server error.
In each of those cases the tool can't know whether the post was created. The request may have arrived and the post may be live, with only the answer lost on the way back.
A tool that treats every error as “try again” will send the post a second time. On a busy morning it can send it a third.
Why “just retry” is the default
Retrying is the right answer for most errors. When a network says “too many requests, slow down”, nothing was posted and trying again later is safe. The trouble is that many tools use one rule for every failure. None of the big networks (Meta, LinkedIn, X, TikTok, YouTube or Google) documents a way to say “this is the same post as before, don't create it twice”, so the tool has to work out what happened itself.
The three checks that prevent it
1. Sort failures into “nothing happened” and “don't know”. A refused connection, a rate limit or an error the network sends before it creates anything means nothing was posted, so retry with a growing delay. A timeout or a dropped connection after the request was sent means the outcome is unknown, so don't retry.
2. Look before you resend. When the outcome is unknown, check the account: list its recent posts and match the caption around the scheduled time. If it's there, mark it published. If it isn't, only then send it once more. Some networks give a better handle than a list. Threads publishes in two steps, so the first step's status says whether the post went out. YouTube uploads through a session that can be asked whether the upload finished.
3. Know when looking proves nothing. Some posts can't be seen from outside. TikTok only lists public posts to apps, so a private post won't show up whether it was made or not. LinkedIn doesn't let apps read a person's own posts. YouTube may not list a private upload straight away. On those, “not found” proves nothing. The honest answer is to ask a person to look, rather than guess.
A fourth: claim the post before sending it
Two copies of the same tool, or a background job that runs twice, can each pick up the same post at the same moment. A scheduler should mark a post as “being sent” in its database before it calls the network, in a way only one worker can win. If the process dies mid-send, the post is flagged “needs check” rather than picked up again.
How Indably does it
Indably follows all four rules on every network it posts to. Posts it can't account for are marked Needs check and shown to the brand's managers with what happened, so a person decides, and only once.
The same rule applies to money. When Indably launches an ad campaign, it creates everything paused, keeps each ID the moment it exists, and looks for what it may already have created before creating anything again. A launch that stops halfway carries on, rather than starting a second campaign that spends twice.