Free Shipping on Orders Over €50Standard shipping is free across the EU when your order total reaches €50. Orders below €50 ship for a flat €4.90 fee.
Ships from Within the EUAll orders are dispatched from our European warehouse. Estimated delivery: 2–5 business days depending on your country.
14-Day ReturnsChanged your mind? Return any unused item in its original packaging within 14 days of delivery for a full refund — no questions asked. EU consumer rights guaranteed.
Secure Checkout via StripeYour payment information is encrypted end-to-end. We never store your card details. Powered by Stripe, trusted by millions worldwide.
✦ Free European Skincare Guide
Your Free Guide + 10% Off Your First Order
Join 50+ European beauty enthusiasts and receive our curated skincare guide free. Limited to the first 100 members.
No spam. Unsubscribe anytime.
Check your email.
Your guide + 10% code is on its way.
Your code: LUSTRE10
}
// ─── ROUTER ─────────────────────────────────────────
function navigate(path) {
if (path !== state.currentPage) {
window.location.hash = path;
}
return false;
}
function getRoute() {
const hash = window.location.hash.slice(1) || '/';
return hash;
}
async function render() {
const route = getRoute();
state.currentPage = route;
const app = document.getElementById('app');
app.classList.remove('page-active');
app.classList.add('page-enter');
let html = '';
if (route === '/' || route === '') {
html = renderHome();
updatePageMeta({
title: 'LustreHQ | Curated European Beauty',
description: 'Premium skincare and cosmetics sourced from European beauty houses. Curated, not cataloged.',
canonicalPath: '/',
jsonLd: {
'@context': 'https://schema.org',
'@type': 'Organization',
name: 'LustreHQ',
url: 'https://lustrehq.polsia.app',
description: 'Premium skincare and cosmetics sourced from European beauty houses. Curated, not cataloged.',
logo: 'https://lustrehq.polsia.app/og-default.jpg'
}
});
} else if (route === '/shop') {
html = renderShop();
updatePageMeta({
title: 'Shop | LustreHQ',
description: 'Browse our full collection of curated European skincare, cosmetics, fragrances and body care.',
canonicalPath: '/'
});
} else if (route.startsWith('/shop/')) {
const category = route.split('/shop/')[1];
html = renderShop(category);
const catLabel = category.charAt(0).toUpperCase() + category.slice(1);
updatePageMeta({
title: catLabel + ' | LustreHQ',
description: 'Curated European ' + catLabel.toLowerCase() + ' products, sourced from the finest beauty houses across the continent.',
canonicalPath: '/'
});
} else if (route.startsWith('/product/')) {
const slug = route.split('/product/')[1];
html = renderProduct(slug);
// If product not loaded yet, fetch it
if (!state.products.find(p => p.slug === slug)) {
const data = await api('/products/' + slug);
if (data.success) {
state.products.push(data.product);
html = renderProduct(slug);
}
}
// Update meta after product is loaded
const product = state.products.find(p => p.slug === slug);
if (product) {
const priceFmt = new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(product.price_cents / 100);
// Calculate aggregate rating from reviews if available
let aggregateRating = null;
const reviewsForProduct = PRODUCT_REVIEWS[product.category] || PRODUCT_REVIEWS.default;
if (reviewsForProduct && reviewsForProduct.length > 0) {
const totalStars = reviewsForProduct.reduce((sum, r) => sum + r.stars, 0);
aggregateRating = {
'@type': 'AggregateRating',
'ratingValue': (totalStars / reviewsForProduct.length).toFixed(1),
'reviewCount': reviewsForProduct.length
};
}
// Build Product JSON-LD
const productJsonLd = {
'@context': 'https://schema.org',
'@type': 'Product',
name: product.name,
description: product.description || product.short_description,
image: product.image_url,
brand: { '@type': 'Brand', name: product.brand },
offers: {
'@type': 'Offer',
priceCurrency: 'EUR',
price: (product.price_cents / 100).toFixed(2),
availability: product.in_stock ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock',
url: 'https://lustrehq.polsia.app/p/' + slug
}
};
if (aggregateRating) productJsonLd.aggregateRating = aggregateRating;
// Build BreadcrumbList JSON-LD
const categoryLabel = product.category.charAt(0).toUpperCase() + product.category.slice(1);
const breadcrumbJsonLd = {
'@context': 'https://schema.org',
'@type': 'BreadcrumbList',
itemListElement: [
{ '@type': 'ListItem', position: 1, name: 'Home', item: 'https://lustrehq.polsia.app' },
{ '@type': 'ListItem', position: 2, name: 'Shop', item: 'https://lustrehq.polsia.app/#/shop' },
{ '@type': 'ListItem', position: 3, name: categoryLabel, item: 'https://lustrehq.polsia.app/#/shop/' + product.category },
{ '@type': 'ListItem', position: 4, name: product.name, item: 'https://lustrehq.polsia.app/p/' + slug }
]
};
updatePageMeta({
title: product.name + ' | LustreHQ',
description: product.short_description || product.description,
image: product.image_url,
canonicalPath: '/p/' + slug,
jsonLd: productJsonLd,
breadcrumbJsonLd: breadcrumbJsonLd
});
}
} else if (route === '/cart') {
await fetchCart();
html = renderCart();
updatePageMeta({
title: 'Your Cart | LustreHQ',
description: 'Review your selected European beauty products before checkout.',
canonicalPath: '/'
});
} else if (route === '/guide') {
html = renderGuide();
updatePageMeta({
title: 'The European Skincare Guide | LustreHQ',
description: '5 steps to radiant skin, drawn from French pharmacy culture, Italian botanical tradition, and Scandinavian minimalism.',
canonicalPath: '/#/guide',
image: 'https://lustrehq.polsia.app/og-default.jpg',
jsonLd: {
'@context': 'https://schema.org',
'@type': 'Article',
headline: 'The European Skincare Guide',
description: '5 steps to radiant skin, drawn from French pharmacy culture, Italian botanical tradition, and Scandinavian minimalism.',
datePublished: '2026-04-01',
image: 'https://lustrehq.polsia.app/og-default.jpg',
author: { '@type': 'Organization', name: 'LustreHQ', url: 'https://lustrehq.polsia.app' },
publisher: { '@type': 'Organization', name: 'LustreHQ', url: 'https://lustrehq.polsia.app' },
mainEntityOfPage: { '@type': 'WebPage', '@id': 'https://lustrehq.polsia.app/#/guide' }
}
});
} else if (route.startsWith('/order/')) {
const orderNum = route.split('/order/')[1];
html = renderOrderConfirmation(orderNum);
updatePageMeta({
title: 'Order Confirmed | LustreHQ',
description: 'Your LustreHQ order has been confirmed.',
canonicalPath: '/'
});
// Meta Pixel: Purchase event with real amount
if (typeof fbq === 'function' && state.lastOrder && state.lastOrder.order_number === orderNum) {
fbq('track', 'Purchase', {
value: (state.lastOrder.total_cents / 100).toFixed(2),
currency: 'EUR',
content_type: 'product',
num_items: state.lastOrder.item_count
});
state.lastOrder = null; // Fire only once
}
} else {
html = renderHome();
}
app.innerHTML = html;
updateActiveNav();
initFaq();
window.scrollTo({ top: 0, behavior: 'instant' });
// Track page view for hash routes (server-side page_views uses path; hash routes need client-side tracking)
if (window.__ltk && window.__ltk.push) {
const trackedPath = route === '/' ? '/' : (route.startsWith('/') ? route : '/' + route);
window.__ltk.push('page_view', { page: trackedPath });
}
// Meta Pixel: track SPA page views on route change
if (typeof fbq === 'function') fbq('track', 'PageView');
requestAnimationFrame(() => {
app.classList.remove('page-enter');
app.classList.add('page-active');
});
}
// ─── INIT ───────────────────────────────────────────
async function init() {
getSessionId();
// Load products and cart in parallel
await Promise.all([
fetchProducts(),
fetchCart()
]);
render();
populateTeaser();
}
// Populate scroll teaser with first 4 products
function populateTeaser() {
var container = document.getElementById('teaser-cards');
if (!container || !state.products || state.products.length === 0) return;
var html = state.products.slice(0, 4).map(function(p) {
return '