Elite module 06

Importer / Migrator setup.

Migrate from Houzez, Estatik or custom CSV/XML. Pre-built field templates, dry-run preview, rollback. Image sideloading is SSRF-hardened.

What the Importer does

The Importer brings properties, projects, developers and agents into Prop Nexia from another system. Pre-built field-map templates handle Houzez and Estatik. Generic CSV and XML imports work for any other source.

Every import goes through a dry-run preview before any record is written. You see exactly what will be created, what will be updated, and what will be skipped — before anything is committed. If something looks wrong, you can roll back within 30 days.

Before you start. Take a database backup. The Importer is safe and reversible, but a fresh backup is the cleanest insurance for any large migration. Your hosting panel or a plugin like UpdraftPlus will do it in 5 minutes.

Activate the module

Make sure your Elite licence is valid. Then:

  1. Go to Elite → Modules in WordPress admin
  2. Find Importer / Migrator in the module list
  3. Click Activate

A new menu appears: Elite → Importer. This is where you start imports, view activity logs, and manage saved mappings.

Migrate from Houzez

Houzez is one of the most common themes Dubai agencies migrate away from. The Houzez template handles all the standard fields plus the UAE-specific ones (DLD permit, Trakheesi, agent BRN).

  1. In your old Houzez admin, export properties to CSV. Houzez → Tools → Export. Save the CSV file to your computer.
  2. In Prop Nexia, go to Elite → Importer → New import → choose Houzez template
  3. Upload the CSV. The mapping UI shows you the auto-mapped fields based on the template.
  4. Review the mapping. The standard fields are mapped automatically. Adjust any custom Houzez fields that you added on the old site.
  5. Click Dry run. Elite generates a preview report.
  6. Review the preview. If happy, click Run import.
  7. Images are sideloaded in the background. Track progress in Elite → Importer → Activity.

An example preview report looks like this:

Dry-run summary for "houzez-migration-2026-05.csv"

  ✓ 248 new properties would be created
  ✓ 12 properties would be updated (matched by listing reference)
  ⚠ 12 listings have missing DLD permit fields (will import as drafts)
  ⚠ 3 listings have unreachable image URLs (will skip those images)
  ✗ 0 errors blocking import

Estimated import time:     8 minutes
Estimated image sideload:  ~45 minutes (1,247 images, ~3.2GB)
Tip. For a first try, dry-run a small CSV first — just 20–50 properties from your old site. Confirm everything looks right, then run the full export. Saves time if there’s a custom-field surprise.

Migrate from Estatik

Same workflow as Houzez. Pick the Estatik template at step 2 instead.

Estatik stores some fields differently from Houzez. Notable differences the template handles automatically:

  • Property status — Estatik uses numeric IDs, Prop Nexia uses slugs (active, sold, rented). Template converts both ways.
  • Custom amenities — Estatik stores them as a single comma-separated string. Template splits them into proper taxonomy terms.
  • Agent assignment — Estatik uses WordPress user IDs, Prop Nexia uses agent post IDs. Template creates matching agent profiles where needed.

Import from generic CSV

If your data is in a custom format (a spreadsheet from your old CRM, an export from a non-WordPress system), use the Custom CSV import.

  1. Elite → Importer → New import → choose Custom CSV
  2. Upload the CSV. The mapping UI lists each column from your file.
  3. For each column, pick a Prop Nexia destination field — or ignore if you don’t need it.
  4. Save the mapping. You can reuse it for future imports from the same source.
  5. Click Dry run, review the preview, then Run import.

Required fields

A property won’t import without these. The dry-run flags any row missing them.

  • title — the property title
  • listing_typesale, rent, off-plan, or short-let
  • property_typeapartment, villa, townhouse, office, land
  • city — city name (will be normalised to a city slug)
  • price — numeric, no symbols or commas
  • currency — three-letter code (AED, USD, EUR)

CSV column format

The Custom CSV import accepts any column names — you map them in the UI. But if you set up your CSV with the recommended column names below, mapping is automatic.

Property columns

ColumnFormat / example
titlerequired — “Marina View Apartment”
descriptionHTML allowed. Use <p> for paragraphs.
listing_typerequiredsale / rent / off-plan / short-let
property_typerequiredapartment / villa / townhouse / office / land
pricerequired — numeric — 2400000
currencyrequiredAED / USD / EUR
bedsInteger — 2, or studio for studios
bathsInteger — 2
areaNumeric — 1240
area_unitsqft (default) or sqm
cityrequiredDubai
communityDubai Marina
addressFull street address (used for geocoding)
lat / lngDecimal coordinates. If included, skips auto-geocoding.
dld_permitUAE listings — DLD permit number
trakheesiUAE rentals — Trakheesi reference
referenceYour internal listing reference (used to match for updates)
statuspublish (default), draft, or pending
featured1 or 0
agent_emailEmail of the assigned agent. Must exist in Prop Nexia.
imagesPipe-separated URLs — https://old.com/1.jpg|https://old.com/2.jpg
featuresComma-separated — Sea view, Gym, Pool, Parking

Sample CSV row

properties.csv
title,listing_type,property_type,price,currency,beds,baths,area,city,community,dld_permit,images
"Marina View Apartment",sale,apartment,2400000,AED,2,2,1240,Dubai,"Dubai Marina","123456789","https://old.com/p1-a.jpg|https://old.com/p1-b.jpg"
"Downtown Penthouse",sale,apartment,8500000,AED,4,5,3200,Dubai,"Downtown","987654321","https://old.com/p2-a.jpg"

Dry-run preview

Every import goes through a server-enforced dry-run first. You cannot skip this step.

The dry-run report shows:

  • How many new records would be created
  • How many existing records would be updated (matched by listing reference)
  • How many records would be skipped, with the reason for each
  • Validation warnings — recommended fields that are missing but won’t block import
  • Validation errors — required fields missing, would block import
  • Estimated import time
  • Estimated image-sideload time and total disk usage

Review carefully before clicking Run import. If anything is off, fix the CSV (or the mapping) and re-run the dry-run.

Rollback

Every import is reversible for 30 days. To roll back:

  1. Elite → Importer → Activity log
  2. Find the import you want to undo
  3. Click Rollback
  4. Confirm. Every imported record is removed in reverse order.

Rollback includes the images that were sideloaded — they’re removed from the WordPress media library too. Records that were updated (not created) revert to their previous state.

After 30 days, rollback metadata is removed to save disk space. The imported records remain — they’d just need to be deleted manually if you wanted to remove them. Set a reminder if you need to roll back a large import.

Image handling

If your source data includes remote image URLs, the Importer fetches each image and uploads it into your WordPress media library. Your listings end up self-hosted — no dependency on the old site’s media server.

Security

Image fetching is SSRF-hardened. Private IPs (10.x, 192.168.x), link-local (169.254.x), and loopback (127.x) addresses are blocked. You cannot trick the Importer into hitting an internal service.

Size limits

SettingDefault
Max image size per file10 MB
Max images per property100
Fetch timeout per image30 seconds
Concurrent fetches3

Configurable in Elite → Importer → Settings. Images over the size limit are logged and skipped — the listing still imports with its other images.

Image formats accepted

  • .jpg / .jpeg — most common
  • .png — for transparent images and floor plans
  • .webp — modern format, smaller files
  • .gif — accepted but rarely seen in property listings

Other formats (BMP, TIFF, HEIC) are skipped. Convert them to JPG before import.

Troubleshooting

Import times out on large CSVs

For very large imports (10,000+ records), two options:

  • Increase PHP max_execution_time in your hosting panel — temporarily, just for the import
  • Run the import in batches. Elite → Importer → Settings → set the batch size to 500. The import resumes automatically after each batch.

Images fail to sideload

Check the activity log. Common causes:

  • Source server blocks scrapers — the old site’s server is rejecting our user agent. Contact the old host, or download images locally first then re-upload via FTP.
  • Image URLs require authentication — the URL needs cookies or a session to work. The Importer can’t sign in. Make images publicly readable first.
  • Cloudflare bot protection — Cloudflare in front of the old site is blocking the Importer. Whitelist your new site’s IP in Cloudflare temporarily.

Fields map to the wrong destination

This is a mapping problem, not an import problem.

  1. Open Elite → Importer → Saved mappings
  2. Edit the mapping for your source format
  3. Fix the wrong field mappings
  4. Run a dry-run to confirm
  5. Run the real import

Updates aren’t applying — records are being duplicated

The Importer uses the reference column to match existing records for updates. If your CSV doesn’t include a unique reference, the Importer treats every row as new and creates duplicates.

Add a reference column with a unique identifier for each property (your old listing ID is perfect). Set the mapping to “match on reference” — updates will then work correctly.

Houzez/Estatik custom fields aren’t migrating

The templates handle the standard Houzez and Estatik fields. If you added custom fields on the old site, you need to add them to the mapping manually:

  1. Run a small dry-run (10 properties) with the standard template
  2. Open the saved mapping
  3. For each custom column in your CSV, add a mapping to a Prop Nexia destination field (or create a new custom field in Prop Nexia first)
  4. Save and run the real import