"deny",55211120886143 : "deny",55211120918911 : "deny",55211120951679 : "deny",55211120984447 : "deny",55211121017215 : "deny",55211121049983 : "deny",55211121082751 : "deny",55211121115519 : "deny",}; window._RestockRocketConfig.variantsInventoryQuantity = {55211120656767 : parseInt("0"),55211120689535 : parseInt("0"),55211120722303 : parseInt("0"),55211120755071 : parseInt("0"),55211120787839 : parseInt("0"),55211120820607 : parseInt("0"),55211120853375 : parseInt("0"),55211120886143 : parseInt("0"),55211120918911 : parseInt("0"),55211120951679 : parseInt("0"),55211120984447 : parseInt("0"),55211121017215 : parseInt("0"),55211121049983 : parseInt("0"),55211121082751 : parseInt("0"),55211121115519 : parseInt("0"),}; window._RestockRocketConfig.variantsPreorderCount = {55211120656767 : parseInt(""),55211120689535 : parseInt(""),55211120722303 : parseInt(""),55211120755071 : parseInt(""),55211120787839 : parseInt(""),55211120820607 : parseInt(""),55211120853375 : parseInt(""),55211120886143 : parseInt( ""),55211120918911 : parseInt(""),55211120951679 : parseInt(""),55211120984447 : parseInt(""),55211121017215 : parseInt(""),55211121049983 : parseInt(""),55211121082751 : parseInt(""),55211121115519 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderCountForMarket = {55211120656767 : null,55211120689535 : null,55211120722303 : null,55211120755071 : null,55211120787839 : null,55211120820607 : null,55211120853375 : null,55211120886143 : null,55211120918911 : null,55211120951679 : null,55211120984447 : null,55211121017215 : null,55211121049983 : null,55211121082751 : null,55211121115519 : null,}; window._RestockRocketConfig.variantsPreorderMaxCount = {55211120656767 : parseInt(""),55211120689535 : parseInt(""),55211120722303 : parseInt(""),55211120755071 : parseInt(""),55211120787839 : parseInt(""),55211120820607 : parseInt(""),55211120853375 : parseInt(""),55211120886143 : parseInt(""),55211120918911 : parseInt(""),55211120951679 : parseInt(""),55211120984447 : parseInt(""),55211121017215 : p
arseInt(""),55211121049983 : parseInt(""),55211121082751 : parseInt(""),55211121115519 : parseInt(""),}; window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {55211120656767 : null,55211120689535 : null,55211120722303 : null,55211120755071 : null,55211120787839 : null,55211120820607 : null,55211120853375 : null,55211120886143 : null,55211120918911 : null,55211120951679 : null,55211120984447 : null,55211121017215 : null,55211121049983 : null,55211121082751 : null,55211121115519 : null,}; window._RestockRocketConfig.variantsShippingText = {55211120656767 : "",55211120689535 : "",55211120722303 : "",55211120755071 : "",55211120787839 : "",55211120820607 : "",55211120853375 : "",55211120886143 : "",55211120918911 : "",55211120951679 : "",55211120984447 : "",55211121017215 : "",55211121049983 : "",55211121082751 : "",55211121115519 : "",}; window._RestockRocketConfig.variantsShippingTextForMarket = {55211120656767 : null,55211120689535 : null,55211120722303 : null,55211120755071 : null,55211 120787839 : null,55211120820607 : null,55211120853375 : null,55211120886143 : null,55211120918911 : null,55211120951679 : null,55211120984447 : null,55211121017215 : null,55211121049983 : null,55211121082751 : null,55211121115519 : null,}; window._RestockRocketConfig.selected_variant_id = 55211120656767; 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/019d9ac9-5dee-74e9-8643-e17aaa8798db/restockrocket-1-482/assets/restockrocket-product.js' window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019d9ac9-5dee-74e9-8643-e17aaa8798db/restockrocket-1-482/assets/restockrocket-collection.js' window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.l
astIndexOf('/') + 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 < 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 Header Imageage = 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 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._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.S
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 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

ENVE 400mm Carbon Seatpost - 25mm Offset

Size
Quantity

Product details

This 400mm ENVE Carbon Seatpost with 25mm offset is a weight-saving performance upgrade for your bike with a patented twin-bolt clamp design for easy, accurate saddle adjustment.

Expertly constructed from uninterrupted uni-directional carbon fibre, ENVE has created a high strength, low weight seatpost with ride-enhancing vibration absorption. The post is also compatible with electronic drivetrain batteries.

The patented twin-bolt clamp design secures your saddle thanks to its method of compressing a horizontally-opposed wedge system to clamp the rails. As you tighten the front or rear bolt while loosening the other, the wedge tilts the saddle up or down, making micro adjustments of the angle easy.

Another benefit to the clamp is its narrow rail supports, which allow maximum fore and aft saddle adjustment, helping to perfect your bike fit. Two upper cradles are also supplied to cater for standard and oversized rails.

Available in 27.2, 30.9 and 31.6mm, the seatpost is compatible with the majority of bikes.

  • Continuous uni-directional carbon construction
  • Patented twin-bolt clamp design
  • Compatible with standard and oversized rails
  • Reversible lower cradles for 0-18° or 9-27° of angle adjustment
  • Titanium bolts
  • 5-year Factory Limited Warranty and Incidental Damage Protection Programme
ENVE Factory Limited Warranty

Coverage for the original owner against defects in materials and workmanship for the period of five years from the original purchase date. Product registration is required within 60 days of purchase. Second-hand owners are covered from the product's date of manufacture.

https://www.enve.com/support/warranty-terms/

ENVE Incidental Damage Protection

This 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.

https://www.enve.com/support/incidental-damage-protection-terms/

 

ENVE Carbon Seatpost - 25mm Offset
Material Carbon fibre
Weight 204g
Diameter 27.2 30.9, 31.6
Saddle Angle Adjustment 0-27-degrees
Offset 25mm
Length 400mm
Saddle Rail Compatibility 7x9mm Carbon Rails, 7mm Round Alloy Rails
Minimum Insertion 75mm
Torque Spec: Saddle Rail Clamp Bolts 5.5Nm
Torque Spec: Seatpost Collar As determined by the frame manufacturer

Frequently Asked Questions

  • Please get in touch with a member of the team either by phone (01313745324) or email ([email protected]) where on of the team will be more than happy to help.

    ProjektRide Bike Shop Edinburgh

  • 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.

    Postage is free on orders over £50. Orders under £50, our postage charge is £3.99.

    We also have a physical store, if you are local please pop in -

    ProjektRide Bike Shop Edinburgh

    82 Newington Road, EH91QN, Edinburgh.