Western Sahara (MADد.م.)
Netherlands (EUR€)
Kosovo (EUR€)
Niger (XOFFr)
Book a Service
QuantityRwanda (RWFFRw)
San Marino (EUR€)
Cycle to Work
- São Tomé & Príncipe (STDDb) Delivery & Returns
- InformationMon - Fri: 08:30 - 17:30Sat: 9:00 - 16:00Sun: Closed0131 374 5324
- Newington RoadEdinburghEH9 1QN[email protected]
- await import("https://cdn.shopify.com/shopifycloud/shop-js/modules/v2/loader.shop-follow-button.en.esm.js");
- Country GBP£
| { "@context": "http://schema.org", "@type": "Article", "articleBody": "", "mainEntityOfPage": { "@type": "WebPage", "@id": "https:\/\/projektride.co.uk" }, "headline": "Custom build - Surly Disc Trucker", "image": [ "https:\/\/projektride.co.uk\/cdn\/shop\/articles\/IMG_8788_1179x.jpg?v=1720101839" ], "datePublished": "2024-07-04T15:04:20Z", "dateCreated": "2024-07-04T15:03:58Z", "author": { "@type": "Person", "name": "andy graham" }, "publisher": { "@type": "Organization", "name": "ProjektRide" } } | n/a | .recommended-posts { --PT: 60px; --PB: 60px; } .recommended-posts .blog__post-image-link { padding-top: 90.0%; } .recommended-posts .blog__post-item { --text: #ffffff; } Finland (EUR€)
| F/D | France (EUR€)Shimano Sora or Microshift | Adventure Cycling Scotland
| R/D June 03, 2026 | Shimano Sora or Microshift#Accordions--template--26482385289599__section_accordions_with_images_X6gfAL { --PT: 60px; --PB: 60px; --border-opacity: 0; --border-width: 1px; --MB: 10px; --padding-left: 0; --bg-padded-line: var(--bg); } #Accordions--template--26482385289599__section_accordions_with_images_X6gfAL .section__heading { --heading-size: calc(var(--adjust-heading) * 1.2); } #Accordions--template--26482385289599__section_accordions_with_images_X6gfAL .accordion__item { --bg-item: #fafafa; } Adventure Cycling Scotland If you're researching adventure cycling scotland, ProjektRide is ideally positioned to help. Based in Edinburgh, we specialise in premium bike hire for riders exploring Scotland's roads, gravel tracks, bikepacking routes and touring... | Gabon (XOFFr)
| SHIFTERS | Frequently Asked Questions Gambia (GMDD)Shimano Sora Scottish Bikepacking Guide |
| BRAKE CALIPERSWhat do you need from me to hire a bike? | Scottish Bikepacking Guide If you're researching scottish bikepacking guide, ProjektRide is ideally positioned to help. Based in Edinburgh, we specialise in premium bike hire for riders exploring Scotland's roads, gravel tracks, bikepacking routes and touring...Tektro MDC550 Mechanical | We will require your full name, address and any suitable form of identification such as a passport or a driver's license. Germany (EUR€)
| FRONT BRAKE ROTOR | Ghana (GBP£)Tektro TR160mm (centerlock)Can I hire in store? |
| REAR BRAKE ROTORcall in advance | to ensure we have a suitable bike for you to rent.#SiteFooter .footer-block--logo { min-width: calc(160px + calc(var(--gutter) / 2)); } #SiteFooter .footer-block__logo-image { width: 160px; }Tektro TR160mm (centerlock) | Greece (EUR€)
| BRAKE LEVERS | Quick LinksGreenland (DKKkr.)Shimano Sora or MicroshiftWe offer free quipment hire with a valid bike hire. You can see our range of equipment for hire | here
| HEADSET | FSA No.1/No.10Do I need to pay a security deposit?Contact Us | Guernsey (GBP£)
| HANDLEBARIf you happen to damage the bike, our insurance will cover it fully! We do ask for a valid passport document upon collection. | Guinea (GNFFr)Kona Road Track Service Progress |
| STEM | If you are looking for a custom bike for your tour,Kona Roadplease get in touchInsure Your Bike | . We can do full custom-builds at a higher rental rate. Hungary (HUFFt)
| SEATPOST | Can I ProjektRide keep my belongings safe whilst I travel with the bike? Iceland (ISKkr)Kona Thumb w/Offset 27.2mm Cookie Policy |
| SEAT CLAMP | Kona ClampFrom what time can I pick up my hire bike?Refund policy | Isle of Man (GBP£)
| GRIPShereService | . Italy (EUR€)Kona Cork Tape |
| SADDLE | Book a ServiceWTB VoltYou must return your bike before the shop closes on your return date. Please review our working hours | here Kenya (KESKSh)
| FRONT HUB for more information. If you are returning your bike on a Sunday, | please add a note to your order with your number and your ETA return Cycle to WorkKosovo (EUR€)Shimano or Formula 100x12mm (centerlock)date so we can arrange your drop off out-of-hours. |
| REAR HUBCan I cancel my bike hire? | InformationShimano or Formula 142x12mm (centerlock) Mon - Fri: 08:30 - 17:30 | You can cancel your bike hire at any time. Please Sat: 9:00 - 16:00Lesotho (GBP£)
| SPOKESIf a cancellation is received within 5 days of your collection date, you will not receive a refund. Newington Road | EdinburghLiberia (GBP£)Stainless Black 14g EH9 1QN | [email protected]
| RIMS | Yes, depending on where and when you’d like the bikes dropped off, we may charge a small delivery fee. The best option is toWTB ST i23 TCS 2.0get in touch | with us, and we’ll do our best to make it work. Liechtenstein (CHFCHF)
| FRONT TIRE | Lithuania (EUR€)Maxxis Rambler EXO 650x47c | Country
| REAR TIRE GBP£ | Maxxis Rambler EXO 650x47c#SiteFooter .footer-block--logo { min-width: calc(160px + calc(var(--gutter) / 2)); } #SiteFooter .footer-block__logo-image { width: 160px; } | Madagascar (GBP£)
| Türkiye (GBP£) | Uganda (UGXUSh) | ||||||
| Klarna | Maestro | ||||||
| PayPal | Shop Pay | Union Pay | Visa | ||||
| 13 Luxembourg (EUR€) | Gibraltar (GBP£)FRONT CENTER | 592 Madagascar (GBP£) | Greece (EUR€)604 | 612 Malawi (MWKMK) | Greenland (DKKkr.)623 | 628 Mali (XOFFr) | Guadeloupe (EUR€)643 |
| 14 | FORK LENGTH Mauritania (GBP£) | Guinea (GNFFr)400 | 400 Mauritius (MUR₨) | Guinea-Bissau (XOFFr)400 | 400 Mayotte (EUR€) | Hungary (HUFFt)400 | 400 Moldova (MDLL) | Iceland (ISKkr)
| 15 Monaco (EUR€) | Ireland (EUR€)FORK OFFSETClose | 50 Montenegro (EUR€) | Isle of Man (GBP£)50 | 50 Morocco (MADد.م.) | Italy (EUR€)50 | 50 Mozambique (GBP£) | Jersey (GBP£)50 |

Latvia (EUR€)
SIZING + FIT Nigeria (NGN₦)
Lesotho (GBP£)GRAVEL / DROP BAR / URBAN
North Macedonia (MKDден)
Libya (GBP£)
Liberia (GBP£)
| HEIGHT/INCHES Poland (PLNzł) | Liechtenstein (CHFCHF)||||||||
|---|---|---|---|---|---|---|---|---|
| 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 || '', 4'10"-5'1" 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) || has(_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 === false), 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; } })(), }, 147-155cm São Tomé & Príncipe (STDDb) }); } 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.debu Malta (EUR€) g('STOQ - no cart selling plan updates needed'); } }) .catch(error => { console.error('STOQ - error updating cart selling plans:', error); }); } }); } function storefrontGraphql(query, variables) { const cfg = window._RestockRocketConfig; if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) { return Promise.reject(new Error('Storefront API unavailable')); } return fetch( `https://${cfg.shop}/api/${cfg.storefrontApiVersion}/graphql.json`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Shopify-Storefront-Access-Token': cfg.storefrontAccessToken, }, body: JSON.stringify({ query: query, variables: variables }), } ) .then(function(response) { if (!response.ok) { throw new Error('Storefront API HTTP ' + response.status); } 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(', ')); } return body && body.data; }); } function fetchStorefrontShopMetafield(key) { const cfg = window._RestockRocketConfig; const query = 'query StoqShopMetafield($namespace: String!, $key: String!) { shop { metafield(namespace: $namespace, key: $key) { value } } }'; return storefrontGraphql(query, { namespace: cfg.metafieldNamespace, key: key }) .then(function(data) { const value = data && data.shop && data.shop.metafield && data.shop.metafield.value; if (!value) { throw new Error('Storefront API returned no ' + key + ' metafield value'); } return JSON.parse(value); }); } (function loadStorefrontSettings() { const cfg = window._RestockRocketConfig; if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) return; function run() { // The live-settings read is one more shop24”-27” -level metafield fetch, so it // shares fetchStorefrontShopMetafield with the integrations/selling_plans // reads rather than re-issuing the same query + parse. fetchStorefrontShopMetafield('settings') .then(function(settings) { cfg.storefrontSettings = settings; 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.cachedSettings; const validCachedSettings = cachedSettings ? checkSettingsExpiry(cachedSettings) : null; if (validCachedSettings) { console.debug('STOQ - using cached settings'); initializeScripts(validCachedSettings); } else { consol | e.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 not 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 refreshShopConfig(source) { const cfg = window._RestockRocketConfig; const viaEmbed = function() { return fetchEmbedConfig(source.endpoint, source.apply); }; const flagOn = !!cfg.readFlags && cfg.readFlags[source.flag] === true; if (!flagOn || source.embedOnly === true) { return viaEmbed(); } return fetchStorefrontShopMetafield(source.metafieldKey) .then(function(value) { if (!source.isValid(value)) { throw new Error(source.metafieldKey + ' metafield is not a valid ' + source.endpoint + ' payload'); } source.apply(value); console.debug('STOQ - refreshed ' + source.endpoint + ' from the Storefront API'); }) .catch(function(error) { console.debug('STOQ - Storefront ' + source.endpoint + ' read failed, using embed:', error.message); return viaEmbed(); }); } function refreshIntegrations() { const cfg = window._RestockRocketConfig; return refreshShopConfig({ endpoint: 'integrations', metafieldKey: 'integrations',61-69cm Senegal (XOFFr) flag: 'enable_storefront_integrations_read', isValid: function(value) { return Array.isArray(value); }, apply: function(data) { cfg.integrations = data; } }); } function refreshSellingPlans(embedOnly) { const cfg = window._RestockRocketConfig; return refreshShopConfig({ embedOnly: embedOnly === true, endpoint: 'selling_plans', metafieldKey: 'cachedSellingPlans', flag: 'enable_storefront_selling_plans_read', isValid: function(value) { return !!value && Array.isArray(value.plans); }, apply: function(data) { cfg.sellingPlans = data.plans; cfg.disabledSellingPlanIds = data.disabled_plan_ids || []; if (data && data.read_flags && typeof data.read_flags === 'object' && !Array.isArray(data.read_flags)) { cfg.readFlags = data.read_flags; } } }); } function initializeScripts(settings) { settings = applyTranslations(settings); window._RestockRocketConfig.settings = setting | s; console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`); const forceEmbedSellingPlans = settings.force_embed_selling_plans === true; const staleRefresh = !window._RestockRocketConfig.isLiquidCacheFresh && !settings.disable_refresh_on_stale_liquid; if (forceEmbedSellingPlans || staleRefresh) { console.debug('STOQ - refreshing selling_plans' + (staleRefresh ? ' + integrations (Liquid cache stale)' : ' (force_embed_selling_plans)')); const refreshes = [refreshSellingPlans(forceEmbedSellingPlans)]; if (staleRefresh) { refreshes.push(refreshIntegrations()); } Promise.race([ Promise.all(refreshes), 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._RestockRocketCo Mauritania (GBP£) nfig.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) && window._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._RestockRocketConfig.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 } }); 48cm console.debug('STOQ - dispatching app loaded event'); window.dispatchEvent(appLoadedEvent); } } | html.stoq-buy-now-pending .shopify-payment-button{pointer-events:none!important}50cm Serbia (RSDРСД) | Mauritius (MUR₨)48cm | N/A Seychelles (GBP£) | Mayotte (EUR€)XS |
| 5'0"-5'3" | 152-160cmSlovakia (EUR€) | Monaco (EUR€)26"-29" | 66-74cmSlovenia (EUR€) | Montenegro (EUR€)48-50cm | 50cm Somalia (GBP£) | Morocco (MADد.م.)48-50cm | Small South Africa (GBP£) | Mozambique (GBP£)Small |
| 5'2"-5'7" | 157-170cm Spain (EUR€) | Netherlands (EUR€)27"-30" | 69-76cm St. Helena (SHP£) | Niger (XOFFr)48-52cm | 50-52cm Sudan (GBP£) | Nigeria (NGN₦)48-52cm | Small, MediumSvalbard & Jan Mayen (GBP£) | North Macedonia (MKDден)Small, Medium |
| 5'6"-5'10" | 168-178cmSwitzerland (CHFCHF) | Poland (PLNzł)29"-31" | 74-79cmTanzania (TZSSh) | Portugal (EUR€)52-54cm | 52-54cmTogo (XOFFr) | Réunion (EUR€)52-54cm | MediumTristan da Cunha (GBP£) | Romania (RONLei)Medium |
| 5'9"-6'0" | 175-183cmTürkiye (GBP£) | |||||||
Frequently Asked Questions
-
Please get in touch with a member of the team either by phone ( 01313745324 Uganda (UGXUSh) ) or email ( [email protected] ) where on of the team will be more than happy to help.
ProjektRide Bike Shop Edinburgh Ukraine (UAH₴)
Search for products on our site

Road / Gravel / Touring Bikes
Shop by Brand
Gloria






