Malawi (MWKMK)
Mali (XOFFr) Header Image
Malta (EUR€)
Mauritius (MUR₨) Moldova (MDLL)
Monaco (EUR€)
Montenegro (EUR€) Mozambique (GBP£)

Netherlands (EUR€)

Niger (XOFFr)
porates 12x100mm thru-axle dropout, which allows for maximum stiffness to cope with the stresses of disc brakes and eliminate brake rub on hard, out of the saddle efforts.\u003c\/p\u003e\n\u003cp\u003eThis makes the ENVE Road Disc Thru-Axle Fork perfect for cyclists who demand the ultimate in low-weight, high-strength performance with the security of a 12mm thru-axle setup.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eWeighs just 425g\u003c\/li\u003e\n\u003cli\u003e12x100mm thru-axle\u003c\/li\u003e\n\u003cli\u003eAvailable in two rakes (43 or 50mm)\u003c\/li\u003e\n\u003cli\u003eOne-piece moulded design from dropout to steerer tube\u003c\/li\u003e\n\u003cli\u003eFlat-mount disc brake compatible with 140 and 160mm rotors\u003c\/li\u003e\n\u003cli\u003e5-year Factory Limited Warranty and Incidental Damage Protection Programme\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch5\u003ePLEASE NOTE\u003c\/h5\u003e\n\u003cp\u003eThis fork is suitable for disc brake setups and hubs compatible with a 12mm thru-axle only.\
ge-protection-terms\/\"\u003ehttps:\/\/www.enve.com\/support\/incidental-damage-protection-terms\/\u003c\/a\u003e\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\u003ch5\u003eENVE Road Disc Brake Fork - Thru Axle\u003c\/h5\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWheel size\u003c\/td\u003e\n\u003ctd\u003e700c\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWeight\u003c\/td\u003e\n\u003ctd\u003e425g\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMaterial\u003c\/td\u003e\n\u003ctd\u003eCarbon fibre\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSteerer Tube Length\u003c\/td\u003e\n\u003ctd\u003e350mm\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRake\u003c\/td\u003e\n\u003ctd\u003e43 or 50mm\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eAxle to Crown\u003c\/td\u003e\n\u003ctd\u003e370mm\u003c\/td\u003e\n\u003c\/tr\u003e\
07T09:56:31+00:00","created_at":"2025-03-07T09:56:31+00:00","vendor":"Enve","type":"Apparel \u0026 Accessories","tags":["spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled"],"price":62000,"price_min":62000,"price_max":62000,"available":false,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":55174494781823,"title":"1-1\/4 Tapered - 43mm Rake - 12mm Thru","option1":"1-1\/4 Tapered - 43mm Rake - 12mm Thru","option2":null,"option3":null,"sku":"EN320115043DISCV2","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"ENVE Road Disc Fork - Thru-Axle - 1-1\/4 Tapered - 43mm Rake - 12mm Thru","public_title":"1-1\/4 Tapered - 43mm Rake - 12mm Thru","options":["1-1\/4 Tapered - 43mm Rake - 12mm Thru"],"price":62000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"mSlovakia (EUR€) \n\u003cp\u003eThis model incorporates 12x100mm thru-axle dropout, which allows for maximum stiffness to cope with the stresses of disc brakes and eliminate brake rub on hard, out of the saddle efforts.\u003c\/p\u003e\n\u003cp\u003eThis makes the ENVE Road Disc Thru-Axle Fork perfect for cyclists who demand the ultimate in low-weight, high-strength performance with the security of a 12mm thru-axle setup.\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eWeighs just 425g\u003c\/li\u003e\n\u003cli\u003e12x100mm thru-axle\u003c\/li\u003e\n\u003cli\u003eAvailable in two rakes (43 or 50mm)\u003c\/li\u003e\n\u003cli\u003eOne-piece moulded design from dropout to steerer tube\u003c\/li\u003e\n\u003cli\u003eFlat-mount disc brake compatible with 140 and 160mm rotors\u003c\/li\u003e\n\u003cli\u003e5-year Factory Limited Warranty and Incidental Damage Protection Programme\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003ch5\u003ePLEASE NOTE\u003c\/h5\u003e\n\u003cp\u003eThis fork is suitable for disc brake setups and hubs compatib sqPlanEnabled && _sqPreCount); } catch (e) { /* fail open */ } // STOQ-1612: block (not hide) Buy Now / Shop Pay until our JS runs, so a tap in the // load window can't bypass preorder. pointer-events via .stoq-buy-now-pending (no // reflow); timeout releases; renderPreorderButton / featured_product.js lift it. // Gated by the `block_accelerated_checkout` toggle (default OFF) for gradual rollout. // Armed ONLY when we're sure preorder is in play — product page: THIS product has a // preorder variant (never block a plain product's Shop Pay); featured: integration // enabled for this page type. Rationale: PR #2784. try { var _sqc = window._RestockRocketConfig; var _sqOn = !!(_sqc.cachedSettings && _sqc.cachedSettings.block_accelerated_checkout); var _sqPre = (_sqc.cachedPreorderVariantIds && _sqc.cachedPreorderVariantIds.preorder_variant_ids) || []; var _sqArm = false; if (_sqOn && _sqc.preordersConfigured) { if (_sqc.pageType === 'product' && _sqc.product && < < che age if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) { console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh'); window._RestockRocketConfig.isLiquidCacheFresh = true; window._RestockRocketConfig.liquidCacheAge = null; } else { const now = Math.floor(Date.now() / 1000); // Current time in seconds const liquidCacheAge = now - liquidRenderedAt; // Age in seconds // Surfaced into funnel events: a stale cache means the app rendered with // outdated inventory/selling-plan data — a real "had the opportunity but // failed" cause. Negative (client clock ahead) clamps to 0. window._RestockRocketConfig.liquidCacheAge = Math.max(0, liquidCacheAge); // Handle client clock ahead of server if (liquidCacheAge
0) { console.debug(`STOQ - Client clock appears ahead of server by ${Math.abs(Math.round(liquidCacheAge / 60))} minutes, assuming cache fresh`); window._RestockRocketConfig.isLiquidCacheFresh = true; } else if (liquidCacheAge South Africa (GBP£)
= LIQUID_CACHE_MAX_AGE) { console.debug(`STOQ - Liquid cache is fresh (${Math.round(liquidCacheAge / 60)} minutes old)`); window._RestockRocketConfig.isLiquidCacheFresh = true; } else { console.debug(`STOQ - Liquid cache is stale (${Math.round(liquidCacheAge / 60)} minutes old, max ${Math.round(LIQUID_CACHE_MAX_AGE / 60)} minutes)`); window._RestockRocketConfig.isLiquidCacheFresh = false; } } function checkSettingsExpiry(settings) { try { if (!settings || !settings.updated_at) { console.debug('STOQ - Invalid settings data structure'); return null; } if (!settings.cache) { console.debug('STOQ - settings caching disabled'); return null; } // Check if translations are enabled but missing from cache // This handles the backfill period where DB has translations but metafield doesn't if (settings.multi_language_enabled) { if (!settings.translations) { // Translations enabled but no age = Date.now() - updatedAt.getTime(); if (age
SETTINGS_CACHE_DURATION) { console.debug('STOQ - settings changed recently, skipping cache'); return null; } return settings; } catch (error) { console.debug('STOQ - Error checking settings cache:', error); return null; } } function createRestockRocketContainer() { const restockRocketContainer = document.createElement('div'); restockRocketContainer.id = 'restock-rocket'; document.body.appendChild(restockRocketContainer); } function createRestockRocketScript(scriptUrl) { const restockRocketScriptElement = document.createElement('script'); restockRocketScriptElement.setAttribute('defer', 'defer'); restockRocketScriptElement.src = scriptUrl; document.body.appendChild(restockRocketScriptElement); } createRestockRocketContainer() console.debug('STOQ - extension activated') // Fire stoq_initialized once per page load so the funnel pipeline has a definitive // "our code ran on this page" signal independent of any cus
onStorage.getItem('_stoq_pls') || '0', 10) || 0) + 1; window.sessionStorage.setItem('_stoq_pls', String(_stoqPageSeq)); } catch (e) { /* sessionStorage unavailable (private mode) — leave 0 */ } Shopify?.analytics?.publish?.('stoq_initialized', { cart_token: _stoqInitConfig.cartToken || '', page_url: window.location.href, page_type: _stoqInitConfig.pageType || '', shop_domain: _stoqInitConfig.shop || '', market_id: _stoqInitConfig.marketId || '', // Buyer's storefront country (localization.country.iso_code). Seeds the // pixel's extension_details blob so it rides forward onto Shopify's native // events too — a market can span countries, so this is the finer signal. country_code: _stoqInitConfig.countryIsoCode || '', detected_variant_ids: _stoqDetectedVariantIds, selected_variant_id: _stoqSelectedVariantId || '', page_load_seq: _stoqPageSeq, liquid_rendered_at: _stoqInitConfig.liquidRenderedAt || 0, app_versionSouth Sudan (GBP£) rm so it's correct on collection/index/search too. block_accelerated_checkout // context (STOQ-1612) rides in `properties` (forwarded verbatim by the pixel, no schema // change): a buy_now click on a preorder variant while the gate was armed is a visible // bypass signal for order debug. Also sends page_url (top-level, like the pixel's native // events) and two preorder signals in properties (see below). try { var _sqTrack = window._RestockRocketConfig; if (_sqTrack.preordersConfigured) { document.addEventListener('click', function (e) { try { var t = e.target; if (!t || !t.closest) return; var host = t.closest('.shopify-payment-button, shopify-payment-terms'); if (!host) return; var channel = host.matches && host.matches('shopify-payment-terms') ? 'shop_pay_installments' : 'buy_now'; var form = host.closest('form'); var vidEl = form && form.querySelector('[name="id"]'); var variantId =
k.marketId || '', country_code: _sqTrack.countryIsoCode || '', page_type: _sqTrack.pageType || '', cart_token: _sqTrack.cartToken || '', page_url: (window.location && window.location.href) || '', properties: { // Mirror the bundle's own preorder check (preorder.js checkInventoryProvider- // WithCachedFallback): the live set config.preorderVariantIds (refreshed after // page load by loadVariantInventoryData) OR the Liquid-injected // cachedPreorderVariantIds — always present, so it covers clicks before the // bundle loads (why this tracker is inline). ORing both (not preferring one) // matches the bundle and is correct even if the live set is an empty array. Both // hold integer ids; the click-time id comes off a DOM input (.value → string) or // selected_variant_id, so coerce with Number for a like-typed compare. is_preord
instock_variant: (function () { var has = function (a) { return Array.isArray(a) && a.indexOf(_sqVidNum) !== -1; }; return has(_sqTrack.inStockVariantIds) || has(_sqTrack.cachedInStockVariantIds && _sqTrack.cachedInStockVariantIds.in_stock_variant_ids); })(), // The enrolled plan's Shopify selling-plan id + inventory_provider (stoq = STOQ tracks // the OOS count; shopify = in-stock preorder). Tells order-debug what kind of preorder // the Buy Now bypassed, without a downstream lookup. enrolled_plan_id: (_sqPlan && (_sqPlan.shopify_selling_plan_id || _sqPlan.shopify_selling_plan_group_id)) || '', enrolled_plan_provider: (_sqPlan && _sqPlan.inventory_provider) || '', block_enabled: !!(_sqTrack.cachedSettings && _sqTrack.cachedSettings.block_accelerated_checkout), gate_armed: !!_sqTrack.acceleratedGateArmed, gate_active
return settings; } console.debug(`STOQ - Applying translations for normalized locale: ${normalizedLocale} (original: ${window._RestockRocketConfig.locale})`); const translatedFields = translations[normalizedLocale]; if (translatedFields && typeof translatedFields === 'object') { Object.keys(translatedFields).forEach(function(key) { const value = translatedFields[key]; if (value !== null && value !== undefined && value !== '') { settings[key] = value; } }); } else { console.debug('STOQ - No translated fields found for locale:', normalizedLocale); } delete settings.translations; return settings; } catch (e) { console.debug('STOQ - error applying translations:', e); return settings; } } // Setup event listener for cart selling plan updates // This must be called before any scripts are loaded to avoid race conditions function setupCartSellingPlanUpdater(settings) { Spain (EUR€)
ned `cachedSettings` comes from the app-embed Liquid render, which // Shopify edge-caches and can serve stale. Reading the same `settings` metafield // back over the Storefront API is a POST to /api/
Switzerland (CHFCHF)
Türkiye (GBP£)
The Looney Bin is the place for those that just can't get along with the rest. Not every bottle is a 73mm and not everyone wants to use a "regular" bottle while on their bike. The Looney Bin will hold anything from a convenience store bottle of H2O to a nice bottle of Pinot Noir.Ukraine (UAH₴)
United Kingdom (GBP£)
United States (GBP£)

Frequently Asked Questions Vatican City (EUR€)

  • Western Sahara (MADد.م.)