<
= 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; } // Check if translations are enabled but missing from cache // This handles the backfill period where DB has translations but metafield doesn't if (settings.multi_language_enabled) { if (!settings.translations) { // Translations enabled but no 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') function applyTranslations(settings) { try { // Skip translation logic entirely if multi-language is not enabled if (!settings ||
]; 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; } } // Setup event listener for cart selling plan updates // This must be called before any scripts are loaded to avoid race conditions function setupCartSellingPlanUpdater(settings) { // Setup listener regardless - updateCartSellingPlans has its own guards // This ensures cleanup happens even when preorders are disabled globally // Listen for stoq:inventory-data-loaded event dispatched by api.js window.addEventListener('stoq:inventory-data-loaded', function(event) { console.debug('STOQ - Inventory data loaded, updating cart selling plans'); if (window._RestockRocket
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
Decrease quantity
Header Image

Hire Ortlieb 40L Pannier BagsUTO (ex Eovolt)< { "@context": "http://schema.org/", "@type": "Product", "name": "Gloria Summer Jersey x Gobik", "url": "https:\/\/projektride.co.uk\/products\/gloria-summer-jersey-x-gobik","image": [ "https:\/\/projektride.co.uk\/cdn\/shop\/files\/gloriaapparel-172_1365x.webp?v=1747758543" ],"description": "","brand": { "@type": "Thing", "name": "Gloria" },"offers": [{ "@type" : "Offer","availability" : "http://schema.org/InStock", "price" : 55.0, "priceCurrency" : "GBP", "url" : "https:\/\/projektride.co.uk\/products\/gloria-summer-jersey-x-gobik?variant=55482684965247" }, { "@type" : "Offer","availability" : "http://schema.org/InStock", "price" : 55.0, "priceCurrency" : "GBP", "url" : "https:\/\/projektride.co.uk\/products\/gloria-summer-jersey-x-gobik?variant=55482687357311" } ] } Open cart

translation data in metafield // Metafield hasn't been backfilled yet - force refresh console.debug('STOQ - multi-language enabled but no translation data in cache, fetching fresh'); return null; } // Translations object exists in metafield - cache is valid // If current locale isn't translated, applyTranslations will gracefully use default locale from base fields 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'); } // Don't return null - continue using cache even for untranslated locales } const updatedAt = new Date(settings.updated_at); if (isNaN(updatedAt.getTime())) { console.debug('STOQ - Invalid updated_at date format in settings'); return null; } const

£0.00 <

Early Rider!settings.multi_language_enabled) { return settings; Home
    '') { 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; } } // Setup event listener for cart selling plan updates // This must be called before any scripts are loaded to avoid race conditions function setupCartSellingPlanUpdater(settings) { // Setup listener regardless - updateCartSellingPlans has its own guards // This ensures cleanup happens even when preorders are disabled globally // Listen for stoq:inventory-data-loaded event dispatched by api.js 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.

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(cachedSettings); } else { console.error('STOQ - failed tWould you like to add on any equipment?
ig.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 enabled for ${window._RestockRocketConfig.pageType}`); } / Hire
Open navigation menu Open cart £0.00   Hybrid / City Bikes Mountain Bikes
a class="product__media product__media--featured" href="/collections/gloria-clothing/products/hire-ortlieb-40l-pannier-bags" title="Hire Ortlieb 40L Pannier Bags" aria-label="Hire Ortlieb 40L Pannier Bags" style="background-image: url(//projektride.co.uk/cdn/shop/files/resize_width_1000_600x.jpg?v=1741085512)"> Search text fieldKids Bikes
span class="visually-hidden">Hire Ortlieb 40L Pannier Bags
Workshop Prices
Hire Ortlieb 40L Pannier Bags Book a Service£0.00 Shop by Brand Gloria Trek
Loading more
Othera class="product__media product__media--featured" href="/collections/gloria-clothing/products/kryptolok-standard-u-lock-with-4-foot-kryptoflex-cable-hire" title="Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable" aria-label="Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable" style="background-image: url(//projektride.co.uk/cdn/shop/files/Screenshot2022-03-09at20.04.46_560e2033-8232-4bd3-a423-3ce8c9f11849_600x.png?v=1691610428)"> .Amflow
span class="visually-hidden">Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable.

Product DetailsCustom Builds> .

> Yeti
Ortlieb Back-Roller 40L Pannier Bags - ProjektRide Bike Hire Edinburgh.Cycle To Work Schemes
Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable Ridgeback
Supplied as a pair, these rear pannier bags have hermetical roll closures, shoulder straps so you can take them with you at your destination and the ORTLIEB QL System which ensures food and equipment are both protected and easily accessible.Insure Your Bike£0.00
li class="result"> Brother
div class="result__image" data-aspectratio="{{ it.product.image.aspectRatio }}" data-product-image>
Durable polyester fabric make this pannier a long lasting touring companion. The waterproof roll closure ensures safe and waterproof storage of food and equipment. With its QL2.1 fixing it is quickly mounted and taken off the bike rack. A shoulder strap provides carrying comfort when taken off the rack. a href="{{ it.product.url }}" class="result__image-link" aria-label='{{ it.product.title }}'>
HIRE - BIKE PACKING BUNDLE div class="result__image-img product__media lazyload fade-in" data-bgset="{{ it.product.image.thumb }}" data-aspectratio="{{ it.product.image.aspectRatio }}" data-sizes="auto"> {{@if(it.product.badgeText)}} Genesis
div class="product__tag{{ it.product.badgeClasses }}">
Parts & Components  span>{{ it.product.badgeText | safe }}
>Singular a class="product__media product__media--featured" href="/collections/gloria-clothing/products/hire-bike-packing-bundle" title="HIRE - BIKE PACKING BUNDLE" aria-label="HIRE - BIKE PACKING BUNDLE" style="background-image: url(//projektride.co.uk/cdn/shop/files/Yourparagraphtext_600x.png?v=1747481130)"> > {{/if}}
span class="visually-hidden">HIRE - BIKE PACKING BUNDLE >
> > Enigma
> <

ocketConfig.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.product = {"id":15093137080703,"title":"Gloria Summer Jersey x Gobik","handle":"gloria-summer-jersey-x-gobik","description":"\u003cp\u003e\u003cimg\u003e\u003c\/p\u003e","published_at":"2025-05-20T17:30:17+01:00","created_at":"2025-05-20T17:28:48+01: E-bike Batteries and chargers
rsey x Gobik - Extra Large","public_title":"Extra Large","options":["Extra Large"],"price":5500,"weight":0,"compare_at_price":5500,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]}],"images":["\/\/projektride.co.uk\/cdn\/shop\/files\/gloriaapparel-172.webp?v=1747758543","\/\/projektride.co.uk\/cdn\/shop\/files\/gloriaapparel-138.webp?v=1747758550","\/\/projektride.co.uk\/cdn\/shop\/files\/gloriaapparel-140.webp?v=1747758556","\/\/projektride.co.uk\/cdn\/shop\/files\/gloriaapparel-170.webp?v=1747758562","\/\/projektride.co.uk\/cdn\/shop\/files\/gloriaapparel-171.webp?v=1747758569"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/gloriaapparel-172.webp?v=1747758543","options":["Size"],"media":[{"alt":null,"id":65914389266815,"position":1,"preview_image":{"aspect_ratio":0.667,"height":2048,"width":1365,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gloriaapparel-172.webp?v=1747758543"},"aspect_ratio":0.667,"height":2048,"media_type":"image","sr
,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gloriaapparel-170.webp?v=1747758562","width":1365},{"alt":null,"id":65914400702847,"position":5,"preview_image":{"aspect_ratio":0.667,"height":2048,"width":1365,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gloriaapparel-171.webp?v=1747758569"},"aspect_ratio":0.667,"height":2048,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gloriaapparel-171.webp?v=1747758569","width":1365}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cp\u003e\u003cimg\u003e\u003c\/p\u003e"}; window._RestockRocketConfig.variantsInventoryPolicy = {55482684965247 : "deny",55482687357311 : "deny",}; window._RestockRocketConfig.variantsInventoryQuantity = {55482684965247 : parseInt("1"),55482687357311 : parseInt("0"),}; window._RestockRocketConfig.variantsPreorderCount = {55482684965247 : parseInt(""),55482687357311 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderCountForMarket = {55482684965247 :
  • ensions/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 liquidCach < Wheels = 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; } // Check if translations are enabled but missing from cache // This handles the backfill period where DB has translations but metafield doesn't if (settings.multi_language_enabled) { if (!settings.translations) { // Translations enabled but no 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
  • Contact Us <
  • li class="result"> <a href="{{ it.product.url }}" class="result__image-link" aria-label='{{ it.product.title }}'> FinanceHIRE - BIKE PACKING BUNDLE<
p class="result__title"> My Account <
a href="{{ it.product.url }}">{{ it.product.title }}
> <> div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/resize_width_1000_1296x_d1ffd242-63bc-4a9f-85e2-400f274532d7_600x.jpg?v=1747481423)">
<
<INFORMATION