Shipping & Returns

Free Shipping on Orders Over €50 Standard 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 EU All orders are dispatched from our European warehouse. Estimated delivery: 2–5 business days depending on your country.
14-Day Returns Changed 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 Stripe Your payment information is encrypted end-to-end. We never store your card details. Powered by Stripe, trusted by millions worldwide.
} // ─── 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 '
' + ' + p.name + ' + '
' + '
' + p.brand + '
' + '
' + p.name + '
' + '
'; }).join(''); container.innerHTML = html; } window.addEventListener('hashchange', render); window.addEventListener('keydown', (e) => { if (e.key === 'Escape' && state.quickViewProduct) closeQuickView(); }); window.addEventListener('popstate', () => { // Sync shopCategory with URL on browser back/forward const hash = window.location.hash.replace('#', '') || '/'; if (hash.startsWith('/shop/')) { state.shopCategory = hash.split('/shop/')[1] || null; } else if (hash === '/shop') { state.shopCategory = null; } render(); }); init();