• Contact Us
  • FAQ
    Questions and answers
    ProjektRide Bike Shop Edinburgh

    I'm looking to buy this product, when will it arrive and how much does postage cost?
    Search
    WorkshopCart
    See More
    Close
    Header Image Workshop Prices
    Spend £50
    Book a Service to qualify for free shipping
    Other
    See More

    All Bikes

    Custom Builds
    Parts & Components
    See More
    Hope
    Bikes  
    Enve
     
    Brake Pads
    >
    See Morea href="{{ it.product.url }}">{{ it.product.title }}
    >
    >
    > li class="result result--full"> p class="result__title">{{ it.item.text }}
    Cycle To Work Schemes
    Insure Your Bike
    Hope
    Enve
    <
    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)"> Shop all <span class="visually-hidden">Hire Lazer Compact Helmet-Brother Cycles Stroma Frameset Brakes>
    Brake Rotors
    Brake Pads
    Finishing Kit Tyres
    TubesPedals
    Gears & Drivetrain
    Components
    E-bike Batteries and chargers
    #ListCollections--template--15326745166050__collection-list { --overlay-opacity: 0.2; } @media screen and (min-width: 1024px) { #ListCollections--template--15326745166050__collection-list { --grid: repeat(4, minmax(0, 1fr)); } } @media screen and (min-width: 480px) and (max-width: 1023px) { #ListCollections--template--15326745166050__collection-list { --grid: repeat(2, minmax(0, 1fr)); } }<
    <
    <
    div class="product-feature__image-bg product-feature__image-bg--square" style="background-image: url(//projektride.co.uk/cdn/shop/files/EC994330-41C8-48CB-AFC0-105CA9D28838_1_201_a_1024x.jpg?v=1720258032);">
    > Open search bar
    div class="product-feature__image-bg product-feature__image-bg--square" style="background-image: url(//projektride.co.uk/cdn/shop/files/8A5BDC82-CAF8-4A46-9FF4-B5E6847EEDB3_1024x.jpg?v=1749892417);"> >
    We are really excited to be offering these stock Brothers Mehteh, Big Bro, and Gloria Complete bikes that have been assembled right here in Edinburgh!
    Shop Now!
    img src="//projektride.co.uk/cdn/shop/files/service_d6136318-c313-41d8-9715-521cd27ef85f_512x512.png?v=1690612630" alt="" class="icons-row__image"> Open cartQuality Control
    Close search bardiv class="image-column__image image-column__image--desktop no-js-image" style="background-image: url(//projektride.co.uk/cdn/shop/files/shop_2048x.jpg?v=1635888751);"> >
    LOCATION & HOURSSearch text field
    \u003eENVE Incidental Damage Protection\u003c\/h5\u003e\n\u003cp\u003eThis program provides a no-charge replacement for your first three years of ownership and a prorated replacement thereafter for damage inflicted when racing, riding, or transporting your bicycle. Original owners only. Product registration is required within 60 days of purchase to be eligible for this program.\u003c\/p\u003e\n\u003cp\u003e\u003ca href=\"https:\/\/www.enve.com\/support\/incidental-damage-protection-terms\/\"\u003ehttps:\/\/www.enve.com\/support\/incidental-damage-protection-terms\/\u003c\/a\u003e\u003c\/p\u003e\n\u003cp\u003e \u003c\/p\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\u003ch5\u003eENVE M7 Mountain Stem\u003c\/h5\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eMaterial\u003c\/td\u003e\n\u003ctd\u003eCarbon Fibre\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eLength\u003c\/td\u003e\n\u003ctd\u003e35mm, 50mm, 65mm\u003c\/td\u003e\n\u003c\/trFrom £419.00 \u003e\n\u003ctr\u003e\n\u003ctd\u003eRise\u003c\/td\u003e\n\u003ctd\u003e+\/- 0-degrees\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eBar Clamp Diameter\u003c\/td\u003e\n\u003ctd\u003e35mm\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSteerer Clamp Diameter\u003c\/td\u003e\n\u003ctd\u003e1 1\/8\"\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eFaceplate Material\u003c\/td\u003e\n\u003ctd\u003eAluminium\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eHardware Material\u003c\/td\u003e\n\u003ctd\u003eTitanium\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eWeight\u003c\/td\u003e\n\u003ctd\u003e85g, 92g, 99g\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTorque Spec: Faceplate\u003c\/td\u003e\n\u003ctd\u003e5.5Nm\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eTorque Spec: Steerer Tube\u003c\/td\u003e\n\u003ctd\u003e5.5Nm\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table
    \u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003cdiv class=\"techspecs\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e"}; window._RestockRocketConfig.variantsInventoryPolicy = {55175337378175 : "deny",55175337410943 : "deny",55175337443711 : "deny",}; window._RestockRocketConfig.variantsInventoryQuantity = {55175337378175 : parseInt("0"),55175337410943 : parseInt("0"),55175337443711 : parseInt("0"),}; window._RestockRocketConfig.variantsPreorderCount = {55175337378175 : parseInt(""),55175337410943 : parseInt(""),55175337443711 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderCountForMarket = {55175337378175 : null,55175337410943 : null,55175337443711 : null,}; window._RestockRocketConfig.variantsPreorderMaxCount = {55175337378175 : parseInt(""),55175337410943 : parseInt(""),55175337443711 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {55175337378175 : null,55 ★★★★★175337410943 : null,55175337443711 : null,}; window._RestockRocketConfig.variantsShippingText = {55175337378175 : "",55175337410943 : "",55175337443711 : "",}; window._RestockRocketConfig.variantsShippingTextForMarket = {55175337378175 : null,55175337410943 : null,55175337443711 : null,}; window._RestockRocketConfig.selected_variant_id = 55175337378175; window._RestockRocketConfig.selected_variant_available = window._RestockRocketConfig.product.variants.find(function(variant) { return variant.id == window._RestockRocketConfig.selected_variant_id }).available;window._RestockRocketConfig.scriptUrlProduct = 'https://cdn.shopify.com/extensions/019b1405-52e0-7e89-a6c1-1ac7fea6dd8f/restock-rocket-shopify-410/assets/restockrocket-product.js' window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019b1405-52e0-7e89-a6c1-1ac7fea6dd8f/restock-rocket-shopify-410/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 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, fetMetallic Mint We rented two gravel bikes to explore Scotland for nearly three weeks, and I couldn’t have been happier with the experience. The bikes came fully equipped with everything we could possibly need—repair kit, pannier bags, lock, spare tubes, and more. The team was incredibly welcoming and friendly, making the whole process seamless. There’s honestly nothing-ching 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('STOQBlackli class="result"> - 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 locale:', normalizedLocale); } delete settings.translations; return settings; } catch (e) { console.debug('STOQ - error applying translations:', e); return settings; } } // 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': 'skip' }; if (window.Shopify?.theme?.role === 'main') { headers['X-Shopify-Theme-Schema-Name'] = window.Shopify.theme.schema_name; headers['X-Shopify-Theme div class="result__image" data-aspectratio="{{ it.product.image.aspectRatio }}" data-product-image> -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 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}`); 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.pageType === 'search' && (settings.show_button_on_search || settings a href="{{ it.product.url }}" class="result__image-link" aria-label='{{ it.product.title }}'> negative I could say; everything exceeded expectations. I can wholeheartedly recommend ProjectRide for anyone looking to rent a bike, and their many 5-star reviews are absolutely well deserved.Reply.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}`); } // Check and update cart selling plans after scripts are loaded if (settings.preorder_enabled) { updateCartSellingPlans(); } // Dispatch custom event when app is loaded const appLoadedEvent = new CustomEvent('stoq:loaded', { detail: { pageType
    p class="result__title">{{ it.item.text }}★★★★★
    > These fantastic guys saved our holiday. We were bike trekking around Scotland, and after 3 days, we had serious brake problems. The oil was coming out of the calliper. I called 2 days before our arrival, and they promised to make some time for us. They fixed the problem very fast and they totally didn't take advantage of our situation. I know the prices very well, because I have done all my maintenance myself for many years, and I was surprised by the low cost. Thanks a lot guys.-Brother Cycles Mr Wooden Frameset> Wim Lintermans £699.00 { "@context": "http:/
    Amazing service and quick turnaround! Dropped my bike off at 6:30pm (closing time) one day and it had been fully serviced and sorted out by the next morning! Top service and reasonable prices. Will come back here for all bike servicing needs in the future no doubt! Guys are incredibly knowledgeable also. PurpleChristian Grahamconsole.log("pr-product-page");
    Bikes are hard to come by at the moment. Andy and Dougie at ProjektRide were amazing in sourcing a frame and a build kit, then marrying them up to create a fantastic bike. They were really attentive to sizing and fitting, based on my riding style. Extra Large Matt Wilkes
    ★★★★★ img src="//projektride.co.uk/cdn/shop/files/Screenshot_2024-06-21_at_20.20.49_2048x2048.png?v=1718997711" alt="Enigma Titanium Gravel Edge Frameset" class="mfp-zoom-in-cur" id="34094320779490"> I always get really friendly and helpful advice at ProjektRide and excellent results from any servicing they do. Highly recommended. Christine Thompson
    Home