Saddle bags

This site has limited support for your browser. We recommend switching to Edge, Chrome, Safari, or Firefox.

Saddles

Header Image

  • Frog MTB 69
  • £845.00
  • Green
  • Red
  • Frog MTB 62
  • < a class="product__media product__media--featured" href="/collections/mountain-bikes-1/products/frog-mtb-62" title="Frog MTB 62" aria-label="Frog MTB 62" style="background-image: url(//projektride.co.uk/cdn/shop/files/L-FM62_media-MetallicGreyNeonBlue-0.default_600x.jpg?v=1736263169)">
  • Frog MTB 62
  • £835.00
  • Blue
  • Red
  • Frog Road 70
  • < a class="product__media product__media--featured" href="/collections/mountain-bikes-1/products/frog-road-70" title="Frog Road 70" aria-label="Frog Road 70" style="background-image: url(//projektride.co.uk/cdn/shop/files/L-FR70-10_media-ELECTRICBLUE-0.default_600x.jpg?v=1736263163)">
  • Frog Road 70
  • £720.00
  • Frog Road 67
  • < a class="product__media product__media--featured" href="/collections/mountain-bikes-1/products/frog-road-67" title="Frog Road 67" aria-label="Frog Road 67" style="background-image: url(//projektride.co.uk/cdn/shop/files/L-FR67_media-ELECTRICBLUE-0.default_600x.jpg?v=1736263158)">
  • Frog Road 67
  • £670.00
  • Electric blue
    Tour de France™ yellow.
    < a class="product__media product__media--featured" href="/collections/mountain-bikes-1/products/frog-city-67" title="Frog City 67" aria-label="Frog City 67" style="background-image: url(//projektride.co.uk/cdn/shop/files/L-FC67_media-BLACK-0.default_600x.jpg?v=1736263149)">
  • Frog 78
  • £535.00
  • Dark Grey
  • Electric Blue
  • Neon Green
  • Neon Red
  • Frog 67
  • < a class="product__media product__media--featured" href="/collections/mountain-bikes-1/products/frog-67" title="Frog 67" aria-label="Frog 67" style="background-image: url(//projektride.co.uk/cdn/shop/files/Screenshot2024-01-09at15.39.28_600x.png?v=1736263081)">
  • < div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/Screenshot2024-01-09at15.39.26_600x.png?v=1736263081)">
  • < span class="visually-hidden">Frog 40
  • Frog 40
  • £380.00
  • Green
  • Orange
  • Pink
  • Red
  • Spotty
  • Electric Blue
  • < span class="visually-hidden">Frog 44
  • Frog 44
  • £390.00
  • < a class="product__media product__media--featured" href="/collections/mountain-bikes-1/products/copy-of-rct-wrap" title="ESI RCT Wrap Original Design" aria-label="ESI RCT Wrap Original Design" style="background-image: url(//projektride.co.uk/cdn/shop/files/Screenshot2023-09-27at11.12.24_600x.png?v=1695809548)">
  • < span class="visually-hidden">ESI RCT Wrap Original Design
  • <
  • <
  • a class="product__media product__media--featured" href="/collections/mountain-bikes-1/products/rct-wrap" title="ESI RCT Wrap" aria-label="ESI RCT Wrap" style="background-image: url(//projektride.co.uk/cdn/shop/files/Screenshot2023-09-27at11.09.06_600x.png?v=1695809489)"> <span class="visually-hidden">ESI RCT Wrap >
  • <div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/Screenshot2023-09-27at11.09.19_600x.png?v=1695809489)">
  • a class="product__media product__media--featured" href="/collections/mountain-bikes-1/products/xxl-8-25-chunky" title="ESI XXL 8.25" Chunky" aria-label="ESI XXL 8.25" Chunky" style="background-image: url(//projektride.co.uk/cdn/shop/files/Screenshot2023-09-27at11.01.13_600x.png?v=1695809172)">
  • < span class="visually-hidden">ESI XXL 8.25" Chunky ESI XXL 8.25" Chunky
  • £27.00
  • Blue Red
  • White
  • ESI XL 6.75" Extra Chunky
  • ESI XL 6.75" Extra Chunky
  • £21.00
  • Green
  • ESI XL 6.75' Chunky< span class="visually-hidden">ESI XL 6.75' Chunky
  • < div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/Screenshot2023-09-27at10.53.57_600x.png?v=1695808443)">
  • £21.00
  • Black
  • Green White
  • Yellow 1
  • 35
  • 45
  • < img src="//projektride.co.uk/cdn/shop/files/logo_header_2048x2048.png?v=1634060673" alt="" class="logo--footer">
  • INFORMATION Working Hours
  • Mon - Fri: 09:00 - 18:30
  • Tel Location
  • 82 Newington Road
  • Email
  • ProjektRide
  • .
  • }} of {{ total }} claimed","preorder_progress_bar_fill_color":"#000000","preorder_progress_bar_background_color":"#e5e5e5","preorder_progress_bar_text_color":"#FFFFFF","preorder_progress_bar_border_radius":4,"preorder_progress_bar_show_percentage":false}],"disabled_plan_ids":[713813721471,713176482175],"cached_at":"2026-02-18T08:36:42Z"}; if (cachedData && typeof cachedData === 'object' && cachedData.cached_at) { // Find the maximum updated_at from all items in old array const oldPlans = window._RestockRocketConfig.sellingPlans; const maxUpdatedAt = Array.isArray(oldPlans) && oldPlans.length > 0 ? oldPlans.reduce(function(max, plan) { // Parse dates for proper comparison (handles mixed ISO formats) if (plan.updated_at) { const planDate = new Date(plan.updated_at); const maxDate = max ? new Date(max) : null; return (!maxDate || (planDate && !isNaN(planDate) && planDate > maxDate)) ? plan.update d_at : max; } return max; }, '') : null; // Use cached if old array is empty/has no timestamps, or cached is newer // Parse dates for comparison to handle format differences (+00:00 vs .000Z) const cachedDate = new Date(cachedData.cached_at); const maxDate = maxUpdatedAt ? new Date(maxUpdatedAt) : null; const useCached = !maxUpdatedAt || (cachedDate && !isNaN(cachedDate) && (!maxDate || cachedDate > maxDate)); if (useCached) { if (Array.isArray(cachedData.plans)) { window._RestockRocketConfig.sellingPlans = cachedData.plans; // Only use disabled_plan_ids when using cached plans window._RestockRocketConfig.disabledSellingPlanIds = cachedData.disabled_plan_ids || []; console.debug('[RR] Using selling plans from cachedSellingPlans (cached_at: ' + cachedData.cached_at + ')'); } } else { // When using old format (stale cache), don'
  • t trust disabled_plan_ids window._RestockRocketConfig.disabledSellingPlanIds = []; console.debug('[RR] Using selling plans from old format (max updated_at: ' + maxUpdatedAt + ')'); } } })();window._RestockRocketConfig.integrations = [{"id":"15c94526-b6b8-4de1-9bc1-23b1ca52ddb0","shop_id":38436,"enabled":true,"page_types":["product","collection","index","search","page","cart","list-collections","article","blog"],"configuration":{"toastDuration":10000,"toastPosition":"bottom-right","enableXHRHijack":true,"enableFetchHijack":true,"quantityLimitDisabled":false},"type":"hijack","css_config":null,"js_config":null,"created_at":"2025-07-26T09:16:04.076Z","updated_at":"2025-07-26T09:16:04.076Z"}];window._RestockRocketConfig.obfuscateInventoryQuantity = false;window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/019cb0b4-f8c1-740a-9811-1284dd89b0c8/restock-rocket-shopify-464/assets/restockrocket-product.js' window._RestockRocketConfig.scriptUrlCollect ion = 'https://cdn.shopify.com/extensions/019cb0b4-f8c1-740a-9811-1284dd89b0c8/restock-rocket-shopify-464/assets/restockrocket-collection.js' window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1) window._RestockRocketConfig.host = 'https://app.restockrocket.io' const SETTINGS_CACHE_DURATION = 15 * 60 * 1000; // 15 minutes in milliseconds const LIQUID_CACHE_MAX_AGE = 2 * 60 * 60; // 2 hours in seconds // Calculate Liquid cache freshness once at initialization const liquidRenderedAt = window._RestockRocketConfig.liquidRenderedAt; // Validate timestamp and calculate cache age if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) { console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh'); window._RestockRocketConfig.isLiquidCacheFresh = true; } else { const now = Math.floor(Date.now() / 1000); // Current time in seconds const liquidCacheAge = now - liquidRenderedAt; // Age in seconds // Handle client clock ahead of server if (liquidCacheAge < && 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); }); } }); } // 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.S hopify.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 not ok'); } return response.json(); }) .then(function(settings) { initializeScripts(settings); }) .catch(function(error) { // If request failed and we have cached settings (even if expired), use them as fallback if (cachedSettings) { console.debug('STOQ - using expired cached settings as fallback'); initializeScripts(cac
  • hedSettings); } else { console.error('STOQ - failed to load settings:', error); } }) .catch(function(e) { console.error(e) }) } function initializeScripts(settings) { settings = applyTranslations(settings); window._RestockRocketConfig.settings = settings; console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`); // Setup cart selling plan updater BEFORE loading any scripts to avoid race conditions 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); }) if(window._RestockRocketConfig.pageType === 'collection' && (settings.show_button_on_collection || settings.preorder_collection_enabled)) { createRestockRocketScript(window._RestockRocketCon fig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'index' && (settings.show_button_on_index || settings.preorder_index_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'search' && (settings.show_button_on_search || settings.preorder_search_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'page' && (settings.show_button_on_page || settings.preorder_page_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'product') { createRestockRocketScript(window._RestockRocketConfig.scriptUrlProduct); } else if(hijackIntegration) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else { console.debug(`STOQ - no scripts enab