Georgia (GBP£)
Header Image
Germany (EUR€)
Greenland (DKKkr.)
Egypt (EGPج.م) Gibraltar (GBP£)
Guernsey (GBP£) Guinea-Bissau (XOFFr)
Estonia (EUR€)
Guadeloupe (EUR€)
Hungary (HUFFt)
Eswatini (GBP£) Add order notes
Guernsey (GBP£) Iceland (ISKkr)

Jersey (GBP£) < Mauritius (MUR₨) & !Object.prototype.hasOwnProperty.call(settings.translations, window._RestockRocketConfig.normalizedLocale)) { console.debug('STOQ - locale not explicitly translated, will use default language from cache'); } } const updatedAt = new Date(settings.updated_at); if (isNaN(updatedAt.getTime())) { console.debug('STOQ - Invalid updated_at date format in settings'); return null; } const age = Date.now() - updatedAt.getTime(); if (age
Montenegro (EUR€) About Us 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.crossOrigin = 'anonymous'; restockRocketScriptElement.onerror = function () { restockRocketScriptElement.onerror = null; const plainScriptElement = document.createElement('script'); plainScriptElement.setAttribute('defer', 'defer'); plainScriptElement.src = scriptUrl; document
Kosovo (EUR€) Blognt API unavailable')); } return fetch( `https://${cfg.shop}/api/${cfg.storefrontApiVersion}/graphql.json`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Shopify-Storefront-Access-Token': token, }, body: JSON.stringify({ query: query, variables: variables }), } ) .then(function(response) { if (!response.ok) { throw new Error('Storefront API HTTP ' + response.status); } return response.json(); }) .then(function(body) { if (body && body.errors && body.errors.length) { throw new Error('Storefront API errors: ' + body.errors.map(function(e) { return e && e.message; }).join(', ')); } return body && body.data; }); } function fetchStorefrontShopMetafield(key) { const cfg = window._RestockRocketConfig; const query = 'query StoqShopMetafield($namespace: String!, $key: String!) { shop { metafield(namespace: $namespace, key: $key) { value } } }'; ret
Moldova (MDLL) .shop.translations.value); } if (settings.multi_language_enabled && !settings.translations) { throw new Error('settings metafield carries no translations'); } return settings; }); } const cachedSettings = window._RestockRocketConfig.cachedSettings; const validCachedSettings = cachedSettings ? checkSettingsExpiry(cachedSettings) : null; if (validCachedSettings) { console.debug('STOQ - using cached settings'); initializeScripts(validCachedSettings); } else { console.debug('STOQ - fetching fresh settings'); const headers = { 'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.Shopify.shop, 'ngrok-skip-browser-warning': 'skip' }; if (window.Shopify?.theme?.role === 'main') { headers['X-Shopify-Theme-Schema-Name'] = window.Shopify.theme.schema_name; headers['X-Shopify-Theme-Schema-Version'] = window.Shopify.theme.schema_version; headers['X-Shopify-Theme-Store-Id'] = window.Shopify.theme.theme_store_id; }
Mozambique (GBP£) bug('STOQ - using expired cached settings as fallback'); initializeScripts(cachedSettings); } else { console.error('STOQ - failed to load settings:', error); } }) .catch(function(e) { console.error(e) }) } function fetchEmbedConfig(endpoint, apply) { return fetch( `${window._RestockRocketConfig.host}/api/v1/embed/${endpoint}.json`, { headers: { 'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.Shopify.shop, 'ngrok-skip-browser-warning': 'skip' } } ) .then(function(response) { if (!response.ok) throw new Error(`Failed to fetch ${endpoint}`); return response.json(); }) .then(function(data) { try { apply(data); } catch (applyE
Track Service Progress.message); return viaEmbed(); }); } function refreshIntegrations() { const cfg = window._RestockRocketConfig; return refreshShopConfig({ endpoint: 'integrations', metafieldKey: 'integrations', flag: 'enable_storefront_integrations_read', isValid: function(value) { return Array.isArray(value); }, apply: function(data) { cfg.integrations = data; } }); } function refreshSellingPlans() { const cfg = window._RestockRocketConfig; return refreshShopConfig({ endpoint: 'selling_plans', metafieldKey: 'cachedSellingPlans', flag: 'enable_storefront_selling_plans_read', isValid: function(value) { return !!value && Array.isArray(value.plans); }, apply: function(data) { cfg.sellingPlans = data.plans; cfg.disabledSellingPlanIds = data.disabled_plan_ids || []; if (data && data.read_flags && typeof data.read_flags === 'object' && !Array.isArray(data.read_flags)) { cfg.readFlags =Latvia (EUR€) === 'hijack' && integration.enabled && integration.page_types.includes(window._RestockRocketConfig.pageType); }) const hasEnabledOffer = Array.isArray(window._RestockRocketConfig.sellingPlans) && window._RestockRocketConfig.sellingPlans.some(function(plan) { return plan && plan.enabled; }); const hasDisabledPlanIds = Array.isArray(window._RestockRocketConfig.disabledSellingPlanIds) && window._RestockRocketConfig.disabledSellingPlanIds.length > 0; const usePreorderBuild = settings.preorder_enabled || hasEnabledOffer || hasDisabledPlanIds; const pageType = window._RestockRocketConfig.pageType; const preorderUiOnPage = (settings.preorder_enabled && settings[`preorder_${pageType}_enabled`]) || window._RestockRocketConfig.integrations.some(function(integration) { return (integration.type === 'quick_buy' || integration.type === 'featured_product') && integration.enabled && integration.page_types.includes(pageType); }) Monaco (EUR€) ockRocketScript(productScriptUrl); } else if(hijackIntegration) { createRestockRocketScript(preorderCollectionScriptUrl); } else if(usePreorderBuild) { createRestockRocketScript(preorderCollectionScriptUrl); } else { console.debug(`STOQ - no scripts enabled for ${pageType}`); } const wishlistIntegration = window._RestockRocketConfig.integrations.find(function(integration) { return integration.type === 'wishlist' && integration.enabled; }); if (wishlistIntegration) { createRestockRocketScript(window._RestockRocketConfig.scriptHost + 'restockrocket-wishlist.js'); if ((wishlistIntegration.page_types || []).indexOf(pageType) !== -1) { let wishlistHeartsRequested = false; const wishlistHeartTarget = pageType === 'product' ? '[data-stoq-wishlist-heart]' : '[data-stoq-wishlist-heart], a[href*="/products/"]'; // A product page's heart places itself on the product image unless the merchant turned that off. Namibia (GBP£) Building Your Bike From the BoxguestWishlist = window._RestockRocketConfig.customer && !localStorage.getItem('stoq_wl_c') && JSON.parse(localStorage.getItem('stoq_wl')); if (Array.isArray(guestWishlist) && guestWishlist.length) { createRestockRocketScript(window._RestockRocketConfig.scriptHost + 'restockrocket-wishlist-prompt.js'); } } catch (e) {} } const appLoadedEvent = new CustomEvent('stoq:loaded', { detail: { pageType: window._RestockRocketConfig.pageType, enabled: settings.enable_app, settings: settings, preorderEnabled: settings.preorder_enabled } }); console.debug('STOQ - dispatching app loaded event'); window.dispatchEvent(appLoadedEvent); } }
html.stoq-buy-now-pending .shopify-payment-button{pointer-events:none!important}Lesotho (GBP£) Montenegro (EUR€) Insure Your Bike Liberia (GBP£) Privacy Policy Morocco (MADد.م.) Niger (XOFFr) Cookie Policy Nigeria (NGN₦) Terms of Service Liechtenstein (CHFCHF) Namibia (GBP£) Refund policyLithuania (EUR€) Netherlands (EUR€)
Norway (GBP£)
Niger (XOFFr)
Poland (PLNzł) Open cart
Madagascar (GBP£) Nigeria (NGN₦) Malawi (MWKMK) Slovakia (EUR€) South Sudan (GBP£) Nigeria (NGN₦) North Macedonia (MKDден) Norway (GBP£) Enigma South Africa (GBP£)
Sudan (GBP£)
FrogPoland (PLNzł)
South Sudan (GBP£)
Svalbard & Jan Mayen (GBP£) Kona
Portugal (EUR€)
Spain (EUR€) Surly
Sweden (SEKkr)
Sudan (GBP£)
Switzerland (CHFCHF) Custom Builds for sale Tunisia (GBP£)
Senegal (XOFFr) Custom Build Inspiration
Tanzania (TZSSh)
Türkiye (GBP£) Serbia (RSDРСД)
Togo (XOFFr)
Uganda (UGXUSh)


Seychelles (GBP£) Services
Tristan da Cunha (GBP£)

Ukraine (UAH₴)

Workshop

Sierra Leone (SLLLe)

Tunisia (GBP£) Workshop Prices United Kingdom (GBP£) Slovakia (EUR€) Book a Service United States (GBP£) Track Your ServiceSlovenia (EUR€) Vatican City (EUR€) Somalia (GBP£) Ukraine (UAH₴) Western Sahara (MADد.م.) Cycle To Work SchemesSouth Africa (GBP£) Book a ServiceParts & ComponentsTent BoxStemsHeadsetsBrakesComplete BrakesBrake PadsFront SuspensionRear SuspensionFinishing KitTyresTubelessSeat Posts & ClampsGears & DrivetrainE-bike Batteries and chargers WheelsComplete WheelsTubelessTools & MaintenanceClothing and ProtectionProjektRide MerchandiseHelmetsGlovesClothingSocksEssentialsCleaners, Degreasers and LubricationMaintenanceSell Your BikeContact UsFinanceOpen search bar
Türkiye (GBP£)
Uganda (UGXUSh) Other Custom Builds
United Kingdom (GBP£) Insure Your Bike
Brands
Cockpit Handlebars
Grips & Bar-Tape
Brake Rotors
Brake Spares Forks
Tubes
Saddles
Pedals
Components
Accessories
Search for products on our site