Field reference
Every Catalog v3 column, grouped the way schools usually fill the sheet. Required means the importer expects a value for that row type unless noted.
Provider & centre
Every row belongs to one school (provider) and one centre. Use location_id=ALL for a price that applies to every centre.
provider_id
RequiredStable machine ID for your school or brand.
Allowed: Short alphanumeric ID; keep consistent across all rows.
Example: edu-inter
Common mistake: Changing provider_id mid-catalog splits the school into multiple providers.
provider_name
RequiredHuman-readable school name shown in Hub and quotes.
Allowed: Any display string.
Example: Edu-Inter
Common mistake: Leaving blank or mixing different names for the same provider_id.
location_id
RequiredCentre this price row applies to. Use ALL for all centres.
Allowed: Your centre IDs, or ALL.
Example: MTL / ALL
Common mistake: Reusing the same product_id with conflicting currencies or categories across centres without intending to.
location_name
RequiredDisplay name for the centre (or “All Centres” when location_id is ALL).
Allowed: Any display string.
Example: Montreal / All Centres
Common mistake: Empty location_name — Hub geo labels become hard to read.
Product
Rows with the same product_id describe one sellable product. Courses and accommodation require category.
product_id
RequiredStable ID for the product across centres and price tiers.
Allowed: Alphanumeric slug; keep stable when editing prices.
Example: ge-20
Common mistake: Renaming product_id after go-live breaks Hub history and quote recipes.
product_type_id
RequiredProduct family used for Hub Products, booking add-ons, and fees.
Allowed: courses | accommodation | insurance | transfers | material_fees | registration_fees | other
Example: courses
Common mistake: Typos or mixed case — values are normalized to lowercase.
category
OptionalSubtype within a product type (required for courses and accommodation).
Allowed: e.g. Adults, Juniors, Homestay, Residence. Leave empty for fees/transfers unless you document an extension.
Example: Adults
Common mistake: Leaving category blank on courses — booking cannot select the correct course type.
marketing_name
RequiredName shown to educators, agents, and students.
Allowed: Any display string.
Example: General English 20
Common mistake: Putting duration or price into the name instead of dedicated columns.
description
OptionalOptional longer description for this price row or product.
Allowed: Free text. Avoid commas that break CSV cells unless the field is quoted.
Example: 20 lessons per week
Common mistake: Unquoted commas splitting the row into extra columns.
currency
RequiredISO currency for this row’s prices.
Allowed: 3-letter ISO code (CAD, GBP, EUR, USD, …).
Example: CAD
Common mistake: Mixing currencies on the same product_id without intending multi-currency products.
Pricing
How the amount is calculated: per unit, flat fee, or tiered bundle.
pricing_method
RequiredWhich price columns Eduable should use.
Allowed: per_unit | flat_fee | tiered_bundle
Example: per_unit
Common mistake: Leaving unit_price empty on per_unit rows, or flat_price empty on flat_fee rows.
billing_unit
RequiredUnit the price is sold in.
Allowed: week | day | night | hour | minute | quantity | one_off
Example: week
Common mistake: Using week for hour-billed products — Hub will treat them as unit-priced courses.
unit_price
OptionalPrice per billing unit (per_unit / tiered_bundle).
Allowed: Non-negative number.
Example: 355
Common mistake: Putting weekly totals in unit_price when you meant flat_fee.
flat_price
OptionalOne-off amount for flat_fee rows (e.g. registration).
Allowed: Non-negative number.
Example: 150
Common mistake: Filling both unit_price and flat_price inconsistently for the pricing_method.
min_units
OptionalMinimum duration/quantity for this tier (inclusive).
Allowed: Whole number; leave empty when not used.
Example: 1
Common mistake: Overlapping duration tiers for the same product/centre/market.
max_units
OptionalMaximum duration/quantity for this tier (inclusive). Leave empty for open-ended (e.g. 13+).
Allowed: Whole number or empty.
Example: 3
Common mistake: Leaving gaps between tiers so some durations have no price.
Age bounds
Optional inclusive age range in whole years. When present, Agent and Student quotes need student age to pick the right band.
min_age
OptionalYoungest student age this row applies to.
Allowed: Whole years, or empty.
Example: 16
Common mistake: Overlapping age bands for Adults/Juniors without distinct categories.
max_age
OptionalOldest student age this row applies to.
Allowed: Whole years, or empty.
Example: 17
Common mistake: Setting max_age below min_age.
Validity
When the price is bookable. Leave dates empty for always-on list prices.
validity_basis
OptionalWhat valid_from / valid_to refer to.
Allowed: Typically course_start or purchase_date (school convention).
Example: course_start
Common mistake: Setting dates without a clear validity_basis.
valid_from
OptionalStart of the validity window (ISO date).
Allowed: YYYY-MM-DD or empty.
Example: 2026-01-01
Common mistake: Local Excel date formats that export as serial numbers.
valid_to
OptionalEnd of the validity window (ISO date).
Allowed: YYYY-MM-DD or empty.
Example: 2026-12-31
Common mistake: Ending a promo a day early because of timezone/export quirks.
Market (nationality)
Optional nationality targeting for market prices and discounts.
country_scope
OptionalWhether the row applies to all nationalities or a listed set.
Allowed: all | selected_countries (or empty treated as all).
Example: selected_countries
Common mistake: selected_countries with an empty country_codes list.
country_codes
OptionalISO-2 nationality codes when country_scope is selected.
Allowed: Comma-separated ISO-2 codes (DE,FR,BR).
Example: DE,FR
Common mistake: Using full country names instead of ISO-2 codes.
Conditions
Semicolon-separated key=value pairs in one cell. Used for promotions, waivers, accommodation tiering, and product metadata.
conditions
OptionalStructured extras for the price row.
Allowed: key=value;key=value — no spaces required around =.
Example: complimentaryWeeks=2;minimumPaidWeeks=12
Common mistake: Using commas between keys (use ;) or renaming headers like conditions;.
Useful condition keys
Put these inside the conditions cell as key=value;key=value.
complimentaryWeeks— Free weeks granted when booking qualifies. Example:complimentaryWeeks=2minimumPaidWeeks— Minimum paid weeks required to unlock free weeks / offers. Example:minimumPaidWeeks=12discountPercent— Percentage discount on matching nationalities/markets. Example:discountPercent=8discountNationalityCodes— ISO-2 codes the discount applies to (comma-separated inside the value). Example:discountNationalityCodes=DE,FRregistrationWaivedIfPaidWeeksGte— Waive registration when paid weeks are greater than or equal to this number. Example:registrationWaivedIfPaidWeeksGte=12thresholdNights / chargeAs— Accommodation night↔week tiering (e.g. 6 nights charge as a week). Example:thresholdNights=6;chargeAs=week_then_nighthoursPerWeek / deliveryMode / …— Display/selection metadata (hours, meals, transfer type, etc.). Example:hoursPerWeek=20;deliveryMode=in_person
