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

Required

Stable 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

Required

Human-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

Required

Centre 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

Required

Display 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

Required

Stable 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

Required

Product 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

Optional

Subtype 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

Required

Name 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

Optional

Optional 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

Required

ISO 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

Required

Which 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

Required

Unit 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

Optional

Price 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

Optional

One-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

Optional

Minimum 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

Optional

Maximum 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

Optional

Youngest 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

Optional

Oldest 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

Optional

What 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

Optional

Start 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

Optional

End 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

Optional

Whether 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

Optional

ISO-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

Optional

Structured 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.

  • complimentaryWeeksFree weeks granted when booking qualifies. Example: complimentaryWeeks=2
  • minimumPaidWeeksMinimum paid weeks required to unlock free weeks / offers. Example: minimumPaidWeeks=12
  • discountPercentPercentage discount on matching nationalities/markets. Example: discountPercent=8
  • discountNationalityCodesISO-2 codes the discount applies to (comma-separated inside the value). Example: discountNationalityCodes=DE,FR
  • registrationWaivedIfPaidWeeksGteWaive registration when paid weeks are greater than or equal to this number. Example: registrationWaivedIfPaidWeeksGte=12
  • thresholdNights / chargeAsAccommodation night↔week tiering (e.g. 6 nights charge as a week). Example: thresholdNights=6;chargeAs=week_then_night
  • hoursPerWeek / deliveryMode / …Display/selection metadata (hours, meals, transfer type, etc.). Example: hoursPerWeek=20;deliveryMode=in_person