QA Rules
Quality rules we apply to each property before publishing it. If a rule fails, the property is blocked, published as draft, or simply logged with a warning.
Severities
| Severity | Effect |
|---|---|
| BLOCK | The property is not published. You must fix the data in your CRM for it to be published in the next cycle. |
| DRAFT | Published but in draft state (only visible internally, not on the public marketplace). |
| WARN | Published normally. Only a warning is logged. |
How it's decided
When a property fails multiple rules, the highest severity determines the outcome. All failing rules are reported in the webhook, not just the first one.
BLOCK rules
These rules prevent publication. The property won't appear on Spot2 until fixed.
| Rule | Pass condition |
|---|---|
| Property type | property_type is one of the 7 canonical values and not residential. |
| Location | location.city and location.state are present and not empty. |
| Price | At least one of price.rent_price or price.sale_price is greater than 0. |
| Modality | The price combination corresponds to a valid modality (rent, sale, or both). |
| Minimum rent price | price.rent_price in MXN ≥ 10,000. |
| Minimum sale price | price.sale_price in MXN ≥ 100,000. |
| Minimum surface area | If surface_m2 > 0, must be ≥ 3 m². |
| Max bedrooms | If bedrooms is sent, must be ≤ 20. |
| Empty postal code | location.postal_code is not empty. |
| Postal code not found | location.postal_code is valid for Mexico. |
| Street number | location.ext_number ≤ 6 characters. |
| Street with coordinates | If location.latitude and location.longitude are sent, location.street must be present. |
| Divisible area | industrial.min_area_divisible_m2 ≤ industrial.max_area_divisible_m2. Industrial types only. |
| Blocked agent | agent.email and agent.phone are not blocked. |
| Max height | industrial.max_height_m ≤ 30 meters. nave_industrial only. |
| Luminary specs | If industrial.luminaries > 0, industrial.luminary_specs must be present. Industrial types only. |
| Floor level number | If office.floor_level = 6, office.floor_level_number must be present. oficina only. |
| Price/m² range | retail.price_per_sqm_min ≤ retail.price_per_sqm_max. local only. |
| Land use | terrain.land_use must be present. terreno only. |
DRAFT rules
These rules don't block publication, but the property remains in draft state until data is completed.
| Rule | Pass condition |
|---|---|
| Photos | At least 1 URL in photos. |
| Coordinates | location.latitude and location.longitude present and not null. |
| Contact | At least one of agent.email or agent.phone present. |
| Price/m² (low) | Price/m² above the statistical minimum for that property type and modality. |
| Price/m² (high) | Price/m² below the statistical maximum for that property type and modality. |
| Surface low | surface_m2 above the statistical minimum for that property type. |
| Surface high | surface_m2 below the statistical maximum for that property type. |
Statistical thresholds
Price/m² and surface area ranges are calibrated by property type (office, retail, industrial, land), modality (rent or sale), and sector (individual or complex). They are adjusted periodically with market data.
Reference examples (subject to adjustment):
- Office for rent: $80 to $3,000 MXN/m².
- Industrial for sale: $5,000 to $40,000 MXN/m².
- Individual office: 15 to 10,000 m².
- Individual land: 200 to 1,000,000 m².
WARN rules
Don't affect publication. Only logged as a warning.
| Rule | Condition |
|---|---|
| Amenities | At least 1 value in amenities. |
Permanent rejection
If a property fails BLOCK rules for 5 consecutive cycles without data changes, we stop trying to publish it. The property is still revalidated in each cycle: if you fix the data in your CRM and updated_at changes, it's reevaluated and published automatically.
Messages in the webhook
The messages shown in the webhook match the descriptions in the tables above.