Custom Builds
See More
Workshop
<
{
var ids = [pl.shopify_selling_plan_id, pl.default_shopify_selling_plan_id];
(Array.isArray(pl.payment_options) ? pl.payment_options : []).forEach(function (o) { ids.push(o && o.shopify_selling_plan_id); });
return ids.filter(function (id) { return id != null; }).map(Number);
};
var _sqForVariant = function (pl) {
if (!pl || !pl.enabled) return false;
if (Array.isArray(_sqAlloc)) {
var ids = _sqPlanIds(pl);
return _sqAlloc.some(function (id) { return ids.indexOf(Number(id)) !== -1; });
}
return Array.isArray(pl.variant_ids) && pl.variant_ids.indexOf(_sqVidNum) !== -1;
};
_sqPlans.forEach(function (pl) {
if (!_sqPlan && _sqForVariant(pl) && pl.markets_enabled &&
Array.isArray(pl.shopify_market_ids) &&
pl.shopify_market_ids.indexOf(_sqMktId) !== -1) { _sqPlan = pl; }
});
if (!_sqPlan) {
Custom Build Inspiration
E-bike Batteries and chargers
Complete Wheels
See Moreons/01a1bb99-5192-7a53-8683-13acad609f70/restockrocket-1-637/assets/restockrocket-collection-full.js'
window._RestockRocketConfig.scriptUrlProductBis = 'https://cdn.shopify.com/extensions/01a1bb99-5192-7a53-8683-13acad609f70/restockrocket-1-637/assets/restockrocket-product-bis.js'
window._RestockRocketConfig.scriptUrlCollectionBis = 'https://cdn.shopify.com/extensions/01a1bb99-5192-7a53-8683-13acad609f70/restockrocket-1-637/assets/restockrocket-collection-bis.js'
window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1)
window._RestockRocketConfig.host = (window._RestockRocketConfig.cachedSettings && window._RestockRocketConfig.cachedSettings.api_host) || 'https://ext.stoqapp.com'
try {
const _stoqVersionMatch = window._RestockRocketConfig.scriptHost.match(/(\d+)\/?(?:assets\/?)?$/);
window._RestockRocketConfig.appVersion = (_stoqVersionMatch && _stoqVersionMatch[1]) || '';
} catch (Tubeless
&
!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
Complete Wheels 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;
documentProjektRide Merchandise
shop_domain: _stoqInitConfig.shop || '',
market_id: _stoqInitConfig.marketId || '',
country_code: _stoqInitConfig.countryIsoCode || '',
detected_variant_ids: _stoqDetectedVariantIds,
selected_variant_id: _stoqSelectedVariantId || '',
page_load_seq: _stoqPageSeq,
liquid_rendered_at: _stoqInitConfig.liquidRenderedAt || 0,
app_version: _stoqInitConfig.appVersion || '',
liquid_cache_age: _stoqInitConfig.liquidCacheAge,
inventory_policy: (_stoqInitConfig.variantsInventoryPolicy || {})[_stoqSelectedVariantId] || '',
inventory_quantity: (_stoqInitConfig.variantsInventoryQuantity || {})[_stoqSelectedVariantId],
});
} catch (e) {
console.debug('STOQ - stoq_initialized publish failed:', e);
}
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
_sqTrack.cachedPreorderVariantIds.preorder_variant_ids) ||
(_sqTrack.inlinePreorderIdsDropped === true && (_sqTrack.variantsInventoryPolicy || {})[vid] === 'continue' &&
(_sqTrack.variantsInventoryQuantity || {})[vid] Helmets
= 0);
})(),
in_enabled_plan: !!_sqPlan,
is_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);
})(),
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 === false) &&
!(_sqTrack.readFlags && _sqTrack.readFlags.accelerated_block_off === true),
gate_armed: !!_sqTrack.acceleratedGateArmed,
gate_active_at_click: !!(document.documentElement &&
document.documentElement.c
delete settings.translations;
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;
}
}
function setupCartSellingPlanUpdater(settings) {
window.addEventListener('stoq:inventory-data-loaded', function(event) {
console.debug(
Tubeless
ication/json',
'X-Shopify-Storefront-Access-Token': cfg.storefrontAccessToken,
},
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 } } }';
return storefrontGraphql(query, { namespace: cfg.metafieldNamespace, key: key })
.then(function(data) {
const value = data && data.shop && data.shop.metafield && data.shop.metaGloves
New Bikes
Tubeless 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; } const storefrontRead = window._RestockRocketConfig.readFlags?.enable_storefront_settings_read === true ? Promise.race([ fetchStorefrontSettings(), new Promi
} }) .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 (applyError) { console.error('STOQ - apply failed for ' + endpoint + ':', applyError); throw applyError; } }) .catch(function(error) { console.debug(`STOQ - using cached ${endpoint}:`, error.message); }); } function refreshShopConfig(source) { const cfg = window._RestockRocketConfig; const viaEmbed = function() { return fetchEmbedConfig(source.endpoint,
a) {
cfg.integrations = data;
}
});
}
function refreshSellingPlans(embedOnly) {
const cfg = window._RestockRocketConfig;
return refreshShopConfig({
embedOnly: embedOnly === true,
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 = data.read_flags;
}
}
});
}
function initializeScripts(settings) {
settings = applyTranslations(settings);
window._RestockRocketConfig.settings = settings;
console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`);
const forceEmbedSellingPlans = settings.foClothing
ncludes(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);
})
|| /\b(renderPreorderButton|updateAddToCartButton|updateAddToC
tion) {
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) {
| Tools & Maintenancehtml.stoq-buy-now-pending .shopify-payment-button{pointer-events:none!important} | EssentialsCleaners, Degreasers and Lubrication |
| Clothing and ProtectionAccessories | See More | Maintenance
| ProjektRide Merchandise | Helmets |
| Gloves | ClothingContact Us |
| Socks | Finance|
| Essentials | See More |
| Search for products on our site | Cleaners, Degreasers and Lubrication|
| Maintenance | |
| Sell Your Bike | Suggested search terms |
| FinanceAbout Us | |
| Blog | |
| Log in | Building Your Bike From the Box|
| Privacy Policy | |
| Terms of Service | |
| GBP£ | |
| My Account | Albania (ALLL) |
| Open cart | Algeria (DZDد.ج)|
| Open search bar | Angola (GBP£) |
| Armenia (AMDդր.) | Search for products on our site |
| Austria (EUR€) | |
| Belarus (GBP£) | |
| Benin (XOFFr) | |
| Bosnia & Herzegovina (BAMКМ) Yeti Cycle MTe T-Series T3 29" Bike – ProjektRide | |
| British Indian Ocean Territory (USD$) | |
| Bulgaria (EUR€) | |
| Burundi (BIFFr) | |
| Cameroon (XAFCFA) | |
| Central African Republic (XAFCFA) | |
| Chad (XAFCFA) | |
| CloseCongo - Brazzaville (XAFCFA) | |
| Congo - Kinshasa (CDFFr) | |
| Home | HireCroatia (EUR€) |
| Bikes | Cyprus (EUR€)See More |
Denmark (DKKkr.)
See More Djibouti (DJFFdj) .cart-collection__title { --text: #ffffff; }
Shop All New Bikes
Egypt (EGPج.م)
Road / Gravel / Touring Bikes
Tubes| Hybrid / City Bikes | FreeMountain BikesEritrea (GBP£) | Electric Bikes | Estonia (EUR€)Checkout | Kids Bikes FreeEswatini (GBP£) | Frames | Ethiopia (ETBBr)   | |
| See More | Faroe Islands (DKKkr.)Gloria | Finland (EUR€)Shipping & taxes calculated at checkout | TrekFrance (EUR€) | Amflow | VelduroFrench Southern Territories (EUR€) | :root { --header-height: 60px; --header-sticky-height: 60px; --header-background-height: 60px; } :root { --full-height: calc(100vh - var(--header-sticky-height)); } .main-content > .shopify-section.supports-transparent-header:first-child [data-prevent-transparent-header] { --full-height: var(--content-full); } .site-header--has-border { --border-color: currentcolor; --border-opacity: 0.0; } | |
| Ridgeback | Open navigation menu | Gambia (GMDD) .logo__image-link { width: 100px; height: 28px; } .has-scrolled .logo__image-link { width: 100px; height: 28px; }Brother | GenesisGeorgia (GBP£) | Singular Open search bar | Germany (EUR€)Enigma | Ghana (GBP£) | |
| KonaGibraltar (GBP£) | Surly | Greece (EUR€)UTO (ex Eovolt) | Greenland (DKKkr.) | Early Rider | Argon 18Guadeloupe (EUR€) | Suggested search terms | |
| About Us | Second-Hand Bikes | Guinea (GNFFr) Contact UsSee More | Blog | Guinea-Bissau (XOFFr)Shop All Second-Hand | Track Service ProgressHungary (HUFFt) | Custom Builds Building Your Bike From the Box | See More | Iceland (ISKkr) Insure Your Bike
| Custom Builds for sale Privacy Policy | Ireland (EUR€)Custom Build Inspiration Cookie Policy | Isle of Man (GBP£) | Terms of Service | ServicesItaly (EUR€) Refund policy | See More | Jersey (GBP£) | |
| See More Open cart | Kosovo (EUR€) | Workshop Prices | Book a ServiceLatvia (EUR€) | Home | Track Your Service | Lesotho (GBP£)Hire | Other | Liberia (GBP£)
| Libya (GBP£) New Bikes | Custom Builds | Shop All New BikesCycle To Work SchemesLiechtenstein (CHFCHF) | Road / Gravel / Touring Bikes | Insure Your Bike | Lithuania (EUR€) Hybrid / City BikesBook a Service Mountain Bikes | Luxembourg (EUR€)Electric Bikes | |
| Kids Bikes | See MoreMalawi (MWKMK) Frames | Shop by Brand | Brands | Mali (XOFFr) GloriaSee More | Trek | Malta (EUR€)Tent Box | AmflowMauritania (GBP£) |
| CockpitMauritius (MUR₨) Yeti | See More | Ridgeback | Mayotte (EUR€)Handlebars Brother | Moldova (MDLL) | Stems Genesis | Grips & Bar-TapeMonaco (EUR€) Singular | |
| Frog | Morocco (MADد.م.) | Kona | BrakesSee MoreMozambique (GBP£) Surly | UTO (ex Eovolt) | Complete BrakesNamibia (GBP£)Early Rider | Brake Rotors | Netherlands (EUR€)|
| Second-Hand Bikes | Niger (XOFFr)Brake Spares Shop All Second-Hand | Custom Builds | Nigeria (NGN₦)Forks Custom Builds for sale | See More | North Macedonia (MKDден) Custom Build InspirationFront Suspension | Norway (GBP£)Rear Suspension | |
| Workshop | Portugal (EUR€)Finishing Kit Workshop Prices | See More | Réunion (EUR€) Book a ServiceTyres Track Your Service | Romania (RONLei)Other | TubesCustom Builds | Rwanda (RWFFRw)||
| SaddlesSan Marino (EUR€) | Insure Your Bike | Seat Posts & Clamps Book a Service | São Tomé & Príncipe (STDDb)Parts & Components | Brands | |||
| Cockpit | Handlebars | Stems | Grips & Bar-Tape | Headsets | Brakes | Complete Brakes | |
| Brake Rotors | Brake Pads | Brake Spares | Forks | Front Suspension | Rear Suspension | Finishing Kit |

Seat Posts & Clamps
Pedals
Gears & Drivetrain
| Components | E-bike Batteries and chargers | Wheels | Complete Wheels | Tubeless | Tools & Maintenance | Clothing and ProtectionProjektRide Merchandise | Helmets | |
|---|---|---|---|---|---|---|---|---|
| Clothing | Socks | Essentials | Cleaners, Degreasers and Lubrication | Accessories | Maintenance | |||
| Sell Your Bike | Contact Us | Finance | Open search bar | |||||
| Search for products on our site | Suggested search terms | |||||||
| Contact Us | Blog | Track Service Progress | Building Your Bike From the Box | Insure Your Bike | Privacy Policy | |||
| Cookie Policy | Terms of Service | Refund policy | My Account | |||||
| Open cart | Open search bar | Search for products on our site | ||||||
| Suggested search terms | About Us | Contact Us |
Tools & Maintenance
Create account
Frequently Asked Questions
Can I hire in store?
We offer free quipment hire with a valid bike hire. You can see our range of equipment for hire 
Surly
Custom Builds for sale