Turn the schedule on only after a second manual run updates existing WordPress IDs. Until then, every import is a test, not a publisher.
Why duplicates happen
| Cause | What you see |
|---|---|
| No stable key between the Airtable record and the WordPress object | A new post every run |
| Matching only on title | A title tweak creates a second post |
| Re-importing after the plugin’s map data was deleted | Orphans plus new clones |
| Two connections targeting the same table | Racing creates |
| CSV import and plugin import on the same rows | Parallel copies |
What safe re-import requires
- A persistent map of Airtable record ID to WordPress object ID, stored by the importer.
- Optional match keys: slug for posts, email or username for users, so existing content can be attached.
- Status on the row, mapped to
draftorpublish, so a later import updates the same object. - Unchanged rows skipped when mapped values match the last successful run, so Sync History can show zero updates after a clean re-run.
- One owner connection per destination entity.
- Logged runs so you can see created versus updated counts.
Integration for Airtable stores the record-to-object map and supports optional matching by slug, email, or username. Free schedules are daily and weekly. Pro adds every 15 minutes, every 30 minutes, hourly, every 6 hours, twice daily, daily, and weekly, plus delete-missing.
Recommended publish workflow
Editors set Status to draft or publish. pending, private, and future work too.
Rows you want updated must stay in the import. Filtering them out means the next run cannot touch them.
Don’t regenerate a random slug on each run.
Start with Dry run to preview creates and updates, then Import now. Read created versus updated in Sync History before any schedule exists. On Pro, use delete-missing on a full-table import; with a view or filter, keep Status on the row so later runs can still update those posts.
A clean second run produces zero unexpected new posts. Unchanged mapped values are skipped, so updated counts stay quiet until an Airtable cell actually changes.
If WordPress creates a new post ID, stop and fix matching before the schedule runs overnight.
WP-Cron realities
WordPress schedules often depend on traffic unless the host runs system cron.
- Low-traffic sites make schedules feel late.
- The fix is real cron hitting
wp-cron.php, or the host scheduler. - After a deploy, confirm the schedule still appears in the cron list.
Users and taxonomies
- Users: match on email. Map roles to subscriber, contributor, author, editor, or custom non-administrator roles your site already defines.
- Terms: keep slugs stable, and watch parent and child linked records.
When duplicates already exist
- Pause the schedule.
- Dedupe WordPress by hand. Keep the post that has the correct map and the traffic.
- Make Airtable slugs and emails unique.
- Re-link with match-on-slug or match-on-email if you can attach to existing objects.
- Run once, verify updates, then turn the schedule back on.
Related reading
Questions: support@ripplestep.com.
Run the connection twice before you schedule it
Confirm Sync History shows updates to existing IDs. Install Integration for Airtable if you need that map and a schedule without a Zap.
Install Integration for Airtable free