- Iceland (ISKkr) Building Your Bike From the Box Moldova (MDLL) Insure Your Bike Ireland (EUR€)
- Privacy Policy Monaco (EUR€) Isle of Man (GBP£) Cookie Policy
- Add to CartMontenegro (EUR€) £1,849.99 Italy (EUR€) Terms of Service £1,849.99
- Morocco (MADد.م.) Refund policy Jersey (GBP£) Mozambique (GBP£) Service
- Kenya (KESKSh) Namibia (GBP£) Servicing Kosovo (EUR€)
- Book a Service Netherlands (EUR€) Latvia (EUR€) Workshop Prices
- Niger (XOFFr) Lesotho (GBP£) Cycle to Work
- Nigeria (NGN₦) Delivery & Returns Liberia (GBP£) InformationNorth Macedonia (MKDден) Mon - Fri: 08:30 - 17:30
- Libya (GBP£) Sat: 9:00 - 16:00 Sun: Closed 0131 374 5324Norway (GBP£) Newington Road Liechtenstein (CHFCHF) Edinburgh
- EH9 1QN [email protected]Poland (PLNzł) Lithuania (EUR€)
Namibia (GBP£)
Benin (XOFFr)South Sudan (GBP£)
Netherlands (EUR€)
Bosnia & Herzegovina (BAMКМ)Spain (EUR€)
Niger (XOFFr)
Botswana (BWPP)St. Helena (SHP£)
-
Nigeria (NGN₦)
-
British Indian Ocean Territory (USD$)
Svalbard & Jan Mayen (GBP£)
Sudan (GBP£)
North Macedonia (MKDден)Bulgaria (EUR€)
Norway (GBP£)
-
Burkina Faso (XOFFr)
Switzerland (CHFCHF)
Sweden (SEKkr)
Poland (PLNzł)Burundi (BIFFr)
Portugal (EUR€)
-
Cameroon (XAFCFA)
Togo (XOFFr)
Tanzania (TZSSh)
Réunion (EUR€)Cape Verde (CVE$)
Romania (RONLei)
-
Central African Republic (XAFCFA)
Tunisia (GBP£)
Tristan da Cunha (GBP£)
Rwanda (RWFFRw)Chad (XAFCFA)
San Marino (EUR€)
-
Comoros (KMFFr)
Uganda (UGXUSh)
Türkiye (GBP£)
São Tomé & Príncipe (STDDb)Congo - Brazzaville (XAFCFA)
Senegal (XOFFr)
-
Congo - Kinshasa (CDFFr)
United Kingdom (GBP£)
Ukraine (UAH₴)
Serbia (RSDРСД)Côte d’Ivoire (XOFFr)
Seychelles (GBP£)
- Croatia (EUR€)
Vatican City (EUR€)
United States (GBP£)
Sierra Leone (SLLLe)Cyprus (EUR€)
Slovakia (EUR€)
- Czechia (CZKKč)
Zambia (GBP£)
Western Sahara (MADد.م.)
Slovenia (EUR€)Denmark (DKKkr.)
Somalia (GBP£)
- Djibouti (DJFFdj)
Zimbabwe (USD$)
South Africa (GBP£)Egypt (EGPج.م)
South Sudan (GBP£)
- Equatorial Guinea (XAFCFA)
.
Spain (EUR€)Eritrea (GBP£) © 2026,
ProjektRide
St. Helena (SHP£)
- Estonia (EUR€)
Powered by
ShopifyAmerican Express
.
Sudan (GBP£)Eswatini (GBP£)
Svalbard & Jan Mayen (GBP£)
- Ethiopia (ETBBr)
Apple PayDiscover
Sweden (SEKkr)Faroe Islands (DKKkr.) Diners Club
Switzerland (CHFCHF)
- Finland (EUR€)
Google Pay
KlarnaTanzania (TZSSh)France (EUR€)
Maestro
MastercardTogo (XOFFr)
- French Southern Territories (EUR€)
Shop Pay
PayPal
Tristan da Cunha (GBP£)Gabon (XOFFr) Satispay
Tunisia (GBP£)
- Gambia (GMDD)
Union Pay
VisaTürkiye (GBP£)Georgia (GBP£)
Uganda (UGXUSh)
- Germany (EUR€)
Ukraine (UAH₴)Ghana (GBP£)
United Kingdom (GBP£)
- Gibraltar (GBP£)
United States (GBP£)Greece (EUR€)
Vatican City (EUR€)
- Greenland (DKKkr.)
Western Sahara (MADد.م.)Guadeloupe (EUR€)
Zambia (GBP£)
- Guernsey (GBP£)
Zimbabwe (USD$)Guinea (GNFFr)
- Guinea-Bissau (XOFFr)
ProjektRide
Hungary (HUFFt)
© 2026,
. - Iceland (ISKkr)
Powered by
CloseShopify
.Ireland (EUR€)
American Express - Isle of Man (GBP£)
Apple Pay
Italy (EUR€)
Diners Club
Discover - Jersey (GBP£)
Google PayMaestro
Kenya (KESKSh) Klarna
- Kosovo (EUR€)
Mastercard
PayPalLatvia (EUR€)
Satispay
Shop Pay - Lesotho (GBP£)
Union Pay
Liberia (GBP£) Visa
Libya (GBP£)
-
Close
pageType === 'product' && _sqc.product && _sqc.product.variants) { _sqArm = _sqc.product.variants.some(function (v) { return _sqPre.indexOf(Number(v.id)) !== -1 || _sqAlways.indexOf(Number(v.id)) !== -1 || _sqAllocAlways(Number(v.id)) || (_sqc.inlinePreorderIdsDropped === true && (_sqc.variantsInventoryPolicy || {})[v.id] === 'continue' && (_sqc.variantsInventoryQuantity || {})[v.id]
-
= 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;
}
if (settings.multi_language_enabled) {
if (!settings.translations) {
console.debug('STOQ - multi-language enabled but no translation data in cache, fetching fresh');
return null;
}
if (window._RestockRocketConfig.normalizedLocale &
.body.appendChild(plainScriptElement);
};
restockRocketScriptElement.src = scriptUrl;
document.body.appendChild(restockRocketScriptElement);
}
createRestockRocketContainer()
console.debug('STOQ - extension activated')
try {
const _stoqInitConfig = window._RestockRocketConfig;
const _stoqDetectedVariantIds = (_stoqInitConfig.product && Array.isArray(_stoqInitConfig.product.variants))
? _stoqInitConfig.product.variants.map(function(v) { return v.id })
: [];
const _stoqSelectedVariantId = _stoqInitConfig.selected_variant_id;
var _stoqPageSeq = 0;
try {
_stoqPageSeq = (parseInt(window.sessionStorage.getItem('_stoq_pls') || '0', 10) || 0) + 1;
window.sessionStorage.setItem('_stoq_pls', String(_stoqPageSeq));
} catch (e) { }
Shopify?.analytics?.publish?.('stoq_initialized', {
cart_token: _stoqInitConfig.cartToken || '',
page_url: window.location.origin + window.location.pathname,
page_type: _stoqInitConfig.pageType || '',
.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 = (vidEl && vidEl.value) || _sqTrack.selected_variant_id || ''; var _sqVidNum = Number(variantId); var _sqPlan = null; var _sqPlans = Array.isArray(_sqTrack.sellingPlans) ? _sqTrack.sellingPlans : []; var _sqMktId = Number(_sqTrack.marketId); var _sqOffersOn = !!(_sqTrack.readFlags && _sqTrack.readFlags.enable_storefront_plan_offers === true); var _sqAlloc = _sqOffersOn ? ((_sqTrack.offerAllocations && _sqTrack.offerAllocations[_sqVidNum]) || (_sqTrack.variantSellingPlanIds && _sqTrack.variantSellingPlanIds[_sqVidNum])) : null; var _sqPlanIds = function (pl)ngs configured for ${window._RestockRocketConfig.pageType}`); const staleRefresh = !window._RestockRocketConfig.isLiquidCacheFresh && !settings.disable_refresh_on_stale_liquid; if (staleRefresh) { console.debug('STOQ - refreshing selling_plans + integrations (Liquid cache stale)'); Promise.race([ Promise.all([refreshSellingPlans(), refreshIntegrations()]), new Promise(function(resolve) { setTimeout(resolve, 1000); }) ]).then(function() { loadScripts(settings); }); return; } loadScripts(settings); } function loadScripts(settings) { setupCartSellingPlanUpdater(settings); if(settings.enable_app) { const hijackIntegration = window._RestockRocketConfig.integrations.find(function(integration) { return integration.type === 'hijack' && integration.enabled && integration.page_types.includes(window._RestockRocketConfig.pageType); }) const hasEnabledOffer = Array.isArray(window._RestockRocketConfig.sellingPlans) && wr.message); }); } function refreshShopConfig(source) { const cfg = window._RestockRocketConfig; const viaEmbed = function() { return fetchEmbedConfig(source.endpoint, source.apply); }; const flagOn = !!cfg.readFlags && cfg.readFlags[source.flag] === true; if (!flagOn) { return viaEmbed(); } return fetchStorefrontShopMetafield(source.metafieldKey) .then(function(value) { if (!source.isValid(value)) { throw new Error(source.metafieldKey + ' metafield is not a valid ' + source.endpoint + ' payload'); } source.apply(value); console.debug('STOQ - refreshed ' + source.endpoint + ' from the Storefront API'); }) .catch(function(error) { console.debug('STOQ - Storefront ' + source.endpoint + ' read failed, using embed:', error.message); return viaEmbed(); }); } function refreshIntegrations() { const cfg = window._RestockRocketConfig; return refreshShopConfig({ endpoint: 'integrations', metafieldKey: 'in
_sqPlans.forEach(function (pl) { if (!_sqPlan && _sqForVariant(pl) && !pl.markets_enabled) { _sqPlan = pl; } }); } Shopify?.analytics?.publish?.('stoq_accelerated_checkout_clicked', { variant_id: variantId, product_id: (_sqTrack.product && _sqTrack.product.id) || '', channel: channel, market_id: _sqTrack.marketId || '', country_code: _sqTrack.countryIsoCode || '', page_type: _sqTrack.pageType || '', cart_token: _sqTrack.cartToken || '', page_url: (window.location && window.location.origin + window.location.pathname) || '', properties: { is_preorder_variant: (function () { var vid = Number(variantId); var has = function (a) { return Array.isArray(a) && a.indexOf(vid) !== -1; }; return has(_sqTrack.preorderVariantIds) || has(_sqTrack.cachedPreorderVariantIds && < lassList.contains('stoq-buy-now-pending')), blocked: (function () { try { var rr = window._RestockRocket; return !!(rr && typeof rr.willBlockAcceleratedClick === 'function' && rr.willBlockAcceleratedClick(e)); } catch (err) { return false; } })(), }, }); } catch (err) { } }, true); } } catch (e) { } function applyTranslations(settings) { try { if (!settings || !settings.multi_language_enabled) { return settings; } if (!settings.translations) { console.debug('STOQ - No translations found, skipping translation'); return settings; } const normalizedLocale = window._RestockRocketConfig.normalizedLocale; const translations = settings.translations; if (!normalizedLocale) { console.debug('STOQ - No matching locale for translations. Available:', Object.keys(translations || {})); 'STOQ - Inventory data loaded, updating cart selling plans'); if (window._RestockRocket && window._RestockRocket.updateCartSellingPlans) { window._RestockRocket.updateCartSellingPlans() .then(hasUpdates => { if (hasUpdates) { console.debug('STOQ - cart selling plans updated successfully'); } else { console.debug('STOQ - no cart selling plan updates needed'); } }) .catch(error => { console.error('STOQ - error updating cart selling plans:', error); }); } }); } function storefrontGraphql(query, variables) { const cfg = window._RestockRocketConfig; let token = cfg.storefrontAccessToken || null; if (!token && typeof cfg.sk === 'string' && cfg.sk !== '') { try { token = atob(cfg.sk).split('').reverse().join('') || null; } catch (e) { token = null; } } if (!token || cfg.disableStorefrontApi === true) { return Promise.reject(new Error('Storefro urn storefrontGraphql(query, { namespace: cfg.metafieldNamespace, key: key }) .then(function(data) { const value = data && data.shop && data.shop.metafield && data.shop.metafield.value; if (!value) { throw new Error('Storefront API returned no ' + key + ' metafield value'); } return JSON.parse(value); }); } function fetchStorefrontSettings() { const query = 'query StoqSettings($namespace: String!) { shop { settings: metafield(namespace: $namespace, key: "settings") { value } translations: metafield(namespace: $namespace, key: "settings_translations") { value } } }'; return storefrontGraphql(query, { namespace: window._RestockRocketConfig.metafieldNamespace }) .then(function(data) { const settings = JSON.parse(data.shop.settings.value); if (!settings.updated_at) { throw new Error('settings metafield is not a settings payload'); } if (settings.single_locale_translations_inline) { settings.translations = data.shop.translations && JSON.parse(data
const storefrontRead = window._RestockRocketConfig.readFlags?.enable_storefront_settings_read === true ? Promise.race([ fetchStorefrontSettings(), new Promise(function(_, reject) { setTimeout(function() { reject(new Error('timed out')); }, 1500); }) ]).catch(function(error) { console.debug('STOQ - Storefront settings read failed, using setting.json:', error.message); }) : Promise.resolve(); storefrontRead .then(function(settings) { return settings || fetch( `${window._RestockRocketConfig.host}/api/v1/setting.json?translation_locale=${window._RestockRocketConfig.normalizedLocale}`, { headers } ) .then(function(response) { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }); }) .then(function(settings) { initializeScripts(settings); }) .catch(function(error) { if (cachedSettings) { console.de
- ionScriptUrl = preorderUiOnPage ? window._RestockRocketConfig.scriptUrlCollectionFull : window._RestockRocketConfig.scriptUrlCollection; const collectionScriptUrl = usePreorderBuild ? preorderCollectionScriptUrl : window._RestockRocketConfig.scriptUrlCollectionBis; const productScriptUrl = usePreorderBuild ? window._RestockRocketConfig.scriptUrlProduct : window._RestockRocketConfig.scriptUrlProductBis; const collectionPageTypes = ['collection', 'index', 'search', 'page']; if(collectionPageTypes.indexOf(pageType) !== -1 && (settings[`show_button_on_${pageType}`] || settings[`preorder_${pageType}_enabled`])) { createRestockRocketScript(collectionScriptUrl); } else if(pageType === 'product') { createRestockRocketScript(productScriptUrl); } else if(hijackIntegration) { createRestockRocketScript(preorderCollectionScriptUrl); } else if(usePreorderBuild) { createRestockRocketScript(preorderColl







