BMW Stolo Source
Status (2026-07-03): All mappings below are implemented in
sources/stolo.py(_StoloVehicleEntity). BQ-backfill extractor not yet built — the "BQ column" column is the target schema for it.
Stolo is the primary EU inventory feed. EU markets use Stolo (UPPER_SNAKE_CASE enums). BQ US InvSearch uses its own coding (single-letter codes, Title Case strings, short numeric codes). Natural-language text fields (bodystyle_name, modeldescription) are consistent across systems; coded fields are not.
BmwInventoryEntity field mapping
Columns: BQ (source of truth) | Entity field | Stolo path | ZA path | BQ backfill | ║ | Stolo 1 (1-series WBA31GE0507T72918) | BQ ✓ 1 | Stolo 2 (X5 WBA21EU0609307369) | BQ ✓ 2
Legend: ? = path needs verification · ⚠️ = known issue · ✓ = direct mapping · [first locale] = localized object, extract first value · ✅ N = BQ check passed, N matching rows · ❌ fmt = concept maps but value format differs · ❌ EU = EU-only value (model not sold in US) · — = not checked / not applicable
Manual check procedure: For each row, 3 sample values were pulled from each source (Stolo fixture, BQ public_invsearchvehicles, ZA fixture) and compared by eye. The check validates that the mapped path yields values of the correct concept and format — not that the exact value appears across sources (EU and US cars differ). A ✓ in the manual check column means the mapping was confirmed by a human reviewer.
Existing entity fields
| BQ column | Entity field | Stolo path | ZA path | BQ backfill | ║ | Stolo 1 | BQ ✓ 1 | Stolo 2 | BQ ✓ 2 | manual check | code note |
|---|---|---|---|---|---|---|---|---|---|---|---|
| vin | vin | vehicle.ordering.productionData.vin17 | vin | ✓ | ║ | WBA31GE0507T72918 | ❌ EU | WBA21EU0609307369 | ❌ EU | ✓ | |
| modelcode | manufacturer_code | vehicle.vehicleSpecification.modelAndOption.model.agModelCode | manufacturerCode | ✓ | ║ | 31GE | ❌ EU | 21EU | ❌ EU | ✓ | |
| modeldescription | model_description | vehicle.vehicleSpecification.modelAndOption.model.modelName | title | ✓ | ║ | 116 | ❌ EU | X5 xDrive40i | ✅ 15,155 | ✓ | |
| modelrange | model_range | vehicle.vehicleSpecification.modelAndOption.marketingModelRange | — | ✓ | ║ | 1_F40 | ❌ EU | X5_G05 | ❌ fmt (BQ: G05, 551k) | ✓ | different format (Stolo: X5_G05, BQ: G05) |
| modelyear | model_year | — | modelYear | ✓ | ║ | — | — | — | — | ✓ | Stolo: no model year field — will be null for Stolo-sourced records |
| bodystyle_code | body_type | vehicle.vehicleSpecification.modelAndOption.bodyType | bodyType | ✓ | ║ | SPORTS_HATCH | ❌ EU | SPORT_ACTIVITY_VEHICLE | ❌ fmt (BQ: 05, 1.79M) | ✓ | different format (Stolo: named enum e.g. SPORT_ACTIVITY_VEHICLE, BQ: numeric code e.g. 05; ZA: 2-letter abbreviation e.g. SH) |
| fueltype | fuel_type | vehicle.vehicleSpecification.modelAndOption.baseFuelType | fuelType | ✓ | ║ | GASOLINE | ❌ fmt (BQ: O, 2.93M) | GASOLINE | ❌ fmt (BQ: O, 2.93M) | ✓ | different format (Stolo: GASOLINE, BQ: O; ZA: Petrol) |
| enginedrivetype_name | drive_type | vehicle.vehicleSpecification.modelAndOption.marketingDriveType | driveTrain | ✓ | ║ | SDRIVE | ❌ EU | XDRIVE | ❌ fmt (BQ: xDrive, 2.36M) | ✓ | different format (Stolo: XDRIVE, BQ: xDrive; BQ also combines drivetrain+marketing e.g. RWD/sDrive; ZA: Rear Wheel Drive) |
| exteriorgenericcolor | exterior_color | vehicle.vehicleSpecification.modelAndOption.color.clusterFine | exteriorColour | ✓ | ║ | WHITE | ❌ fmt (BQ: White, 350k) | BLACK | ❌ fmt (BQ: Black, 350k) | ✓ | different format (Stolo: WHITE, BQ: White); ZA exteriorColour gives specific paint name (Skyscraper Grey metallic), not a generic cluster — no better ZA field exists |
| interiorgenericcolor | interior_color | vehicle.vehicleSpecification.modelAndOption.upholsteryColor.upholsteryColorCluster | interiorColour | ✓ | ║ | BLACK | ❌ fmt (BQ: Black, 519k) | BLACK | ❌ fmt (BQ: Black, 519k) | ✓ | different format (Stolo: BLACK, BQ: Black); ZA interiorColour gives specific upholstery name (Veganza perforated Black), not a generic cluster — no better ZA field exists |
| interiorupholsterytype | interior_code | vehicle.vehicleSpecification.modelAndOption.upholsteryType | interiorCode | ✓ | ║ | LEATHERETTE | ❌ fmt (BQ: Leatherette, 314k) | LEATHERETTE | ❌ fmt (BQ: Leatherette, 314k) | ✓ | different format (Stolo: LEATHERETTE, BQ: Leatherette; ZA: option code e.g. KUSW) |
| totalmsrp | price | vehicle.price.grossListPrice | cashPaymentOption.totalCost | ✓ | ║ | 40610.02 | — | 119350.01 | — | ✓ | |
| mileage | mileage | — | mileage | ✓ | ║ | — | — | — | — | ✓ | Stolo: no mileage field — will be null for Stolo-sourced records |
| code (options) | feature_refs[].code | vehicle.vehicleSpecification.modelAndOption.equipments (keys) | — | ✓ | ║ | S05DM, ... | — | — | — | ✓ |
New fields to add
| BQ column | Entity field | Stolo path | ZA path | BQ backfill | ║ | Stolo 1 | BQ ✓ 1 | Stolo 2 | BQ ✓ 2 | manual check | code note |
|---|---|---|---|---|---|---|---|---|---|---|---|
| productionnumber | new | vehicle.ordering.productionData.orderNumber | — | ✓ | ║ | 2328330 | ❌ EU | 2412362 | ❌ EU | ✓ | |
| series_code | new | vehicle.vehicleSpecification.modelAndOption.series.name | — | ✓ | ║ | 1 | ❌ EU | X | ✅ 639,038 | ✓ | |
| series_name | new | vehicle.vehicleSpecification.modelAndOption.retailSeries.name | — | ✓ | ║ | 1 | ❌ EU | X | ❌ fmt (BQ: X5, 639k) | ✓ | different format (Stolo: series letter e.g. X, BQ: full name e.g. X5) |
| bodystyle_name | new | vehicle.vehicleSpecification.modelAndOption.bodyTypeDescription [first locale] | — | ✓ | ║ | Hatch Back | ❌ EU | Sports Activity Vehicle | ✅ 1,792,477 | ✓ | |
| basemsrp | new | vehicle.price.grossModelPrice | — | ✓ | ║ | 32900 | — | 94600 | — | ✓ | |
| create_date | new | vehicle.ordering.orderData.orderEntryDate | — | ✓ | ║ | 2025-03-06 | — | 2025-10-13 | — | ✓ | different format (Stolo: date 2025-03-06, BQ: datetime 2023-06-01 19:27:04) |
| actualproductiondate | new | vehicle.ordering.productionData.productionDate | — | ✓ | ║ | 2025-06-24 | — | 2025-12-05 | — | ✓ | |
| productionweek | new | vehicle.ordering.productionData.confirmedProductionWeek | — | ✓ | ║ | 2025-06-27 | — | 2025-12-12 | — | ✓ | different format (Stolo: full date of week start e.g. 2025-06-27, BQ: week number e.g. 27) — Stolo value is more informative; week number can be derived downstream |
| endofproduction | new | vehicle.ordering.productionData.endOfProduction | — | ✓ | ║ | 2025-06-24 | — | 2025-12-05 | — | ✓ | different format (Stolo: date, BQ: datetime) |
| dealerestarrivaldate | new | vehicle.ordering.distributionData.expectedDeliveryDate | — | ✓ | ║ | 2025-07-04 | — | 2026-01-09 | — | ✓ | |
| dealeractualarrivaldate | new | vehicle.ordering.distributionData.arrivalDate | — | ✓ | ║ | 2025-07-02 | — | 2026-01-20 | — | ✓ | |
| ordertype | new | vehicle.ordering.orderData.orderType | — | ✓ | ║ | 0 | — | 8 | ❌ fmt (BQ: descriptive string e.g. Priority Stock) | ✓ | different format (Stolo: integer code, BQ: descriptive string) |
| eventid | new | vehicle.ordering.productionData.orderStatus | — | ✓ | ║ | 198 | — | 198 | — | ✓ | confirmed match: Stolo orderStatus 3-digit codes (190/195/198) = BQ eventid 3-digit logistics event codes |
| dealerid | new | vehicle.ordering.distributionData.shippingDealerNumber | — | ✓ | ║ | 033252 | ❌ EU | 000116 | ❌ EU | ✓ | Was destinationLocationDomesticDealerNumber; that field collapses to the national importer (dealer class VG) in import markets (JP → single 000210 "BMW Japan Corporation"). shippingDealerNumber is the physical retail outlet (class EH) in every market and is identical to the domestic field in home-network markets (DE); switched globally. |
| dealername | new | vehicle.ordering.distributionData.shippingDealerName | — | ✓ | ║ | Cloppenburg GmbH | ❌ EU | Auto-Leebmann GmbH | ❌ EU | ✓ | Was destinationLocationDomesticDealerName; switched to shippingDealerName alongside dealerid. |
| name (options) | new | vehicle.vehicleSpecification.modelAndOption.equipments[code].name [first locale] | — | ✓ | ║ | Parking Assistant | — | — | — | ✓ | |
| optiontype (options) | new | vehicle.vehicleSpecification.modelAndOption.equipments[code].type | — | ✓ | ║ | OPTION | — | — | — | ✓ | different format (Stolo: OPTION, BQ: O) |
| isstandard (options) | new | vehicle.vehicleSpecification.modelAndOption.equipments[code].standard | — | ✓ | ║ | true | — | — | — | ✓ | different format (Stolo: bool, BQ: string "false") |
| ispackage (options) | new | vehicle.vehicleSpecification.modelAndOption.equipments[code].packageFlag [str "1"=true, "0"=false] | — | ✓ | ║ | false | — | — | — | ✓ | different format (Stolo: "0"/"1" string, BQ: string "false"/"true") |
| enginedrivetype_code | new | vehicle.vehicleSpecification.modelAndOption.driveType | — | ✓ | ║ | FRONT | — | ALL_WHEEL | — | ✓ | different format (Stolo: English enum e.g. ALL_WHEEL; BQ: German abbreviation e.g. AR = AllRad, HR = HinterRad, VR = VorderRad — maps as ALL_WHEEL→AR, FRONT→VR, REAR→HR) |
| transmissiontype | new | vehicle.vehicleSpecification.modelAndOption.transmission | — | ✓ | ║ | AUTOMATIC | ❌ fmt (BQ: A, 1.91M) | AUTOMATIC | ❌ fmt (BQ: A, 1.91M) | ✓ | different format (Stolo: AUTOMATIC, BQ: A) |
| hybridflag | new | vehicle.vehicleSpecification.modelAndOption.is48Volt [bool] | — | ✓ | ║ | false | — | true | — | ✓ | stored as boolean; uncertain concept match: Stolo is48Volt is specific to 48V mild hybrid (bool), BQ hybridflag is a string code e.g. NOHY |
| sportsflag | new | vehicle.vehicleSpecification.modelAndOption.sportsFlag [bool] | — | ✓ | ║ | null | — | null | — | ✓ | stored as boolean; Stolo returns null; concept same, both null/false for standard vehicles |
| sold | new | vehicle.salesProcess.type ["AVAILABLE"=false, "SOLD"=true] | — | ✓ | ║ | false | — | false | — | ✓ | different format (Stolo: derived from enum, BQ: string "true"/"false") |
| used | new | vehicle.ordering.orderData.usageState ["NEW"=false, "USED"=true] | — | ✓ | ║ | false | — | false | — | ✓ | different format (Stolo: derived from enum NEW/USED, BQ: string "true"/"false") |
| prioritycode | new | vehicle.ordering.productionData.productionPriority | — | ✓ | ║ | 5 | — | 4 | — | ✓ | different format (Stolo: integer, BQ: string) |
No source found
| BQ column | Notes |
|---|---|
| orderstatus | No Stolo/ZA equivalent — BQ uses a separate 0–7 scale (1=in stock, 0=sold) unrelated to eventid |
| code | Internal record code |
| stocknumber | Dealer stock number |
| internetprice | — |
| invoiceprice | — |
| retailvalue | — |
| saleprice | — |
| askingprice | — |
| wholesaleprice | — |
| priceblocked | — |
| startofproduction | — |
| estimateddateofarrival | — |
| estimateddateofdeparture | — |
| actualdateofdeparture | — |
| invoicedate | — |
| releasetocarrierdate | — |
| vehicleshipdate | — |
| solddate | — |
| lotdate | — |
| daysonlot | — |
| update_date | — |
| last_modified_date | — |
| eventdescription | — |
| darstatus | — |
| dmsstatus | — |
| demonstrator | — |
| stopsale | — |
| transferflag | — |
| transferfrom | — |
| altshipto | — |
| retailtype | — |
| vehicleretailtype | — |
| environment | — |
| dealerlocation | — |
| dealermarket | — |
| dealerregion | — |
| dealernotes | — |
| dealeraddress | — |
| dealeremail | — |
| dealerphone | — |
| powertrain | — |
| transmissiondescription | — |
| enginedisplacement | — |
| horsepower | — |
| acceleration | — |
| milespergallon | — |
| milespergalloneqv | — |
| grossweight | — |
| doors | — |
| ispaint | — |
| isupholstery | — |
| iswheel | — |
| istrim | — |
| isaccessory | — |
| price (options) | — |
| wholesaleprice (options) | — |