Skip to main content

Laura Geller Integration Reference

Reference doc for the Laura Geller (LG) Shopify integration. This is the operational summary; for deep context on individual features see the planning docs and runbooks linked below.

Store

FieldValue
BrandLaura Geller Beauty
Live storehttps://www.laurageller.com
Shop domainlaurageller.myshopify.com
Storefront settings API key686c42695cf27a5651a16a1a85e79c59 (in infra/ecom/config/prod.json)
MarketsAU (default), GB, US — same theme, market-scoped promo and localization config
Custom app scopesunauthenticated_read_metafields, read_metaobjects (granted via custom LG app, see PR #2982, PR #2827)

LG was an early E-com customer with deep feature requirements — the integration includes custom badges, dynamic promo pricing, Okendo reviews, Quickshop modal bridge, market-scoped promo messages, UTM segmentation, A/B testing, custom boost/bury rules, and curated PLP imagery. Many features required schema changes and code shipped specifically for LG.

Theme

Live theme is changing. As of 2026-06-18 the merchant is moving to a new theme: https://admin.shopify.com/store/laurageller/themes/140075696189/editor

Past theme exports on disk:

PathCapturedNotes
tmp/laurageller-live-theme/2026-05-07Last known live theme export. May not match what is live today.
tmp/laurageller-theme/2026-05-07Sibling export from the same day, captured ~11 min earlier. Diff shows in-flight admin edits.

Before doing anything on the new theme, re-export both the merchant's published theme and the Marqo theme (or whatever they intend us to inject into). Stale exports led to the wrong-baseline diffs documented below.

Marqo App Block

LG embeds the storefront widget via the Marqo app block. From the May 7 export of config/settings_data.json:

FieldValue
Block ID14932934161683764193
Typeshopify://apps/marqo/blocks/marqo-search-embed/019d8dfb-81ec-764a-8a2d-fd6a23df1d4d
Settingsdebug_mode: true

The 019d8dfb-... UUID is the Marqo extension version. Other Okendo and third-party blocks live in current.blocks of the same file — see the May 7 export for the full inventory.

In the second May 7 export (tmp/laurageller-live-theme/) this block was absent, suggesting an in-flight admin edit removed and re-added it. Treat "is Marqo enabled on the live theme" as something to verify, not assume.

Marqo Pixel

Theme pixel JS is loaded directly from layout/theme.liquid (lines 771–773 and 844 of the May 7 export):

<!--START Marqo Pixel-->
<script src="https://pixel.marqo-ep.ai/c/e1267618-c6da-4e72-b7c1-c3361ed92c6c/p.min.js" defer></script>
<!--END Marqo Pixel-->

Customer/account ID embedded in the URL: e1267618-c6da-4e72-b7c1-c3361ed92c6c.

Native Theme — Design Tokens

Full token reference: docs/plans/laura-geller-theme-settings.md.

Snapshot:

TokenValue
Body fontbrandon-grotesque via Adobe Typekit (pdz7iln kit, @import url("https://use.typekit.net/pdz7iln.css"))
Heading fontminion-3-display (same kit)
Card background#ffffff, image bg #f3f3f3
Card image ratio1:1 (card_image_padding: 0)
Card styleNo border, no shadow, no hover effect
Grid4 col desktop / 2 col tablet / 2 col mobile, 16px gutter
Titleinherit font, 14px, weight 400, #0c0c0c
Sale price#93021a (dark maroon — LG brand accent)
Sale badgetop-left, #93021a bg, white text, format SAVE {percent}%
CTASHOP NOW, black, full-width, uppercase, letter-spacing 1.5px
ReviewsOkendo, gold stars #c8a000, show count
FiltersSidebar, chevron icons, show product count
PaginationPaging mode (not infinite), 24 per page
Card textLeft-aligned

Typekit caveat: the pdz7iln kit is domain-locked to laurageller.com. On dev stores set fontFamily: "inherit" and add a Google Fonts Raleway @import in custom CSS as a fallback. Remove the Google Fonts override before deploying to the live store. See planning doc for the exact override CSS.

Features Shipped for LG

FeatureStatusReference
Marqo product cards with Okendo reviewsShipped, configuredplanning §2
Quickshop modal (variant picker)Shipped, theme bridge neededplanning §1
Custom badges from product metafieldsShipped, template-drivenplanning §3
Inline promo tiles (grid injections)Shipped via admin UIplanning §4
Curated PLP imagery from metafieldsShipped, template-drivenplanning §5
Videowise video tilesShipped, theme hydration neededplanning §6
Audience / UTM segmentation hooksDOM event API shippedplanning §7
Per-market promo messages (Storefront API)Shipped — see runbooklg-promo-messages.md
UTM-gated promo overridesShipped — VtvvyX, UVBqqX, Rose40-EM and morelg-promo-utm-test-links.md
productMetafieldSeoHidden filteringConfigured in merch KV (filter_string: "productMetafieldSeoHidden:0 AND NOT productStatus:(unlisted)")lg-unreachable-docs.md
A/B testing feature flagEnabled — PR #2512
Custom boost/bury rulesEnabled — 56bbc8db6
dynamicBadgeText for sale badgeShipped — PR #2820 (gates sale badge behind a metaobject badge)
Dynamic promo pricing from metaobjectsShipped — PR #2974
data-promo-handle per-banner CSS targetShipped — PR #2664
outOfStock + productTitleSort fieldsShipped — PR #2623
Shopify.currency.active fallbackShipped — PR #2698
Image/title/CTA-only clickable cardsShipped — PR #2707
Storefront search "Rebuy-style" upliftShipped — PR #2326

Instant Search — Theme Modifications

Enabling Marqo instant search on LG required disabling LG's native predictive-search dropdown (so our overlay isn't competing with theirs) and suppressing the per-card Okendo rating summary in the native search results template (so we don't double-render review stars when the Marqo card is already showing them via the widget's Okendo hydration).

Diff of tmp/laurageller-theme/ (Marqo theme, with our edits) vs tmp/laurageller-live-theme/ (the merchant's live/published theme without our edits) confirms these are the only {% comment %}-wrapped {% render %} calls that exist in the Marqo theme but not the live theme. Background context for why these are needed: tmp/agent-plans/instant-search-plan.md Phase 0 — "Shopify's native predictive search is disabled by the merchant (theme setting + custom snippets) to make room for our overlay".

1. snippets/header-search.liquid:95

LG theme's native predictive-search dropdown content. Disabled in the Marqo theme so Marqo's instant-search overlay owns the search modal.

<!-- Marqo theme (disabled) -->
<!-- {% render 'search-related-product' %} -->

<!-- Live theme (active) -->
{% render 'search-related-product' %}

snippets/search-related-product.liquid renders LG's "featured products + popular searches" panel inside the search modal.

2. snippets/search-card-product.liquid:307

Per-card Okendo star summary inside LG's native search results card. Disabled in the Marqo theme to avoid duplicating Okendo stars (the Marqo ProductCard's notifyReviewWidgets() hydration already provides stars on Marqo-rendered cards).

<!-- Marqo theme (disabled) -->
{% comment %}{% render 'okendo-reviews-product-rating-summary', product: card_product %}{%- endcomment -%}

<!-- Live theme (active) -->
{% render 'okendo-reviews-product-rating-summary', product: card_product %}

Supporting changes (Marqo-theme-only)

  • templates/search.json"disabled":true on the main-search section is removed in the Marqo theme. Enables LG's native search page so it can function as the fallback when the Marqo overlay isn't active.
  • config/settings_data.json — Marqo app block marqo-search-embed (UUID 019d8dfb-81ec-764a-8a2d-fd6a23df1d4d, debug_mode: true) is present in the Marqo theme and absent in the live theme. This is the storefront-widget embed itself.

The only Okendo block in either settings_data.json is the reviews theme-settings embed (shopify://apps/okendo/blocks/theme-settings/...). LG never had Okendo Search & Discovery installed — the only conflict to suppress was the per-card Okendo star summary above.

Reapply checklist for the new theme clone

When re-injecting Marqo into the new theme at themes/140075696189:

  1. Wrap {% render 'search-related-product' %} in snippets/header-search.liquid with <!-- ... --> (or {% comment %}...{% endcomment %}).
  2. Wrap {% render 'okendo-reviews-product-rating-summary', product: card_product %} in snippets/search-card-product.liquid with {% comment %}...{%- endcomment -%}.
  3. Add the Marqo app block to config/settings_data.json (or do it via the Shopify theme editor's "App embeds" panel) — type shopify://apps/marqo/blocks/marqo-search-embed/<extension-uuid>.
  4. Make sure templates/search.json doesn't carry "disabled":true on main-search.
  5. Verify the Marqo pixel <script> is still in layout/theme.liquid before </body> (see "Marqo Pixel" above).

Line numbers will shift on the new theme — search by render call, not by line.

Configuration

Storefront settings

Full settings are in tmp/laurageller-settings-*.json (most recent: tmp/laurageller-settings-2026-05-24T151731.json). Fetch fresh before modifying:

curl -s -H "Authorization: Bearer 686c42695cf27a5651a16a1a85e79c59" \
"https://admin.ecom.marqo.ai/api/v1/storefront/shops/laurageller.myshopify.com/settings" \
| python3 -m json.tool > tmp/laurageller-settings-$(date +%Y%m%d-%H%M).json

Key knobs documented in planning §theme-settings. Custom CSS overrides are in the same doc — production set vs. dev-store Raleway override.

Merchandising (search proxy KV)

LG has merchandising rules that inject filter strings into every search:

filter_string: "productMetafieldSeoHidden:0 AND NOT productStatus:(unlisted)"

Applied at both page and search triggers via the search proxy KV store. Keys follow the pattern {index_id}|page and {index_id}|search. See lg-unreachable-docs.md for the diagnostic pattern when products go invisible.

Promo metaobjects

LG uses global_promo_message metaobjects. Active selection is per-market via theme settings (Online Store → Customize → market dropdown → Theme settings → Global Active Promotions). See lg-promo-messages.md for the runtime model and verification scripts.

Search tuning

Custom boost/bury rules have been enabled (56bbc8db6). For any new tuning work, use the search-tuner agent with the x-marqo-settings-override header — do not write directly to DDB without human approval.

New Theme — Captured State (2026-06-18)

Theme 140075696189, fetched via Shopify Admin GraphQL (scripts/ecom/shopify_graphql.py --shop laurageller.myshopify.com --env prod --profile controller). Local copy at tmp/laurageller-new-theme-2026-06-18/.

Theme metadata

FieldValue
NameJune 18, 2026 | Laura Geller <> Marqo
RoleUNPUBLISHED
Preview prefix/t/838
Created2026-06-18 00:56 UTC
Last edited2026-06-18 01:15 UTC

Marqo plumbing in place

  • Pixel at layout/theme.liquid:784 — same e1267618-c6da-4e72-b7c1-c3361ed92c6c customer ID as the May 7 live theme.
  • marqo-search-embed app block enabled in config/settings_data.json (UUID 019d8dfb-81ec-764a-8a2d-fd6a23df1d4d, debug_mode: true, price_multiplier: 1 — new field worth tracking if any pricing work needs to set it elsewhere).
  • Native predictive-search disabled at snippets/header-search.liquid:95{%comment%} {% render 'search-related-product' %} {%endcomment %}.
  • Native Okendo rating summary disabled at snippets/search-card-product.liquid:317-319{% comment%}…{%- endcomment -%} wraps the full <div class="Card_product_innercontent_review_new">…</div> block.

Collection template (templates/collection.json)

Section order, top to bottom:

  1. collection_banner_UJrHqA — type Collection-banner (new section type, not in the May 7 export). hide_collection_title: false, padding 40/40. Renders the native title + image.
  2. banner — type Collection-block-template-new ("PLP / Collection Banner"). Secondary native banner.
  3. Marqo gridapps section 17817445034c626b27 containing block marqo_marqo_results_VRX8YH (settings below).
  4. collection_object_start_here_box_new_hwPdWL — type Collection-object-start-here-box-new.
  5. collection_fa_qs_accordion_new_3X4XRa — type Collection-FAQs-accordion-new.
  6. collection_seo_accordions_new_F6H36H — type Collection-SEO-accordions-new.

Native product-grid section (type main-collection-product-grid) is disabled: true — the Marqo grid owns the products.

Marqo grid block settings (collection page) — intentional

{
"fallback_collection": "",
"fallback_message": "These products aren't available in your region, but you might like these",
"show_heading": false, // OFF — native Collection-banner renders the title above
"show_banner_image": false, // OFF — same reason
"heading_color": "",
"heading_alignment": "default",
"uncollapse": false,
"image_display_order": "variant-first"
}

Do not re-enable show_heading or show_banner_image on the collection-page block without coordinating — they're off because LG's native banner sections already render the header + image above the Marqo grid. Re-enabling produces double headers / double banner images. image_display_order: "variant-first" is the default for the block-level setting from PR #3619.

Search template (templates/search.json)

Native main-search section is disabled: true. Marqo grid block marqo_marqo_results_4i3Pn7 (apps section 17817444726d04c3f3) carries the search results, with show_heading: true and show_banner_image: true — search page has no native banner above, so the Marqo grid renders the "Search Results" heading itself (see Known related fixes).

Onboarding — remaining work

The theme is well-positioned for clone-and-reinsert. Open items before publishing:

  • Visual preview pass on https://laurageller.myshopify.com/?preview_theme_id=140075696189 (or the /t/838 prefix). Spot-check /collections/best-sellers, /collections/foundations, /search?q=foundation.
  • Re-fetch storefront settings (scripts/ecom/storefront_settings.py backup …) and back them up before any push.
  • Run the per-market promo console diagnostic from lg-promo-messages.md on the new theme — confirm the global-promos-data JSON script in layout/theme.liquid carried over.
  • UTM override smoke test — at least one URL from lg-promo-utm-test-links.md.
  • Confirm Marqo pixel fires (DevTools → Network → pixel.marqo-ep.ai).
  • Publish is the merchant's call, not ours.

Toggling show_heading: false on the collection-page Marqo grid block exposed two bundle/loader regressions during this onboarding. All three fixes landed in June 2026:

PRWhat it doesStatus
#3776marqo-loader.js no longer pre-renders the URL-derived page title or breadcrumb. Removes the heading flash that showed before the Vue bundle hid it.Merged
#3777applyHeadingBlockOverrides() in the bundle now writes "Search Results" to #marqo-page-heading.textContent on search pages when show_heading is true. Restores the search-page heading that #3776 inadvertently removed.Merged
#3783Bundle now updates the breadcrumb's "current" segment from the canonical Storefront API title (same value as the heading), in the existing fetchCollectionMetadataByHandle() callbacks. Fixes the empty "Home › " breadcrumb on shops with layout_config.showBreadcrumbs: true (default; explicitly set on Muji).Open

Until #3783 ships, collection-page breadcrumbs on LG and other default-config shops snapshot an empty heading and never update — they read "Home › ". The fix is the durable resolution; no per-merchant workaround needed.

References