How Content Uploader avoids duplicates, and when duplicates can still happen
The safeguards that stop an item being published twice (record IDs, the review, the last check, safe retries) and the few cases where two copies can still happen.
- 5 min read
- Updated October 13, 2026
Content Uploader is built so that publishing the same data twice gives you one item, not two. That is the reason it keeps records, compares before it writes, and sends every item with an ID that makes a repeat harmless. This page lists the safeguards, and then, honestly, the situations they cannot cover.
The safeguards#
| Safeguard | What it does |
|---|---|
| A record ID per item | Each row is matched to the item published earlier from the same ID, on the same site and content type, whichever file or configuration it came from (how rows are matched). A known ID is an update, never a second item. |
| The review before anything is written | The review says, per row, new, updated or unchanged and lists exactly what will change. A row that would create a second copy is visible as new before you press Publish. |
| A last check at Publish | If another file published the same item after yours was checked, the second one is refused (Another file was published after this one was checked…) and checked again, which then shows the item as updated or unchanged. (When publishing is refused.) |
| An operation ID on every item | Each item is sent once with its own operation ID. Your site remembers completed operations, so repeating one returns the first answer and writes nothing (retrying safely). |
| The connector's own records | The plugin or extension on your site keeps which record ID created which item. It reserves the item before the content is saved, so an interruption at the worst moment leaves at most one unfinished draft, which the retry completes. |
| One item at a time for each site | Items of a site are sent one after the other, so two requests can never create the same item at once. |
| Images by their content | An image is delivered once per site: the same picture again is found by its content and reused, not stored twice (reusing and replacing images). |
| Deleting is not part of publishing | Nothing is ever removed, so nothing can be "replaced" by deleting and re-creating. |
What this means in practice#
- Upload the same file twice: the second finds everything unchanged and has nothing to publish.
- Upload a file that overlaps the previous one: the rows that exist are updated, the new ones created.
- Press Retry safely on an item that "half worked": nothing is created twice.
- Reinstall the plugin or extension, or disconnect and reconnect a site: the connector's records are kept, so the next file still updates the items instead of creating them again (WordPress, Joomla).
- Two people upload at the same time: the second to publish is refused and re-checked.
- An item deleted on your site is created again under the same ID (The destination item was deleted, so it is created again.), not as a second copy next to a missing one.
When duplicates can still happen#
These are not faults; they follow from what "the same item" means. In each, the review shows the rows as new before you publish, so you can stop.
- You changed the record IDs. Different IDs are different items. Renumbering a column, switching to another column, or an export that creates new IDs makes every row new, and the old items stay (choosing the record ID).
- No ID column, and the title or slug changed. Without an ID, the title (or slug) is the identity, so a renamed article is a new one, and the old one stays. A slug column added later changes the identity of every row (without a record ID).
- The item already existed on your site. Content Uploader only recognises items it published. A post you wrote by hand, or published with another tool, is not matched: a row with the same title creates a second one next to it.
- The same content goes to two places. Each site and each content type has its own items. Publishing one file to WordPress Posts and to Pages creates both, as intended.
- The connector's records were deleted. If you drop the connector's tables on your site (a "clean slate"), it no longer knows which items it created, and the next import creates them again (uninstalling).
- Rows differ only by a typo in the title in a configuration without IDs: Harbour cafés and Harbor cafés are two items.
Finding and removing duplicates#
Content Uploader does not delete content, so duplicates are removed on your site:
- WordPress: Posts → All Posts, search for the title, and move the extra copy to the trash. Keep the one with the ID shown in the Sites page's Publishing results: that is the one Content Uploader updates.
- Joomla: Content → Articles, search for the title, trash the extra copy, and keep the one whose ID is in the results.
If you trash the copy that Content Uploader updates, the next file reports it as in the trash (skipped) until you restore it or delete it permanently, after which it is created again (skipped items).
How to be safe#
- Use a real ID column for anything you will repeat (choosing the record ID).
- Read the New count of every file you did not expect to add items.
- Try the first import on a staging copy of your site.
Was this article helpful?
Related articles
- Reviewing and publishingHow rows are matched to items on your siteHow Content Uploader decides that a row is new or the same item as before: by record ID, or by slug or title with the category as tiebreaker.
- Importing dataChoose the record IDThe record ID column lets next week's file update an item instead of creating it twice: what makes a good ID, how matching works without one, and what changing it does.
- Preparing your spreadsheetDuplicate IDs, titles and rowsWhat happens when two rows share an ID or a title in one file, the error each gets, why the first row wins, and why the same item next week is an update, not a duplicate.
- Reviewing and publishingRetry failed items safelyHow to find the items that failed to publish, fix the cause, and send them again with Retry safely without creating duplicates, and when to upload the file again instead.