review_image":{"aspect_ratio":1.0,"height":776,"width":776,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/30323-pm.png?v=1679136629"},"aspect_ratio":1.0,"height":776,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/30323-pm.png?v=1679136629","width":776},{"alt":null,"id":31694625734882,"position":3,"preview_image":{"aspect_ratio":1.0,"height":776,"width":776,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/30319-pm.png?v=1679136628"},"aspect_ratio":1.0,"height":776,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/30319-pm.png?v=1679136628","width":776},{"alt":null,"id":31694625767650,"position":4,"preview_image":{"aspect_ratio":1.0,"height":776,"width":776,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/30320-pm.png?v=1679136629"},"aspect_ratio":1.0,"height":776,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/30320-pm.png?v=1679136629","width":776},{"alt":null,"id":31694625800418,"position":5,"preview_image":{"aspect_ratio":1.0,"height":776,"width":776,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/30322-pm.png?v=1679136629"},"aspect_ratio":1.0,"height":776,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/30322-pm.png?v=1679136629","width":776},{"alt":null,"id":31694625833186,"position":6,"preview_image":{"aspect_ratio":1.0,"height":776,"width":776,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/30317-pm.png?v=1679136629"},"aspect_ratio":1.0,"height":776,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/30317-pm.png?v=1679136629","width":776}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cmeta charset=\"utf-8\"\u003e\n\u003cdiv class=\"attribute\" attribute_id=\"6\"\u003e\n\u003cdiv class=\"desc\"\u003e\n\u003cmeta charset=\"utf-8\"\u003e\n\u003cdiv class=\"col\"\u003e\n\u003cdiv class=\"description\"\u003e\n\u003cp\u003eThe Cambium C67 is designed with the commuter, urban cyclist and casual tourer in mind—a perfect saddle when cycling in all weathers in the upright riding position. A comfortable bike seat made from vulcanised natural rubber, the C67 moves with you for long-lasting comfort requiring no break-in period. Offering stability thanks to the wider rear part of the saddle, the curved shape and the flexibility of the rubber base, this saddle offers maximum control during acceleration (as with the E-bike) and to prevent backward sliding during the ride, while the fan structure in fibreglass nylon adds resistance against stress and vibrations. A rubber grip on the internal back plate guarantee a solid and stable grip. Durable and waterproof, the C67 utilises a nylon top for weather and abrasion resistance, making it the best bicycle saddle for E-bike, cargo bike and Dutch-style bikes.\u003c\/p\u003e\n\u003cp\u003eKey Benefits:\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eNaturally Flexible Rubber\u003c\/li\u003e\n\u003cli\u003eMoves with you\u003c\/li\u003e\n\u003cli\u003eAll-surface shock absorption\u003c\/li\u003e\n\u003cli\u003eContinuously comfortable\u003c\/li\u003e\n\u003cli\u003eLasting upright comfort\u003c\/li\u003e\n\u003cli\u003eGreater stability\u003c\/li\u003e\n\u003cli\u003eStress resistant\u003c\/li\u003e\n\u003cli\u003eRails: Black Steel\u003c\/li\u003e\n\u003cli\u003eL: 268mm, W: 200mm, H: 59mm\u003c\/li\u003e\n\u003cli\u003eWeight: 485 g\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cp\u003eFeatures:\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003eVulcanised Natural Rubber Saddle Top\u003c\/li\u003e\n\u003cli\u003eFlexible and Robust Touring Surface\u003c\/li\u003e\n\u003cli\u003eUV + Abrasion-Resistant Waterproof Nylon Top\u003c\/li\u003e\n\u003cli\u003eInnovative Fan structure in Fibreglass-Reinforced Nylon\u003c\/li\u003e\n\u003cli\u003eNose-piece and Saddle Plate in Fibreglass-Reinforced Nylon\u003c\/li\u003e\n\u003cli\u003eRubber grip on the saddle plate\u003c\/li\u003e\n\u003cli\u003eMetal Back Plate branding detail\u003c\/li\u003e\n\u003cli\u003eDurable, Anodised Aluminium Rivets\u003c\/li\u003e\n\u003cli\u003eTubular Steel Rails\u003c\/li\u003e\n\u003cli\u003eRail Type: \u003cspan type=\"Rail Type\" class=\"option selected\" key=\"steel\"\u003eSteel\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003eWidth: \u003cspan type=\"Width\" class=\"option selected\" key=\"205mm\"\u003e205mm\u003c\/span\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {43935994118370 : "continue",};
window._RestockRocketConfig.variantsInventoryQuantity = {43935994118370 : parseInt("0"),};
window._RestockRocketConfig.variantsPreorderCount = {43935994118370 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {43935994118370 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {43935994118370 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {43935994118370 : null,};
window._RestockRocketConfig.variantsShippingText = {43935994118370 : "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {43935994118370 : null,};
window._RestockRocketConfig.selected_variant_id = 43935994118370;
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/019ecfe3-4ce2-7592-b7ce-9ed4a1b98146/restockrocket-1-530/assets/restockrocket-product.js'
window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019ecfe3-4ce2-7592-b7ce-9ed4a1b98146/restockrocket-1-530/assets/restockrocket-collection.js'
window._RestockRocketConfig.scriptUrlProductBis = 'https://cdn.shopify.com/extensions/019ecfe3-4ce2-7592-b7ce-9ed4a1b98146/restockrocket-1-530/assets/restockrocket-product-bis.js'
window._RestockRocketConfig.scriptUrlCollectionBis = 'https://cdn.shopify.com/extensions/019ecfe3-4ce2-7592-b7ce-9ed4a1b98146/restockrocket-1-530/assets/restockrocket-collection-bis.js'
window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1)
window._RestockRocketConfig.host = 'https://app.restockrocket.io'
// Deployed extension build number, read from the CDN asset host Shopify generates:
// https://cdn.shopify.com/extensions/
/-/assets/...
// Trailing digits (e.g. ".../restockrocket-1-521/assets/" -> "521"). Kept numeric to
// match ParseStoqData, so funnel app_version lines up with the order-attribution
// app_version. Reflects the ACTUAL deployed build. This is the SINGLE source of the
// parsed version — preorder.js getAppVersion() reads it back off config rather than
// re-parsing, so the regex lives in exactly one place.
try {
const _stoqVersionMatch = window._RestockRocketConfig.scriptHost.match(/(\d+)\/?(?:assets\/?)?$/);
window._RestockRocketConfig.appVersion = (_stoqVersionMatch && _stoqVersionMatch[1]) || '';
} catch (e) {
window._RestockRocketConfig.appVersion = '';
}
const SETTINGS_CACHE_DURATION = 15 * 60 * 1000; // 15 minutes in milliseconds
const LIQUID_CACHE_MAX_AGE = 15 * 60; // 15 minutes in seconds
// Calculate Liquid cache freshness once at initialization
const liquidRenderedAt = window._RestockRocketConfig.liquidRenderedAt;
// Validate timestamp and calculate ca
che age
if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) {
console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh');
window._RestockRocketConfig.isLiquidCacheFresh = true;
window._RestockRocketConfig.liquidCacheAge = null;
} else {
const now = Math.floor(Date.now() / 1000); // Current time in seconds
const liquidCacheAge = now - liquidRenderedAt; // Age in seconds
// Surfaced into funnel events: a stale cache means the app rendered with
// outdated inventory/selling-plan data — a real "had the opportunity but
// failed" cause. Negative (client clock ahead) clamps to 0.
window._RestockRocketConfig.liquidCacheAge = Math.max(0, liquidCacheAge);
// 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