Denmark (DKKkr.)
Equatorial Guinea (XAFCFA)
Eswatini (GBP£)
French Southern Territories (EUR€)
Gabon (XOFFr)
Home
Mastercard
Close/
Norway (GBP£)
/
PayPalShop All New Bikes
Hire - Brothers Big Bro backpacking Bike
HomeHire - Brothers Big Bro backpacking Bike
Mountain BikesSee More
Shop Pay
Looking to purchase with a cycle to work scheme?Poland (PLNzł) Road / Gravel / Touring Bikes
Hire
Union Pay
Click here Hybrid / City Bikes to get in touch and get the ball rolling!Portugal (EUR€) Visa BikesSize
Réunion (EUR€)
Electric Bikes
Small
New Bikes
Romania (RONLei)
Kids Bikes
See More
FramesMedium
Rwanda (RWFFRw)
Shop by Brand
Shop All New Bikes
Gloria
Components
| refrontSettings = JSON.parse(value); console.debug('STOQ - stored live settings from Storefront API on config.storefrontSettings'); }) .catch(function(e) { console.debug('STOQ - Storefront settings fetch failed (non-fatal):', e && e.message); }); } if (typeof window.requestIdleCallback === 'function') { window.requestIdleCallback(run, { timeout: 5000 }); } else { setTimeout(run, 0); } })(); // First try to get settings from metafields with expiry check 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': 'ski | TOQ - 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 (applyError) { // Apply failures are programming bugs (e.g. response shape changed // server-side and the assignment threw). Surface them as console.error // so they're visible in browser logs, then re-throw to fall through // to the same Liquid-cached fallback as a fetch failure. console.error('STOQ - apply failed for ' +ipts. Race against a 1000ms timeout so a slow // API can't block init indefinitely. If the timeout wins, the in-flight // fetches still complete and update window._RestockRocketConfig — the // bundle re-reads sellingPlans/integrations on every interaction, so the // late-arriving values benefit subsequent renders even though the first // paint may use the Liquid-cached values. On any failure the existing // Liquid-loaded values stay in place via fetchEmbedConfig's catch. if (!window._RestockRocketConfig.isLiquidCacheFresh && !settings.disable_refresh_on_stale_liquid) { console.debug('STOQ - Liquid cache stale, refreshing selling_plans + integrations'); Promise.race([ Promise.all([ fetchEmbedConfig('selling_plans', function(data) { if (data && Array.isArray(data.plans)) { window._RestockRocketConfig.sellingPlans = data.plans; window._RestockRocketConfig.disabledSellingPlanIds = data.disabled_plan_ids || []; | n, // an enabled offer exists, or a disabled-but-kept plan id remains (cart sweep // must still strip those). Rationale in the PR. 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 collectionScriptUrl = usePreorderBuild ? window._RestockRocketConfig.scriptUrlCollection : window._RestockRocketConfig.scriptUrlCollectionBis; const productScriptUrl = usePreorderBuild ? window._RestockRocketConfig.scriptUrlProduct : window._RestockRocketConfig.scriptUrlProductBis; const pageType = window._RestockRocketConfig.pageType; const collecti
| Tyres | |
| Tubeless | |
| Seat Posts & Clamps | |
| Gears & Drivetrain |
E-bike Batteries and chargers
Cleaners, Degreasers and Lubrication
Accessories-
Contact Us
Central African Republic (XAFCFA)










See More
See More
Chad (XAFCFA)



Denmark (DKKkr.)
Egypt (EGPج.م)
Eritrea (GBP£)
Eswatini (GBP£)
Faroe Islands (DKKkr.)
France (EUR€)
Gabon (XOFFr)
Georgia (GBP£)
Ghana (GBP£)
Greece (EUR€)
Guadeloupe (EUR€)


















Czechia (CZKKč)
Egypt (EGPج.م)
Estonia (EUR€)
Faroe Islands (DKKkr.)