Luna Akeneo Mirror checking…

A live, Akeneo-sourced replica of the legacy search2.luna.se search API. Status & the decisions that need you.

sestd1 (SE mkt)
82,217 vs legacy 78,407 · +4.9% ✓
plstd1 (PL mkt)
73,874 vs legacy 70,722 · +4.5% ✓ (splits!)
Markets live
SE · EN · PL
Source
Akeneo live, per request

Live endpoints

🇸🇪 product (SE) 🇬🇧 product (EN) 🇵🇱 product (PL) 📦 browse q=* 🖼 media proxy ❤ health

✅ Working

🟠 Decisions that need you

1. Index membership — SOLVED to ~5% (markets split) ~RESOLVED

You were right twice. The rule is the catalog gate and your market rule together: enabled · item_status∈{20,30,50,80,90} · brand_movex≠∅ (Movex supplier) · (control_assortment≠1 → all markets ; =1 → market∈approved_for_market).

Live result: SE 82,217 vs legacy 78,407 (+4.9%), PL 73,874 vs 70,722 (+4.5%) — and PL < SE, so the markets split correctly. The two missing pieces were (a) the Movex-supplier gate (cut 142k→82k) and (b) keeping your control_assortment market logic (an earlier pass wrongly dropped it). Discontinued/status 80/90 are kept (legacy keeps them).

Source confirmed (legacy C4 sqlite): the market list is SalesCatalogEntry.Marknad (country codes SE/PL/…) set in the legacy C4 PIM on the parent "product" — = legacy markets_ss = Akeneo approved_for_market (same signal, 3 encodings). The supplier+status half comes from Movex/M3. Residual ~5%: Akeneo's approved_for_market is the parent-level list (broader than legacy's item-level Marknad) → SE +4.9%. PL is the opposite: the iCore Marknad PL set (53,520) is smaller than live legacy PL (70,722), so our +4.5% PL is already closer to legacy than the source export (PL data is stale/partial). Searchers are separate endpoints with the right languages (sestd1=sv+en, plstd1=pl+en); no-lang totalHits 156,852/141,470 = products×langs.

Status: shipped & live, ~5% on both, correctly split — and that's about as close as the current Akeneo data allows. To close it (optional, Luna data task): ingest the item-level Marknad into a per-variant Akeneo attribute and gate on that instead of the parent-level approved_for_market; refresh the PL market feed (it's stale). No structural issue.

2. Full catalog harvest (nightly sync) DECISION

Per-article lookups are instant. q=* paging works, but deep live paging (offset ≫ 0) is slow (each doc is transformed live). The real harvest path is build-then-serve: run python -m build.build_docs --market to pre-build the index into the store, then q=* offset paging is instant.

Recommendation: run the full build once the membership rule (#1) is fixed — its size = decision #1 (~141k under A, far less under C). Then schedule rebuilds.

3. ERP fields — stock & price DECISION

market_price, pl_stock-level, pl_stocked, pl_packaging, pl_nextDeliv have no Akeneo source (legacy joins them from Movex CSVs at query time). We currently emit the placeholder "NEEDS_ERP_FEED".

Recommendation: keep placeholder for pre-prod; switch to empty/omit before real consumers; wire Movex later if stock/price are needed.

4. Auth & smaller calls DECISION

The mirror currently ignores the token (open access). Locale-name fallback: a product with no name in the requested language falls back to another language (names only) rather than showing empty like legacy.

🟣 Akeneo data-quality (caps parity — Luna-side fixes)

🔵 Coverage gaps (legacy fields/params not yet mirrored)

⚪ Accepted differences (by design)