# Does Lebanon pay more for the same Zara item? Method

Measured 8-9 October 2026 (UTC). Everything below is reproducible with
`fetch.py` in this folder (stages: `sample`, `fetch`, `fx`, `analyze`,
`handcheck`, `repass tr`). Numbers quoted here come from `summary.json`.

## What was compared

The same Zara product, in the same colour, on Zara's own public websites in
Lebanon (lb/en), the United Arab Emirates (ae/en), Spain (es/en), Turkey
(tr/en) and the United States (us/en), at its regular (non-sale) shelf price,
converted to US dollars.

## Sample

- Source: closet.ai's daily scrape of Zara Lebanon
  (`closet/data/products/zara.json`, 27,888 records).
- Eligible: records with `listed == true`, `last_seen == 2026-10-08` and
  `was == null` (not on sale in Lebanon): 15,102 colour records, 11,202
  distinct products.
- One colour was drawn at random per product, so no product counts twice.
- Stratified by gender (Women, Men, Kids) x category (60 strata), with
  proportional allocation (largest remainder, at least 1 per stratum), then a
  simple random draw inside each stratum. Seed 20261009. 450 products:
  201 Women, 105 Men, 144 Kids. List: `sample.csv`.
- Results are unweighted medians over the sample. Because allocation is
  proportional, the sample mirrors the Lebanon catalogue's mix of genders
  and categories.

## Matching rule (like for like)

- Product key: the 8-digit code in the product URL (`p06095982`). It is a
  1-digit prefix (0, 1 or 2) + 4-digit model + 3-digit quality. closet.ai's
  `ref` field ("6095/982") drops the prefix, so it is not unique on its own.
- Colour key: the 3-digit colour code, the suffix of the closet record id
  (`zara-545400334-250` -> 250). The same digits follow the product code in
  Zara's image names (`06095982` `250`) and in Zara's colour reference
  (`C06095982` `250` `015-I2026`).
- A country row is a match only when that country's page returns the same
  product code and a colour with the same 3-digit id whose reference starts
  with `C<code><colour>`. Otherwise it is recorded as a failure with the
  reason.
- Zara's internal product ids were identical across all five stores in every
  read checked, which supports this being the same item.

## Fetching

- URL: `https://www.zara.com/{cc}/en/{slug}-p{code}.html?ajax=true`. Zara
  returns the product page's data as JSON. Plain HTTPS (Python httpx), a
  desktop Chrome User-Agent and `Accept-Language: en-US`. No login, no
  browser, no API keys.
- One request at a time, 1.5-2.5 s random pause, back-off on 403/429/5xx
  (none happened: 0 refusals in 3,055 HTTP requests for 2,740 page reads, redirects included). Wrong or empty slugs are
  answered with Zara's ajax redirect (HTTP 278, `{"location": ...}`), which
  is followed. A product not sold in a country answers HTTP 410.
- Each item was fetched in all five countries back to back (Lebanon first),
  so the Lebanon price is from the same minutes as the foreign prices.
  Main pass: 2026-10-08 23:00 UTC to 2026-10-09 00:40 UTC.
- Price: the colour's `price`, which Zara sends as the amount x 100 in every
  currency (Lebanon 490000000 = 4,900,000 LBP). Currency from the page's
  analytics block. Per-size prices were also read: none of the matched rows
  had different prices across sizes.
- Sale: a row is "on sale" when the colour or any of its sizes carries an
  `oldPrice`. Sale rows are kept in `prices.csv` but left out of the
  regular-price comparison. On sale: 2 rows (US), 0 elsewhere.
- Lebanon's same-day page price equalled closet.ai's recorded price for all
  448 matched Lebanon rows.

## Currency

Zara Lebanon's website prices in Lebanese pounds (LBP), not dollars. Its
prices are converted at Banque du Liban's official rate.

| Currency | USD per unit | Source |
|---|---|---|
| LBP | 1 / 89,500 | Banque du Liban, Exchange Rates, US Dollar series (USD/LBP), 89,500 every month Aug 2024 to Jul 2026 (latest published), read 2026-10-08 |
| AED | 1 / 3.6725 | UAE dirham peg |
| EUR | 1.1186 | ECB euro reference rate, 2026-10-08 |
| TRY | 1.1186 / 55.0523 = 0.020319 | ECB euro reference rates (USD and TRY), 2026-10-08 |

- ECB: the latest reference date on or before the first fetch (published
  2026-10-08, ~16:00 CET); the 9 October rates were not out during the run.
- Market check for LBP: Wise mid-market 89,550 per USD (read 2026-10-08
  23:05 UTC), 0.06% from the official rate. Zara's own internal rate in the
  pages implies 89,577 LBP per USD. Neither changes any result.
- All rates, URLs and read times: `fx.json`.

## Taxes

- Prices are shelf prices as shown. US prices exclude sales tax (added at
  checkout, varies by state). Spain (21% VAT), the UAE (5% VAT) and Turkey
  include VAT in the shelf price.
- Lebanon has 11% VAT. The Zara Lebanon site does not say whether its
  shelf prices include it; we compare the shelf price as shown and do not
  claim either way.
- Secondary comparison: Spain and the UAE with their VAT taken out (price /
  1.21 and / 1.05), Lebanon left as shown. This is a "before tax abroad" view,
  not a like-for-like tax comparison.

## Results (regular prices, Lebanon / other country, in USD)

"More expensive" means the Lebanon price is more than 1% above; "equal"
means within 1%.

| vs | n | Median LB premium | Mean | LB dearer | LB cheaper | Equal |
|---|---|---|---|---|---|---|
| UAE | 443 | +0.3% | +1.1% | 49% | 35% | 16% |
| Spain | 438 | +63.2% | +63.4% | 100% | 0% | 0% |
| Turkey (prices after 9 Oct repricing) | 435 | +25.3% | +27.2% | 100% | 0% | 0% |
| Turkey (prices before it, main pass) | 435 | +34.0% | +33.3% | 100% | 0% | 0% |
| United States | 439 | -5.7% | -3.5% | 21% | 67% | 13% |

- Ex-VAT: vs Spain ex-VAT, median +97.5%; vs UAE ex-VAT, median +5.3%
  (LB dearer for 80%).
- By gender, US: Kids +3.6% (LB dearer for 54%), Men -7.1%, Women -8.6%.
  UAE: Kids +4.2%, Men -2.8%, Women -0.1%. Spain and Turkey: every gender
  and category is dearer in Lebanon. Full breakdowns by gender and category:
  `summary.json` (`by_gender`, `by_category`).
- 426 items matched in all four comparisons; their medians are the same to
  within 0.2 points (`matched_in_all_countries`).
- Top 15 Lebanon premiums per country, with both prices and URLs:
  `summary.json` (`top15_lb_premium`; Turkey's list uses main-pass prices).

## Hand check and the Turkey repricing

- 20 random matched items were re-read later in a separate pass (00:41-00:42
  UTC on 9 October), Lebanon plus one other country each (`handcheck.csv`).
  Lebanon 20/20, UAE 5/5, Spain 3/3 and US 4/4 identical. Turkey: 5 of 8
  had changed, all upward (4-10%).
- Investigation: Turkey was re-read in full (`repass tr`, 00:43-01:00 UTC).
  279 of 437 matched Turkish prices had gone up between the passes (median
  +7.5% among those that changed), none down. Items first read before about
  00:15 UTC changed in most cases; items first read after 00:20 UTC had not
  changed (1 of 93). So Zara Turkey raised prices at about 00:15-00:20 UTC
  on 9 October (03:15-03:20 Turkey time), in the middle of the main pass.
- The repass prices are the current ones, so the Turkey headline uses them
  (+25.3%). The pre-repricing number (+34.0%) is kept for transparency. The
  TRY rate is the ECB's from 8 October, before the repricing.

## Failures (out of 450 per country)

| Country | Matched | Not sold there (410) | Colour not offered | On sale | LB side not comparable |
|---|---|---|---|---|---|
| Lebanon | 448 | 0 | 2 | 0 | - |
| UAE | 444 | 4 | 2 | 0 | 1 |
| Spain | 439 | 10 | 1 | 0 | 1 |
| Turkey | 437 | 13 | 0 | 0 | 2 |
| United States | 443 | 7 | 0 | 2 | 2 |

"LB side not comparable" = matched abroad, but the item's colour was no
longer offered in Lebanon on 9 October.

## Caveats

- One snapshot (one night). Prices move: Turkey repriced during the run.
- Shelf prices only: no shipping, duties, delivery fees, or US sales tax.
- The sample is of Lebanon's live full-price catalogue. Items Zara sells
  abroad but not in Lebanon are not in it.
- Lebanon's dollar figure depends on the LBP rate; the official rate and the
  market rate were 0.06% apart on the day.
- Median over items, not weighted by what people buy.

## Files

- `fetch.py`: the script (config at the top).
- `sample.csv`: the 450 sampled items.
- `raw.jsonl.gz`, `handcheck_raw.jsonl.gz`, `repass_tr.jsonl.gz`: each read
  as received (trimmed to the product's colours, prices, sizes and analytics).
- `prices.csv`: one row per item x country per pass (`pass` = main or
  repass), including failures, with URL, HTTP status and UTC timestamp.
- `fx.json`, `summary.json`, `handcheck.csv`.
