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.
Activate the module
Make sure your Elite licence is valid. Then:
- Go to Elite → Modules in WordPress admin
- Find Importer / Migrator in the module list
- 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).
- In your old Houzez admin, export properties to CSV. Houzez → Tools → Export. Save the CSV file to your computer.
- In Prop Nexia, go to Elite → Importer → New import → choose Houzez template
- Upload the CSV. The mapping UI shows you the auto-mapped fields based on the template.
- Review the mapping. The standard fields are mapped automatically. Adjust any custom Houzez fields that you added on the old site.
- Click Dry run. Elite generates a preview report.
- Review the preview. If happy, click Run import.
- 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)
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.
- Elite → Importer → New import → choose Custom CSV
- Upload the CSV. The mapping UI lists each column from your file.
- For each column, pick a Prop Nexia destination field — or ignore if you don’t need it.
- Save the mapping. You can reuse it for future imports from the same source.
- 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 titlelisting_type—sale,rent,off-plan, orshort-letproperty_type—apartment,villa,townhouse,office,landcity— city name (will be normalised to a city slug)price— numeric, no symbols or commascurrency— 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
| Column | Format / example |
|---|---|
title | required — “Marina View Apartment” |
description | HTML allowed. Use <p> for paragraphs. |
listing_type | required — sale / rent / off-plan / short-let |
property_type | required — apartment / villa / townhouse / office / land |
price | required — numeric — 2400000 |
currency | required — AED / USD / EUR |
beds | Integer — 2, or studio for studios |
baths | Integer — 2 |
area | Numeric — 1240 |
area_unit | sqft (default) or sqm |
city | required — Dubai |
community | Dubai Marina |
address | Full street address (used for geocoding) |
lat / lng | Decimal coordinates. If included, skips auto-geocoding. |
dld_permit | UAE listings — DLD permit number |
trakheesi | UAE rentals — Trakheesi reference |
reference | Your internal listing reference (used to match for updates) |
status | publish (default), draft, or pending |
featured | 1 or 0 |
agent_email | Email of the assigned agent. Must exist in Prop Nexia. |
images | Pipe-separated URLs — https://old.com/1.jpg|https://old.com/2.jpg |
features | Comma-separated — Sea view, Gym, Pool, Parking |
Sample CSV row
properties.csvtitle,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:
- Elite → Importer → Activity log
- Find the import you want to undo
- Click Rollback
- 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.
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
| Setting | Default |
|---|---|
| Max image size per file | 10 MB |
| Max images per property | 100 |
| Fetch timeout per image | 30 seconds |
| Concurrent fetches | 3 |
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_timein 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.
- Open Elite → Importer → Saved mappings
- Edit the mapping for your source format
- Fix the wrong field mappings
- Run a dry-run to confirm
- 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:
- Run a small dry-run (10 properties) with the standard template
- Open the saved mapping
- 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)
- Save and run the real import
