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
| Field | Value |
|---|---|
| Brand | Laura Geller Beauty |
| Live store | https://www.laurageller.com |
| Shop domain | laurageller.myshopify.com |
| Storefront settings API key | 686c42695cf27a5651a16a1a85e79c59 (in infra/ecom/config/prod.json) |
| Markets | AU (default), GB, US — same theme, market-scoped promo and localization config |
| Custom app scopes | unauthenticated_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:
| Path | Captured | Notes |
|---|---|---|
tmp/laurageller-live-theme/ | 2026-05-07 | Last known live theme export. May not match what is live today. |
tmp/laurageller-theme/ | 2026-05-07 | Sibling 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:
| Field | Value |
|---|---|
| Block ID | 14932934161683764193 |
| Type | shopify://apps/marqo/blocks/marqo-search-embed/019d8dfb-81ec-764a-8a2d-fd6a23df1d4d |
| Settings | debug_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:
| Token | Value |
|---|---|
| Body font | brandon-grotesque via Adobe Typekit (pdz7iln kit, @import url("https://use.typekit.net/pdz7iln.css")) |
| Heading font | minion-3-display (same kit) |
| Card background | #ffffff, image bg #f3f3f3 |
| Card image ratio | 1:1 (card_image_padding: 0) |
| Card style | No border, no shadow, no hover effect |
| Grid | 4 col desktop / 2 col tablet / 2 col mobile, 16px gutter |
| Title | inherit font, 14px, weight 400, #0c0c0c |
| Sale price | #93021a (dark maroon — LG brand accent) |
| Sale badge | top-left, #93021a bg, white text, format SAVE {percent}% |
| CTA | SHOP NOW, black, full-width, uppercase, letter-spacing 1.5px |
| Reviews | Okendo, gold stars #c8a000, show count |
| Filters | Sidebar, chevron icons, show product count |
| Pagination | Paging mode (not infinite), 24 per page |
| Card text | Left-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
| Feature | Status | Reference |
|---|---|---|
| Marqo product cards with Okendo reviews | Shipped, configured | planning §2 |
| Quickshop modal (variant picker) | Shipped, theme bridge needed | planning §1 |
| Custom badges from product metafields | Shipped, template-driven | planning §3 |
| Inline promo tiles (grid injections) | Shipped via admin UI | planning §4 |
| Curated PLP imagery from metafields | Shipped, template-driven | planning §5 |
| Videowise video tiles | Shipped, theme hydration needed | planning §6 |
| Audience / UTM segmentation hooks | DOM event API shipped | planning §7 |
| Per-market promo messages (Storefront API) | Shipped — see runbook | lg-promo-messages.md |
| UTM-gated promo overrides | Shipped — VtvvyX, UVBqqX, Rose40-EM and more | lg-promo-utm-test-links.md |
productMetafieldSeoHidden filtering | Configured in merch KV (filter_string: "productMetafieldSeoHidden:0 AND NOT productStatus:(unlisted)") | lg-unreachable-docs.md |
| A/B testing feature flag | Enabled — PR #2512 | |
| Custom boost/bury rules | Enabled — 56bbc8db6 | |
dynamicBadgeText for sale badge | Shipped — PR #2820 (gates sale badge behind a metaobject badge) | |
| Dynamic promo pricing from metaobjects | Shipped — PR #2974 | |
data-promo-handle per-banner CSS target | Shipped — PR #2664 | |
outOfStock + productTitleSort fields | Shipped — PR #2623 | |
Shopify.currency.active fallback | Shipped — PR #2698 | |
| Image/title/CTA-only clickable cards | Shipped — PR #2707 | |
| Storefront search "Rebuy-style" uplift | Shipped — 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":trueon themain-searchsection 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 blockmarqo-search-embed(UUID019d8dfb-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:
- Wrap
{% render 'search-related-product' %}insnippets/header-search.liquidwith<!-- ... -->(or{% comment %}...{% endcomment %}). - Wrap
{% render 'okendo-reviews-product-rating-summary', product: card_product %}insnippets/search-card-product.liquidwith{% comment %}...{%- endcomment -%}. - Add the Marqo app block to
config/settings_data.json(or do it via the Shopify theme editor's "App embeds" panel) — typeshopify://apps/marqo/blocks/marqo-search-embed/<extension-uuid>. - Make sure
templates/search.jsondoesn't carry"disabled":trueonmain-search. - Verify the Marqo pixel
<script>is still inlayout/theme.liquidbefore</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
| Field | Value |
|---|---|
| Name | June 18, 2026 | Laura Geller <> Marqo |
| Role | UNPUBLISHED |
| Preview prefix | /t/838 |
| Created | 2026-06-18 00:56 UTC |
| Last edited | 2026-06-18 01:15 UTC |
Marqo plumbing in place
- Pixel at
layout/theme.liquid:784— samee1267618-c6da-4e72-b7c1-c3361ed92c6ccustomer ID as the May 7 live theme. marqo-search-embedapp block enabled inconfig/settings_data.json(UUID019d8dfb-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:
collection_banner_UJrHqA— typeCollection-banner(new section type, not in the May 7 export).hide_collection_title: false, padding 40/40. Renders the native title + image.banner— typeCollection-block-template-new("PLP / Collection Banner"). Secondary native banner.- Marqo grid —
appssection17817445034c626b27containing blockmarqo_marqo_results_VRX8YH(settings below). collection_object_start_here_box_new_hwPdWL— typeCollection-object-start-here-box-new.collection_fa_qs_accordion_new_3X4XRa— typeCollection-FAQs-accordion-new.collection_seo_accordions_new_F6H36H— typeCollection-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/838prefix). 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-dataJSON script inlayout/theme.liquidcarried 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.
Known related fixes
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:
| PR | What it does | Status |
|---|---|---|
| #3776 | marqo-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 |
| #3777 | applyHeadingBlockOverrides() 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 |
| #3783 | Bundle 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
- Planning: laura-geller-integration-guide.md — feature-by-feature setup
- Planning: laura-geller-theme-settings.md — full design tokens and custom CSS
- Runbook: lg-promo-messages.md — per-market promo verification
- Runbook: lg-promo-utm-test-links.md — UTM override test matrix
- Runbook: lg-unreachable-docs.md — diagnosing missing-product searches
- App guide: apps/okendo.md — Okendo reviews integration template (LG uses this)
- Theme exports:
tmp/laurageller-theme/andtmp/laurageller-live-theme/(2026-05-07, stale — re-export before relying on them) - Settings backups:
tmp/laurageller_settings_backup_*.jsonandtmp/laurageller-settings-*.json