MLS Import Documentation Aug 6, 2026 · 5 min read

How daily reconciliation works

The daily pass compares your site against the full MLS feed and removes what should not be there. The rules and the safety guards.

B
Benjamin Levy
Contributor · MLSimport

Reconciliation is the daily pass that removes properties which should no longer be on your site. It is separate from the hourly sync: the sync updates listings, reconciliation deletes them, and neither does the other’s job.

It works by comparing the full list of listing identifiers currently in your MLS against every listing on your site, then applying the status rules from the import task that owns each one.

What one run does

  1. It stops unless at least one import task exists with a title. A site whose tasks were all left untitled never reconciles anything.
  2. It requests the full set of listing identifiers currently in your MLS.
  3. If that response is empty, it stops without deleting anything. An empty feed is treated as a failed request, never as an MLS with no listings.
  4. It compares the size of the feed against the number of listings on your site. If the feed carries less than 80 percent of what you hold locally, the run is abandoned and a line is written to the server error log saying so.
  5. It then walks every listing on the site in batches of 1,000 and decides, one at a time, whether to keep it.

The size check in step four is the protection against a truncated feed. Without it, a partial response would look exactly like a market where most listings had suddenly been withdrawn, and the pass would delete most of the site.

The decision, listing by listing

Each property is in one of two situations, and each has its own rule.

  1. Still in the MLS. It is kept when its status is one of the statuses in the owning task’s Select Status list. A listing the MLS has moved to a status you did not select is no longer part of what that task covers, so it is removed.
  2. Gone from the MLS. It is removed, unless its status appears in the owning task’s Protected Statuses list.

On top of those, one rule overrides everything: a property whose status cannot be read is always kept, and the reason is written to the delete log. An unreadable status means the read failed, not that the listing should go, and treating it as grounds for deletion is how mass removals happen.

Pro Tip

Reconciliation reads each task’s current settings every time it runs, so correcting Select Status or Protected Statuses takes effect on the next daily pass, for properties that task has already imported. You do not have to delete and re-import to change deletion behaviour.

What it never touches

  1. Drafts and trashed posts. They are excluded from the comparison entirely, so a task set to import as drafts produces properties that are never reconciled.
  2. Properties you created by hand, as long as they carry no MLS listing key. Reconciliation only considers listings that came from the feed.
  3. Anything, when the request fails. A timeout, an error, or an implausibly small feed all end the run without a single deletion.
  4. Anything, on the strength of a failed import. The pass compares against the MLS, not against what a particular run did, so an import that stopped half way cannot cause deletions.

What a deletion actually removes

A reconciled property is removed at database level, along with its MLS image references. It does not go to the trash and cannot be restored from there. If the listing is still in the MLS and the removal was caused by a status setting, correcting the setting and re-importing brings it back as a new property.

Every removal is recorded. Open Import History, filter the action to deleted, and the source column shows which run did it. The same daily job also prunes history rows older than 30 days.

Pro Tip

If listings vanished and you want to know why, read the history before changing settings. A deleted row with a reconciliation source and a status you did not select tells you the whole story, and guessing at the settings first usually makes it harder to reconstruct.

Frequently asked questions

How do I run reconciliation now instead of waiting for tomorrow?

There is no button for it on the settings screens. Triggering the daily event through WP-CLI or a cron plugin runs it immediately, which is what we do when investigating a report. Ask us if you want it run while we are looking at a site with you.

Why did nothing get deleted even though listings are clearly gone?

Work through it in order: the statuses may be protected, the daily event may not be firing at all, or the run may be aborting on the feed size check. The server error log carries a line with the feed and local counts for every run, which settles the last one.

Does reconciliation use one query for the whole MLS?

It requests the identifiers of every listing currently in your feed in one pass, then works locally from that list. It does not make a request per property, which is why it can compare tens of thousands of listings without hitting your MLS repeatedly.

My site has more listings than the MLS reports. Will reconciliation fix it?

It removes the extras that are genuinely gone from the feed and not protected. Extras that came from a second task with overlapping filters are still in the feed and stay, because they are legitimately there. That case is a filter problem rather than a reconciliation problem.

  1. Protected statuses
  2. Closed and off market listings
  3. How the hourly auto update works
  4. Import History and the activity log

If properties disappeared and the history does not explain it, send us the MLS numbers and we will trace them.

B
About the author
Benjamin Levy
Writes about MLS feeds, IDX compliance, and running real-estate websites on WordPress at scale.
All posts by Benjamin