ProjektRide Merchandise

Gloves

TrekClothing
<<
Header Image
Black Hire Ortlieb 40L Pannier Bags
    < Decrease quantitya class="product__media product__media--featured" href="/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)">
  • Hire Ortlieb 40L Pannier Bags
  • Increase quantity
  • RIDE CONFIDENTLoading more
  • . Hire Ortlieb 40L Pannier Bags
.
.label for="quantity--template--15326745395426__main">Quantity£0.00
>
input type="number" name="quantity" id="quantity--template--15326745395426__main" value="1" min="1">
Life Systems Pocket First Aid Kit - HIRE

<

<

>

ProjektRide
Buy Sell Ride Confident
FAQ
a class="product__media product__media--featured" href="/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)"> I'm looking to find out more information about a product, where can I find this?
Hire Ortlieb 40L Pannier Bags > 01313745324
) or email ( [email protected]Hire Ortlieb 40L Pannier BagsProjektRide Bike Shop Edinburgh£0.00
I'm looking to buy this product, when will it arrive and how much does postage cost?Life Systems Pocket First Aid Kit - HIRE
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.
<
TelQuestions and answers{"id":15398334235007,"title":"Early Rider Belter 24 Violet Haze","handle":"early-rider-belter-24-violet-haze","description":"\u003cp\u003eReady for more challenging city rides, this 24\" bike is built with a lightweight aluminum frame and updated geometry for superior stability and handling. Featuring a Shimano Nexus 8-speed internal hub, shifting is smooth and reliable, while the Tektro hydraulic disc brakes provide precise stopping power in any condition. The low-maintenance 12mm belt drivetrain, sealed bearing wheels, and Schwalbe Billy Bonkers 2.0\" tires offer durabil
ity and comfort. With smaller diameter grips and kid-friendly gearing, this bike is perfect for young riders ready to take on the urban jungle with confidence.\u003c\/p\u003e","published_at":"2025-11-13T16:40:09+00:00","created_at":"2025-11-13T16:40:09+00:00","vendor":"Early Rider","type":"Bike","tags":["Early Rider","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled"],"price":99900,"price_min":99900,"price_max":99900,"available":true,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":56393234678143,"title":"Default Title","option1":"Default Title","option2":null,"option3":null,"sku":"BR24-VH-2-IC","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Early Rider Belter 24 Violet Haze","public_title":null,"options":["Default Title"],"price":99900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"sellin g_plan_allocations":[]}],"images":["\/\/projektride.co.uk\/cdn\/shop\/files\/B24_Violet.jpg?v=1763052013"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/B24_Violet.jpg?v=1763052013","options":["Title"],"media":[{"alt":null,"id":68666759151999,"position":1,"preview_image":{"aspect_ratio":1.112,"height":1979,"width":2200,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/B24_Violet.jpg?v=1763052013"},"aspect_ratio":1.112,"height":1979,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/B24_Violet.jpg?v=1763052013","width":2200}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cp\u003eReady for more challenging city rides, this 24\" bike is built with a lightweight aluminum frame and updated geometry for superior stability and handling. Featuring a Shimano Nexus 8-speed internal hub, shifting is smooth and reliable, while the Tektro hydraulic disc brakes provide precise stopping power in any condition. The low-maintenance 12mm belt drivetrain, sealed bearing whee

Hire Lazer Compact Helmet

  • a class="product__media product__media--featured" href="/products/hire-smith-convoy-helmet" title="Hire Lazer Compact Helmet" aria-label="Hire Lazer Compact Helmet" style="background-image: url(//projektride.co.uk/cdn/shop/files/my2023_tempo-kineticore-black_right_1400x1011800x600-removebg-preview_1_600x.png?v=1747484784)"> span class="visually-hidden">Hire Lazer Compact Helmet>
  • >
  • Hire Lazer Compact Helmet
  • £0.00
  • Black
  • <
  • <
  • <
  • <
  • <
  • <<
  • 45734801adfd4c07 { --overlay-opacity: 0.2; }
  • div class="featured-image__bg bg-pos-center-center" style="background-image: url('//projektride.co.uk/cdn/shop/files/2571D9FF-E9AE-4004-9A55-C7FD4DD999D6_2048x.jpg?v=1640941114');">
  • >
  • ProjektRide
  • Buy Sell Ride Confident
  • FAQ
  • Questions and answers

cale":"en","collection_page_button_text_color":"#FFFFFF","collection_page_button_background_color":"#202223","show_button_if_any_out_of_stock":false,"show_button_if_any_variant_out_of_stock_collection":false,"show_button_on_index":false,"insert_button_after_selector_collection":null,"insert_button_after_selector_index":null,"push_enabled":false,"push_allowed":false,"storefront_form_push_label":"Push","storefront_form_push_description":"Click 'Allow' to be notified via push notification","storefront_form_push_error":"Permission rejected! Please review notification settings and try again","storefront_font_family":"OpenSans","insert_button_after_selector_collection_type":"afterend","show_channel_selector":false,"storefront_form_empty_error":"Please fill in one or more of the options above","storefront_form_push_input":"Send notification to your browser","insert_button_after_selector_page":null,"show_button_on_page":false,"insert_button_after_selector_search":null,"show_button_on_search":false,"app_proxy_path_preI'm looking to find out more information about a product, where can I find this?
ion*=\"/cart/add\"] button","preorder_index_enabled":false,"preorder_index_form_selector":"form[action*=\"/cart/add\"]","preorder_index_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_page_enabled":false,"preorder_page_form_selector":"form[action*=\"/cart/add\"]","preorder_page_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_search_enabled":false,"preorder_search_form_selector":"form[action*=\"/cart/add\"]","preorder_search_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_collection_badge_selector":null,"preorder_index_badge_selector":null,"preorder_page_badge_selector":null,"preorder_search_badge_selector":null,"preorder_badge_selector_type":"afterend","preorder_collection_badge_selector_type":"afterend","preorder_button_child_selector":"span","preorder_button_disclaimer_insert_selector":"","preorder_button_disclaimer_insert_selector_type":"afterend","preorder_payment_insert_selector":"","preorder_payment_insert_selector_type"
kRocketConfig.cachedPreorderVariantIds = {"preorder_variant_ids":[42167799447778,43916521013474,43934694998242,43934695031010,43934695620834,43935975440610,43935975473378,43935989399778,43935989432546,43935990284514,43935994118370,43935995625698,43935995855074,43936000835810,43936003195106,43936003227874,43936008012002,43936008044770,43936022757602,43936022790370,43936022823138,43936022855906,43936056115426,43936061030626,43936064930018,43936070631650,43936078037218,43936078069986,43936088195298,43936093470946,43936101138658,43936107266274,43936124076258,43936124109026,43936124141794,43936124174562,43936129941730,43936129974498,43936130007266,43936142393570,43936142426338,43936142459106,43936152060130,43936152092898,43936152125666,43936193118434,43936250429666,43936255803618,43936266682594,43936266715362,43936293978338,43936294011106,43936316424418,43936316457186,43936320880866,43936320913634,43936320946402,43936327041250,43936327074018,43936327106786,43936331661538,43936332349666,43936333103330,4393635122403
<ion setupCartSellingPlanUpdater(settings) { if (!settings || !settings.preorder_enabled) { return; } // Listen for stoq:preorder-api-ready event dispatched by preorder.js window.addEventListener('stoq:preorder-api-ready', function(event) { console.debug('STOQ - Preorder API ready, 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); }); } }); } // First try to get settings from metafields with expiry check const cachedSettings = window._RestockRocketConfig.cachedSettings; co
} 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 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(functio
.restock-rocket-button,.restock-rocket-button-float{opacity:1!important;border:none!important;cursor:pointer!important;background-image:none!important;box-shadow:none!important;padding:15px 20px;font-size:16px;width:100%;font-family:inherit}@font-face{font-family:OpenSans;font-weight:200;src:url(https://d382hokyqag45a.cloudfront.net/assets/OpenSans-Light.woff)}@font-face{font-family:OpenSans;font-weight:300;src:url(https://d382hokyqag45a.cloudfront.net/assets/OpenSans-Regular.woff)}@font-face{font-family:OpenSans;font-weight:600;src:url(https://d382hokyqag45a.cloudfront.net/assets/OpenSans-SemiBold.woff)}.restock-rocket-button-container{position:relative;z-index:1;width:100%}.restock-rocket-button-container-float-right{position:fixed;z-index:123123;top:calc(50% - 200px);right:0;transform:rotate(270deg);transform-origin:bottom right}.restock-rocket-button-container-float-left{position:fixed;z-index:123123;top:calc(50% - 200px);left:40px;transform:rotate(90deg);transform-origin:top left}. 82 Newington Road, EH91QN, Edinburgh.restock-rocket-button-container-float-left:hover,.restock-rocket-button-container-float-right:hover,.restock-rocket-button-container:hover,.restock-rocket-button-float:hover,.restock-rocket-button:hover{opacity:.8}.restock-rocket-button{min-height:50px;margin-top:10px;margin-bottom:10px}.restock-rocket-button-collection{position:relative;font-size:13px;line-height:1;padding:7px;height:auto;z-index:3}.restock-rocket-wrapper{background-color:rgba(0,0,0,.5);z-index:123123123;width:100%;height:100%;overflow:auto;position:fixed;right:0;top:0;transition-property:all;transition-duration:.3s;display:flex;flex-direction:column;justify-content:center;}.restock-rocket-wrapper-inline{width:100%;height:100%;margin-top:20px}.restock-rocket-preorder-description{padding:10px 15px;margin-top:20px;display:flex;flex-direction:column;gap:10px;}.preorder-description-details{margin-bottom:0;display:flex;flex-direction:column;gap:10px;}.preorder-detail-item{display:flex;flex-direction:row;justify-content:start;gap:8px;align-items:c Juan Borges Designs
.
bike is perfect for young riders ready to take on the urban jungle with confidence.\u003c\/p\u003e","published_at":"2025-11-13T16:40:09+00:00","created_at":"2025-11-13T16:40:09+00:00","vendor":"Early Rider","type":"Bike","tags":["Early Rider","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled"],"price":99900,"price_min":99900,"price_max":99900,"available":true,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":56393234678143,"title":"Default Title","option1":"Default Title","option2":null,"option3":null,"sku":"BR24-VH-2-IC","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Early Rider Belter 24 Violet Haze","public_title":null,"options":["Default Title"],"price":99900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[]}],"images":["\/\/projektride.co.uk\/cdn\/shop\/files \/B24_Violet.jpg?v=1763052013"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/B24_Violet.jpg?v=1763052013","options":["Title"],"media":[{"alt":null,"id":68666759151999,"position":1,"preview_image":{"aspect_ratio":1.112,"height":1979,"width":2200,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/B24_Violet.jpg?v=1763052013"},"aspect_ratio":1.112,"height":1979,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/B24_Violet.jpg?v=1763052013","width":2200}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cp\u003eReady for more challenging city rides, this 24\" bike is built with a lightweight aluminum frame and updated geometry for superior stability and handling. Featuring a Shimano Nexus 8-speed internal hub, shifting is smooth and reliable, while the Tektro hydraulic disc brakes provide precise stopping power in any condition. The low-maintenance 12mm belt drivetrain, sealed bearing wheels, and Schwalbe Billy Bonkers 2.0\" tires offer durability and comfort. Wi
th smaller diameter grips and kid-friendly gearing, this bike is perfect for young riders ready to take on the urban jungle with confidence.\u003c\/p\u003e"}; window._RestockRocketConfig.variantsInventoryPolicy = {56393234678143 : "deny",}; window._RestockRocketConfig.variantsInventoryQuantity = {56393234678143 : parseInt("1"),}; window._RestockRocketConfig.variantsPreorderCount = {56393234678143 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderCountForMarket = {56393234678143 : null,}; window._RestockRocketConfig.variantsPreorderMaxCount = {56393234678143 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {56393234678143 : null,}; window._RestockRocketConfig.variantsShippingText = {56393234678143 : "",}; window._RestockRocketConfig.variantsShippingTextForMarket = {56393234678143 : null,}; window._RestockRocketConfig.selected_variant_id = 56393234678143; window._RestockRocketConfig.selected_variant_available = window._RestockR ocketConfig.product.variants.find(function(variant) { return variant.id == window._RestockRocketConfig.selected_variant_id }).available;window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/019c4de0-280f-760f-b566-2e2f8e837eb8/restock-rocket-shopify-454/assets/restockrocket-product.js' window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019c4de0-280f-760f-b566-2e2f8e837eb8/restock-rocket-shopify-454/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 FAQ<

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 Questions and answers<

= 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 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
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') function applyTranslations(settings) { try { // Skip translation logic entirely if multi-language is not enabled 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) { // No matching locale has translations; drop payload to save memory 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 loc ale:', 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) { if (!settings || !settings.preorder_enabled) { return; } // Listen for stoq:preorder-api-ready event dispatched by preorder.js window.addEventListener('stoq:preorder-api-ready', function(event) { console.debug('STOQ - Preorder API ready, 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('Sttings; 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._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageType === 'index' && (settings.show_button_on_index || settings.preorder_index_enabled)) { createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else if(window._RestockRocketConfig.pageTyp e === '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}`); } // Dispatch custom event when app is loaded // Cart selling plan updates will be triggered by stoq:preorder-api-ready event const appLoadedEvent = new CustomEvent('stoq:loaded', { detail: { pageType: win