Skip to main content
Version: v1.0

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

SeverityEffect
BLOCKThe property is not published. You must fix the data in your CRM for it to be published in the next cycle.
DRAFTPublished but in draft state (only visible internally, not on the public marketplace).
WARNPublished 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.

RulePass condition
Property typeproperty_type is one of the 7 canonical values and not residential.
Locationlocation.city and location.state are present and not empty.
PriceAt least one of price.rent_price or price.sale_price is greater than 0.
ModalityThe price combination corresponds to a valid modality (rent, sale, or both).
Minimum rent priceprice.rent_price in MXN ≥ 10,000.
Minimum sale priceprice.sale_price in MXN ≥ 100,000.
Minimum surface areaIf surface_m2 > 0, must be ≥ 3 m².
Max bedroomsIf bedrooms is sent, must be ≤ 20.
Empty postal codelocation.postal_code is not empty.
Postal code not foundlocation.postal_code is valid for Mexico.
Street numberlocation.ext_number ≤ 6 characters.
Street with coordinatesIf location.latitude and location.longitude are sent, location.street must be present.
Divisible areaindustrial.min_area_divisible_m2industrial.max_area_divisible_m2. Industrial types only.
Blocked agentagent.email and agent.phone are not blocked.
Max heightindustrial.max_height_m ≤ 30 meters. nave_industrial only.
Luminary specsIf industrial.luminaries > 0, industrial.luminary_specs must be present. Industrial types only.
Floor level numberIf office.floor_level = 6, office.floor_level_number must be present. oficina only.
Price/m² rangeretail.price_per_sqm_minretail.price_per_sqm_max. local only.
Land useterrain.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.

RulePass condition
PhotosAt least 1 URL in photos.
Coordinateslocation.latitude and location.longitude present and not null.
ContactAt 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 lowsurface_m2 above the statistical minimum for that property type.
Surface highsurface_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.

RuleCondition
AmenitiesAt 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.