Header Image

50,"width":3000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/FuelEX9XT-27-79590-C-Primary_24b34684-58a0-45d4-9306-909fc0c380d0.jpg?v=1787065290"},"aspect_ratio":1.333,"height":2250,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/FuelEX9XT-27-79590-C-Primary_24b34684-58a0-45d4-9306-909fc0c380d0.jpg?v=1787065290","width":3000},{"alt":"Fuel EX 9 XT","id":72254287675775,"position":6,"preview_image":{"aspect_ratio":1.333,"height":3000,"width":4000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/FuelEX9XT-27-79590-C-Alt1_8adebe0d-1af2-4fb5-9674-8e14d7153571.jpg?v=1787065290"},"aspect_ratio":1.333,"height":3000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/FuelEX9XT-27-79590-C-Alt1_8adebe0d-1af2-4fb5-9674-8e14d7153571.jpg?v=1787065290","width":4000},{"alt":"Fuel EX 9 XT","id":72254287708543,"position":7,"preview_image":{"aspect_ratio":1.333,"height":3000,"width":4000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/FuelEX9XT-27-79590-C-Alt2_635524c2-cf0c-42d3-a8a4-7ba903 765a31.jpg?v=1787065291"},"aspect_ratio":1.333,"height":3000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/FuelEX9XT-27-79590-C-Alt2_635524c2-cf0c-42d3-a8a4-7ba903765a31.jpg?v=1787065291","width":4000},{"alt":"Fuel EX 9 XT","id":72254287741311,"position":8,"preview_image":{"aspect_ratio":1.333,"height":3000,"width":4000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/FuelEX9XT-27-79590-C-Alt3_7a417cdb-d1d0-4fd8-b8d9-006a17f1c28f.jpg?v=1787065290"},"aspect_ratio":1.333,"height":3000,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/FuelEX9XT-27-79590-C-Alt3_7a417cdb-d1d0-4fd8-b8d9-006a17f1c28f.jpg?v=1787065290","width":4000},{"alt":"Fuel EX 9 XT","id":72254287774079,"position":9,"preview_image":{"aspect_ratio":1.333,"height":2250,"width":3000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/FuelEX9XT-27-79590-B-Primary_ac192a9e-276e-4d81-9e50-2c8970da9589.jpg?v=1787065290"},"aspect_ratio":1.333,"height":2250,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\//tr\u003e\n\u003ctr\u003e\n\u003cth\u003eShifter\u003c\/th\u003e\n\u003ctd\u003eShimano\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eDerailleur Rear\u003c\/th\u003e\n\u003ctd\u003eShimano Deore M8200, long cage\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eCrank\u003c\/th\u003e\n\u003ctd\u003eShimano XT 8200, 30T, 55 mm chain-line, 170 mm length \/\/ Shimano XT M8200, 30T, 55mm chainline, 165mm length\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eBottom Bracket\u003c\/th\u003e\n\u003ctd\u003eShimano BB-MT501 BSA\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eCassette\u003c\/th\u003e\n\u003ctd\u003eShimano XT M8200, 10-51, 12-speed\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eChain\u003c\/th\u003e\n\u003ctd\u003eShimano XT M8100, 12-speed\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eBrake\u003c\/th\u003e\n\u003ctd\u003eShimano\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eBrake set\u003c\/th\u003e\n\u003ctd\u003eShimano XT M8220 4-piston hydraulic disc \/\/ Shimano XT M8220 4-piston hydraulic disc Shimano XT M8220 4-piston hydraulic disc \/\/ Shimano XT M8220 4-piston hydraulic disc\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eBrake Rotor\u003c\/th\u003e\n\u003ctd\u003eShimano RT86, 6-bolt, 203 mm \/\/ Shimano RT86, 6-bolt, 180 mm\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSaddle\u003c\/th\u003e\n\u003ctd\u003eVerse Short Comp, steel rails, 145 mm width\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSeatpost\u003c\/th\u003e\n\u003ctd\u003eBontrager Line Dropper, 200 mm travel, MaxFlow, internal routing, 34.9 mm, 515 mm length\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eHandlebar\u003c\/th\u003e\n\u003ctd\u003eRace Face Turbine, alloy, 35 mm, 40 mm rise, 780 mm width\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eStem\u003c\/th\u003e\n\u003ctd\u003eBontrager Elite, 35 mm, 0-degree, 45 mm length\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eGrips\u003c\/th\u003e\n\u003ctd\u003eTrek Line Elite, lock-on\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSize Chart Rider Height\u003c\/th\u003e\n\u003ctd\u003eRider Height - 177.0 - 188.0\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003cth\u003eSize Chart Rider Inseam\u003c\/th\u003e\n\u003ctd\u003eInseam - 84.0 - 89.0\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/table\u003e"};window._RestockRocketConfig.variantsInventoryPolicy = {58205454172543 : "deny",58205454205311 : "deny",58205454238079 : "deny",58205454270847 : "deny",58205454303615 : "deny",58205454336383 : "deny",58205454369151 : "deny",58205454401919 : "deny",58205454434687 : "deny",58205454467455 : "deny",58205454500223 : "deny",58205454532991 : "deny",}; window._RestockRocketConfig.variantsInventoryQuantity = {58205454172543 : parseInt("0"),58205454205311 : parseInt("0"),58205454238079 : parseInt("2"),58205454270847 : parseInt("0"),5820545430 3615 : parseInt("0"),58205454336383 : parseInt("0"),58205454369151 : parseInt("0"),58205454401919 : parseInt("0"),58205454434687 : parseInt("0"),58205454467455 : parseInt("0"),58205454500223 : parseInt("0"),58205454532991 : parseInt("0"),}; window._RestockRocketConfig.variantsPreorderCount = {58205454172543 : parseInt(""),58205454205311 : parseInt(""),58205454238079 : parseInt(""),58205454270847 : parseInt(""),58205454303615 : parseInt(""),58205454336383 : parseInt(""),58205454369151 : parseInt(""),58205454401919 : parseInt(""),58205454434687 : parseInt(""),58205454467455 : parseInt(""),58205454500223 : parseInt(""),58205454532991 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderCountForMarket = {58205454172543 : null,58205454205311 : null,58205454238079 : null,58205454270847 : null,58205454303615 : null,58205454336383 : null,58205454369151 : null,58205454401919 : null,58205454434687 : null,58205454467455 : null,58205454500223 : null,58205454532991 : null,}; window._RestockRocketConfihedSettings && window._RestockRocketConfig.cachedSettings.api_host) || 'https://app.restockrocket.io' try { const _stoqVersionMatch = window._RestockRocketConfig.scriptHost.match(/(\d+)\/?(?:assets\/?)?$/); window._RestockRocketConfig.appVersion = (_stoqVersionMatch && _stoqVersionMatch[1]) || ''; } catch (e) { window._RestockRocketConfig.appVersion = ''; } const SETTINGS_CACHE_DURATION = 15 * 60 * 1000; const LIQUID_CACHE_MAX_AGE = 15 * 60; const liquidRenderedAt = window._RestockRocketConfig.liquidRenderedAt; 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); const liquidCacheAge = now - liquidRenderedAt; window._RestockRocketConfig.liquidCacheAge = Math.max(0, liquidCacheAge ); 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 < = 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 &
& !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 <
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') try { const _stoqInitConfig = window._RestockRocketConfig; const _stoqDetectedVariantIds = (_stoqInitConfig.product && Array.isArray(_stoqI nitConfig.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.href, page_type: _stoqInitConfig.pageType || '', 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.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 _sqForVariant = function (pl) { return pl && pl.enabled && 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) { _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 && _sqTra
ck.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.href) || '', 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 && _sqTrack.cachedPreorderVariantIds.preorder_variant_ids); })(), in_enabled_plan: !!_sqPlan, is_instock_variant: (function () { var has = function (a) { return Array.isArray(a) && a.indexOf(_sqVidNum) !== -1; }; return has(_sqTrack.inStockVariantIds) || h as(_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), gate_armed: !!_sqTrack.acceleratedGateArmed, gate_active_at_click: !!(document.documentElement && document.documentElement.classList.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 || {})); 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('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 loadStorefrontSettings() { const cfg = window._RestockRocketConfig; if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) return; function run() { const query = 'query StoqSettings($namespace: String!) { shop { metafield(namespace: $namespace, key: "settings") { value } } }'; fetch( `https://${cfg.shop}/api/2025-07/graphql.json`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Shopify-Storefront-Access-Token': cfg.storefrontAccessToken, }, body: JSON.stringify({ query: query, variables: { namespace: cfg.metafieldNamespace } }), } ) .then(function(response) { if (!response.ok) { throw new Error('Storefront API HTTP ' + response.s tatus); } 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(', ')); } const value = body && body.data && body.data.shop && body.data.shop.metafield && body.data.shop.metafield.value; if (!value) { throw new Error('Storefront API returned no settings metafield value'); } cfg.storefrontSettings = 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); } })(); const cachedSettings = window._RestockRocketConfig.cachedSett
ings; 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; } 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 n ot ok'); } return response.json(); }) .then(function(settings) { initializeScripts(settings); }) .catch(function(error) { if (cachedSettings) { console.debug('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 (applyError) {
console.error('STOQ - apply failed for ' + endpoint + ':', applyError); throw applyError; } }) .catch(function(error) { console.debug(`STOQ - using cached ${endpoint}:`, error.message); }); } function initializeScripts(settings) { settings = applyTranslations(settings); window._RestockRocketConfig.settings = settings; console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`); 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 || []; } }), fetchEmbed Config('integrations', function(data) { if (Array.isArray(data)) { window._RestockRocketConfig.integrations = data; } }) ]), 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) && window._RestockRocketConfig.sellingPlans.some(function(plan) { return plan && plan.enabled; }); const hasDisabledPlanIds = Array.isArray(window._RestockRocketConfig.disabledSellingPlanIds) && w
indow._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 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(window._RestockRocketC onfig.scriptUrlCollection); } else if(usePreorderBuild) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else { console.debug(`STOQ - no scripts enabled for ${pageType}`); } 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}

Marlin 4 is a trail-worthy daily rider that's perfectly suited for everyday adventures, on and off the trail. It features a trail-savvy frame with a suspension fork, 8-speed Shimano ESSA shifting and mounts for a rack and kickstand that make it an ideal choice for trail riders or anyone looking for a comfortable, stable commuter with the ruggedness of a real mountain bike.

Technology

Will my bike have a curved top tube? - Smaller frames have a top tube that dips down as it approaches the seat tube. This design makes for a lower standover height, which is good for shorter riders because it allows them to straddle their bike more easily. Larger frame sizes have a straight top tube because taller riders with longer legs typically don’t have the same issues with standover height.

Specification

Frame Alpha Silver Aluminium, internal derailleur and dropper post routing, rack and kickstand mount, 135x5 mm ThruSkew
Frame Material ALUMINIUM
Rim Size 29
Fork SR Suntour
Fork SR Suntour XCE 28, coil spring, preload, 46 mm offset for 29" wheel, 100 mm QR, 100 mm travel SR Suntour XCE 28, coil spring, preload, 46mm offset for 29'' wheel, 100mm QR, 100mm travel
Tires Bontrager Montrose Comp, wire bead, 30 tpi, 29x2.40"
Hub Front Formula DC-20, alloy, 6-bolt, 100x5 mm
Hub Rear Formula DC-22, alloy, 6-bolt, Shimano 8/9/10 freehub, 135x5 mm
Rims Bontrager Connection, double-wall, 32-hole, 20 mm width, Schrader valve
Shifter Shimano
Derailleur Rear Shimano ESSA U2000
Crank ProWheel alloy, 30T narrow-wide steel ring, 175 mm length
Bottom Bracket Threaded cartridge
Cassette Shimano HG300, 11-45, 8-speed
Chain KMC Z8.3, 8-speed
Brake Tektro
Brakeset Tektro HD-M275 hydraulic disc // Tektro HD-M275 hydraulic disc // Power BH-M286TF hydraulic disc, 180 mm rotor // Power BH-M286TF hydraulic disc, 160 mm rotor Tektro HD-M275 hydraulic disc // Tektro HD-M275 hydraulic disc // Power BH-M286TF hyd
Brake Rotor Tektro, 6-bolt, 160mm // Tektro, 6-bolt, 180mm
Pedals Nylon platform
Saddle Bontrager Verse Short, stainless steel rails
Seatpost Bontrager alloy, 31.6 mm, 12 mm offset, 400 mm length
Handlebar Bontrager alloy, 31.8 mm, 15 mm rise, 750 mm width
Stem Bontrager Comp, 31.8 mm, Blendr compatible, 7-degree, 50 mm length
Headset Semi-integrated, 1-1/8''
Grips Trek Line Comp, nylon lock-on
Size Chart Rider Height Rider Height - 177.0 - 188.0
Size Chart Rider Inseam Inseam - 84.0 - 89.0

Frequently Asked Questions

  • Please get in touch with a member of the team either by phone (01313745324) or email ([email protected]) where on of the team will be more than happy to help.

    ProjektRide Bike Shop Edinburgh

  • If the item is showing in stock, we aim to post the product within 24 hours. Please allow 5 working days to receive the item.

    Postage is free on orders over ÂŁ50. Orders under ÂŁ50, our postage charge is ÂŁ3.99.

    We also have a physical store, if you are local please pop in -

    ProjektRide Bike Shop Edinburgh

    82 Newington Road, EH91QN, Edinburgh.