Overview
Operations Dashboard
Real-time data platform status. Last refreshed: —
Total Listings
—
in database
View dataset →Added Today
—
new records
Added This Week
—
new records
Cities Covered
—
active markets
Countries
—
covered
Active Sources
1
data sources
Price Records
—
historical entries
Last Ingestion
—
no run recorded
Data Health Summary
Missing District
—
records
Missing Price
—
records
Missing Size
—
records
Duplicates Detected
—
estimated
Listings > 90 Days
—
records
Quick Actions
Common data operations
Platform Status
Supabase · Ironwood Intelligence
Checking connection...
Supabase projectujhqkirhfm...
RegionWest EU (Paris)
EnvironmentSandbox / Test
Recent Activity
—
Loading activity log...
Data Quality
Data Health Monitor
Automated scan of all datasets for missing fields, duplicates, stale data, and invalid values.
Issue Summary
Last scan: Not yet run
Missing District
Listings with no district / submarket value
—
Missing Price
Listings with no price or price_per_sqm
—
Missing Size
Listings with no size_sqm value
—
Missing Source URL
Listings with no source URL for verification
—
Duplicate Records
Estimated duplicates based on city + price + size matching
—
Listings > 90 Days Old
Listings that may be stale and should be re-verified
—
Invalid Property Type
Values not matching approved asset class taxonomy
—
Records in Review Queue
Records flagged for manual verification
3
Issue Records
Select an issue above to view records
Select an issue type to load records
Data Pipeline
Source Registry
All active data sources. Each source must be registered before data is ingested. Sources are immutable audit references.
Active Sources
Source
Listings
Last Ingestion
Success
Mubawab.mamubawab.ma · Listing Portal · Morocco · Weekly
—
listings
—
last run
98%
success
Data Lineage Schema
Required metadata fields on every raw record
| Field | Type | Description | Required |
|---|---|---|---|
| created_at | timestamptz | Record creation time (auto) | Yes |
| updated_at | timestamptz | Last modification time (auto) | Yes |
| source_type | text | Classification: Listings-derived / Observed / Modeled | Yes |
| source_url | text | Original URL of listing or document | Recommended |
| verification_status | text | Verified / Unverified / Needs Review | Yes |
| created_by | uuid | Admin user who created/uploaded record | Yes |
Data Pipeline
Ingestion Job Monitor
Track scraper and data ingestion pipeline execution. All job history is append-only.
Active & Recent Jobs
JobStatusLast RunRecordsErrorsAction
Mubawab Morocco Scraperlistings_raw · Automated
Success
—
—
0
Admin Upload (Excel)properties · Manual
Idle
—
—
—
Price Records Uploadprice_records · Manual
Idle
—
—
—
Ingestion Architecture
Data flow: Source → Raw Layer → Derived Layer → Visualization
Source
Mubawab / Excel
Listings portals
→
Raw Layer
listings_raw
Append-only · Immutable
→
Derived Layer
Analytics Tables
Medians · Trends · Scores
→
Viz Layer
Dashboard
Read-only queries
Data Pipeline
Drive Sync
Automated sync from Google Drive to Supabase. One file per country. Each sync replaces only that country's rows — all other countries are untouched.
How Country-Safe Replace Works
Drive Folder
Morocco.xlsx
Multiple cities inside
→
Step 1: Delete
WHERE country = 'Morocco'
Nigeria, Kenya untouched ✓
→
Step 2: Insert
All Morocco rows
All cities in one file
→
Result
Fresh Morocco data
All other countries safe
File naming rule: Your file must be named after the country (e.g.
Morocco.xlsx, Nigeria.xlsx). The script reads the filename to know which country's rows to replace. Each file can contain as many cities as you want — Casablanca, Marrakech, Rabat will all be in Morocco.xlsx.
Country Sync Registry
Each country is an independent sync unit
Country
Cities
Listings
Last Sync
Status
Action
🇲🇦 Morocco
Morocco.xlsx · Auto-sync active
—
—
—
Active
🇳🇬 Nigeria
Nigeria.xlsx · Not yet configured
—
—
—
Pending
🇸🇳 Senegal
Senegal.xlsx · Not yet configured
—
—
—
Pending
Setup Instructions
One-time setup · ~10 minutes
1
Go to script.google.com
Create a new project. Delete the placeholder code. Paste the contents of
ironwood_drive_sync.gs (provided separately).2
Fill in SUPABASE_SERVICE_KEY and FOLDER_ID
Service Role Key: Supabase → Settings → API → service_role → Reveal. Folder ID: the long string in your Drive folder URL.
3
Enable Drive API
In Apps Script editor: left sidebar → + next to Services → Google Drive API → Add.
4
Run testConnection, then syncAllCountries
Select the function from the dropdown → click Run → check Logs. Once working, set a nightly Time-driven trigger on syncAllCountries.
Data Pipeline
Upload Manager
Upload a country sheet manually. The Country Replace mode deletes only that country's rows and reinserts — all other countries stay intact.
Listings / Properties
Price Records
Market Averages
Required columns
One file per country. Each file contains all cities for that country. Country column must be consistent throughout the file.
Upload Mode
✓ Country Replace: the country value will be auto-detected from your file's country column when you load it. Only rows matching that country will be deleted before re-insert.
Drop country sheet here
e.g. Morocco.xlsx or Nigeria.xlsx · must have a country column
Upload Validation Preview
Rows Detected
—
Valid Rows
—
Cities Found
—
Missing Required
—
Data Preview
Required columns
Upload Mode
Drop country price sheet here
or click to browse
Upload Validation Preview
Rows Detected
—
Valid Rows
—
Cities Found
—
Missing Required
—
Data Preview
Required columns
Drop country averages sheet here
or click to browse
Data Preview
Data Pipeline
Download Data
Export datasets from the raw data layer. All exports are read-only and append timestamped filenames.
Properties / Listings
All listing records including city, district, asset class, price, metadata.
Price Records
Historical price records linked to properties over time.
Market Averages
Aggregated city / district market averages by period.
Full Database Export
All tables · Single Excel file · Multiple sheets
Data Quality
Dataset Explorer
Browse, filter, and export records from any raw data table. Inline editing is available for verified records only.
Listings
Price Records
Market Averages
| Select a table to begin browsing |
—
Page 1
Data Quality
Data Validation
Pre-ingestion and post-ingestion validation rules. Every uploaded record must pass validation before being promoted to verified status.
Validation Rules — listings_raw
Applied on every upload
| Rule | Field | Type | Action on Fail | Status |
|---|---|---|---|---|
| City is required | city | Required field | Reject row | Active |
| Country is required | country | Required field | Reject row | Active |
| Asset class must be valid | asset_class | Enum validation | Flag for review | Active |
| Price must be positive | price / price_per_sqm | Numeric validation | Flag for review | Active |
| Size must be positive | size_sqm | Numeric validation | Flag for review | Active |
| Source URL format | source_url | URL format check | Warn | Active |
| Date format valid | listing_date | Date validation | Warn | Active |
| Duplicate detection | city + price + size_sqm | Dedup check | Flag as duplicate | Beta |
Asset Class Taxonomy
Approved values for property_type / asset_class field
Apartments
Villas / Luxury homes
Houses
Offices
Retail
Land
Riads
Industrial
Farms
Hospitality
Data Quality
Verification Queue
Records pending manual review. Verify or reject each record before it is marked as confirmed data. Verified records are used in analytics.
Casablanca · Office · DH 142/m²/month Needs Review
Field flags: None
Validation: Passed
Duplicate check: No match
Marrakech · Villa · DH 4,800,000 Needs Review
Field flags: None
Validation: Passed
Duplicate check: 1 possible match
Rabat · Apartment · DH 11,200/m² Needs Review
Field flags: Missing source_url
Validation: 1 warning
Duplicate check: No match
Operations
Activity Log
Complete audit trail of all platform actions. Append-only. Cannot be modified or deleted.
Append-only · Read-only
Operations
Batch Operations
Large-scale corrections and data operations. All batch actions require confirmation and are logged to the activity log.
Update District
Assign district to records missing it
This will update all matching records. Action is logged and reversible by re-uploading.
Update Asset Class
Standardise property type values
Delete Duplicates
Remove estimated duplicate records
Duplicates are detected by matching on: city + price_per_sqm + size_sqm + property_type. The most recent record is kept.
Estimated duplicates: —
Destructive action. Cannot be undone. Export first.
Bulk Verification
Set verification status in bulk
Operations
Manual Entry
Add a single verified record directly. Used for bespoke data points not captured by automated ingestion.
Property
Price Record
Market Average
Admin
Admin Users
Manage platform access. Roles control which sections and operations each user can access.
Create New Admin
Role Permissions
| Role | Datasets | Upload | Edit | Admin |
|---|---|---|---|---|
| Admin | ✓ All | ✓ | ✓ | ✓ |
| Data Operator | ✓ All | ✓ | ✓ | ✗ |
| Viewer | ✓ Read | ✗ | ✗ | ✗ |
Current Users
| Role | Created | Last Login | Status | |
|---|---|---|---|---|
| Loading... | ||||
Admin
API Management
Manage API keys for developer and institutional access to the Ironwood Intelligence data platform.
API Keys
Default
iw_••••••••••••••••••••••••••••••••
Active
API Configuration
Rate Limiting
Maximum requests per day per API key
Endpoint Base URL
Base URL for API access
https://www.ironwoodintelligence.com/api/v1
Require Authentication
All API requests must include a valid API key
Enabled
Admin
Settings
Admin panel configuration. Supabase credentials are stored in localStorage.
Supabase Connection
Project URL
Your Supabase project URL
Anon Key
Supabase anon public key (eyJhbG...)
Platform Settings
Stale Listing Threshold
Days after which a listing is considered stale
Demo Data Warning
Show warning banner when demo data is present
Enabled
Verification Required
Require manual verification before records used in analytics
Enabled
Activity Logging
Log all admin actions to the activity log
Always On