<
span class="visually-hidden">Teravail Rutland Tyre
Sale
Here at ProjektRide, we rent out a range of hybrid, mountain, gravel, road, and electric bikes. These have been built with care and attention to ensure you have an awesome and hassle-free time on your bike trip!
When hiring a bike with ProjektRide, you agree to our
Bike Hire Terms & Conditions
<.
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/IMG_0060_600x.png?v=1712055309)">
Teravail Rutland Tyre
£65.00
£70.00
Black
1. Choose BikeTeravail Sparwood Tyre
Choose your preferred bike from our collection of in-house custom-builds and add to your basket. Bikes can also be hired in store.
>
Choose any optional free equipment - shown in the hire section - and add it to your basket so it's ready for you when you pick up your bike. This can also be done in store.
3. Pay Online or In-Store<
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/IMG_0057_600x.png?v=1712054027)">Checkout the hire items in your basket and pay with all major credit cards, PayPal or Klarna. Payments can be made in store without going through the online shop. Please call the shop to book out in-person.
5. Collect In Store
Collect your bike in store alongside all optional equipment. Please bring a form of identification (Driver's licence or Passport) to complete the booking.
class="visually-hidden">Park Tool Puncture Repair KitEnjoy your bike for the hire period! The bike must be returned to the store during opening hours of the return date.
>
<
a class="product__media product__media--featured"
href="/collections/finishing-kit-tyres/products/teravail-rutland-700-x-42-durable-black"
title="Teravail Rutland 700 x 42 Durable Black"
aria-label="Teravail Rutland 700 x 42 Durable Black"
style="background-image: url(//projektride.co.uk/cdn/shop/products/Screenshot2023-02-23at10.11.37_600x.png?v=1677147145)">
<
span class="visually-hidden">Teravail Rutland 700 x 42 Durable Black
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/products/Screenshot2022-07-03at18.08.11_600x.png?v=1656868141)">
deredAt; // Age in seconds
// Handle client clock ahead of server
if (liquidCacheAge
<
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
<
= 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');
restoc
kRocketScriptElement.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 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) {
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;
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-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(set
tings) {
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(function(integration) {
return integration.type === 'hijack' && i
We rented 4 gravel bikes for the Rat Race Coast to Coast. Perfect bikes, fully kitted, and great service with a smile. Definite recommendation.
Jeroen Lustig
Everything went well. We rented excellent gravel bikes for a few days’ trip in the Cairngorms National Park. The bikes were fully equipped with bags and repair tools. The team is very chill and friendly. I recommend this bike shop without any hesitation.
Jérémie Jaeger
Great spot. Rented two gravel bikes for 5 days to do some longer range rides outside of Edinburgh. Bikes were great - super comfortable, well maintained, and provisioned with paniers, locks, spare tubes, patch kits and allen keys. Process couldn't have been easier. Highly recommend.
Jed Morfit
Bike Hire FAQ
Our opening hours are Mon - Fri: 09:00 - 18:30, Sat: 9:00 - 16:00 and closed on Sundays. However, if you would like a pickup/drop off on Sundays, please drop us a message, and we can organise a time on Sundays that suit you.
We will require your full name, address and any suitable form of identification such as a passport or a driver's license.
This will be collected in store when you come to collect the bike.
Yes - you can come in store to hire a bike and can even pay with cash too! However, it would be best to call in advance to ensure we have a suitable bike for you to rent.
We offer free quipment hire with a valid bike hire. You can see our range of equipment for hire here.
We like to keep things simple here at ProjektRide, we don't take any form of security deposit.
If you happen to damage the bike, our insurance will cover it fully! We do ask for a valid passport document upon collection.
If you are looking for a custom bike for your tour, please get in touch. We can do full custom-builds at a higher rental rate.
We are happy to keep your belongings safe, including suitcases etc. whilst you are out in one of our rental bikes.
You can pick up your bike as soon as the shop opens on your collection date. Please review our working hours here.
You must return your bike before the shop closes on your return date. Please review our working hours here. Failure to do so in time may result in additional charges. Please see our Bike Hire Terms & Conditions 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 date so we can arrange your drop off out-of-hours.
You can cancel your bike hire at any time. Please contact us to cancel your booking.
If a cancellation is received within 5 days of your collection date, you will not receive a refund.
Yes, depending on where and when you’d like the bikes dropped off, we may charge a small delivery fee. The best option is to get in touch with us, and we’ll do our best to make it work.