Header Image
Eritrea (GBP£)

Blog

Eswatini (GBP£)
Ethiopia (ETBBr)
Faroe Islands (DKKkr.) France (EUR€) French Southern Territories (EUR€)
Gabon (XOFFr)
Gibraltar (GBP£)
Greece (EUR€)
Greenland (DKKkr.) Guadeloupe (EUR€) Guinea (GNFFr) Albania (ALLL) Iceland (ISKkr) Ireland (EUR€)
Angola (GBP£)
Italy (EUR€) Jersey (GBP£)
Malta (EUR€)
Mauritania (GBP£) Mauritius (MUR₨)


Germany (EUR€) Slovakia (EUR€) ody\u003e\u003c\/table\u003e","published_at":"2026-06-13T11:53:29+01:00","created_at":"2026-06-13T11:53:29+01:00","vendor":"CUBE","type":"Hybrid Trekking","tags":["Bosch Drive Unit Performance Line PX max. 90Nm (BDU34)","Bosch PowerTube 800","CUBE","Electric Bike","Hybrid Trekking","NEW 2026","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled","TOURING HYBRID COMFORT"],"price":299900,"price_min":299900,"price_max":299900,"available":false,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":57747197657471,"title":"Step-over \/ charcoal\/chrome \/ 50 cm","option1":"Step-over","option2":"charcoal\/chrome","option3":"50 cm","sku":"11140050","requires_shipping":true,"taxable":true,"featured_image":{"id":84875964809599,"product_id":15720156987775,"position":1,"created_at":"2026-06-13T11:53:30+01:00","updated_at":"2026-06-13T11:53:32+01:00","alt":"CUBE TOURING HYBRID COMFORT SLX 800 CHARCOAL\/CHROME","widment":"shopify","barcode":"4054571496003","featured_media":{"alt":"CUBE TOURING HYBRID COMFORT SLX 800 CHARCOAL\/CHROME","id":71336112783743,"position":1,"preview_image":{"aspect_ratio":1.603,"height":1248,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/111400.jpg?v=1781348012"}},"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":57747197755775,"title":"Step-over \/ charcoal\/chrome \/ 62 cm","option1":"Step-over","option2":"charcoal\/chrome","option3":"62 cm","sku":"11140062","requires_shipping":true,"taxable":true,"featured_image":{"id":84875964809599,"product_id":15720156987775,"position":1,"created_at":"2026-06-13T11:53:30+01:00","updated_at":"2026-06-13T11:53:32+01:00","alt":"CUBE TOURING HYBRID COMFORT SLX 800 CHARCOAL\/CHROME","width":2000,"height":1248,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/111400.jpg?v=1781348012","variant_ids":[57747197657471,57747197690239,57747197723007,57747197755775]},"available":false,"name"height":1281,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/111402.jpg?v=1781348012"}},"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":57747197854079,"title":"Step-through \/ Easy Entry \/ charcoal\/chrome \/ 54 cm","option1":"Step-through \/ Easy Entry","option2":"charcoal\/chrome","option3":"54 cm","sku":"111402EE54","requires_shipping":true,"taxable":true,"featured_image":{"id":84875965038975,"product_id":15720156987775,"position":8,"created_at":"2026-06-13T11:53:30+01:00","updated_at":"2026-06-13T11:53:32+01:00","alt":null,"width":2000,"height":1281,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/111402.jpg?v=1781348012","variant_ids":[57747197788543,57747197821311,57747197854079,57747197886847,57747197919615]},"available":false,"name":"CUBE TOURING HYBRID COMFORT SLX 800 CHARCOAL\/CHROME - Step-through \/ Easy Entry \/ charcoal\/chrome \/ 54 cm","public_title":"Step-through \/ Easy Entry \/ charcoal\/chrome \/ 54 cm","op
Georgia (GBP£) Seychelles (GBP£)
Sierra Leone (SLLLe)
11140054","requires_shipping":true,"taxable":true,"featured_image":{"id":84875964809599,"product_id":15720156987775,"position":1,"created_at":"2026-06-13T11:53:30+01:00","updated_at":"2026-06-13T11:53:32+01:00","alt":"CUBE TOURING HYBRID COMFORT SLX 800 CHARCOAL\/CHROME","width":2000,"height":1248,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/111400.jpg?v=1781348012","variant_ids":[57747197657471,57747197690239,57747197723007,57747197755775]},"available":false,"name":"CUBE TOURING HYBRID COMFORT SLX 800 CHARCOAL\/CHROME - Step-over \/ charcoal\/chrome \/ 54 cm","public_title":"Step-over \/ charcoal\/chrome \/ 54 cm","options":["Step-over","charcoal\/chrome","54 cm"],"price":299900,"weight":32460,"compare_at_price":null,"inventory_management":"shopify","barcode":"4054571495990","featured_media":{"alt":"CUBE TOURING HYBRID COMFORT SLX 800 CHARCOAL\/CHROME","id":71336112783743,"position":1,"preview_image":{"aspect_ratio":1.603,"height":1248,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/111400.jp30+01:00","updated_at":"2026-06-13T11:53:32+01:00","alt":null,"width":2000,"height":1281,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/111402.jpg?v=1781348012","variant_ids":[57747197788543,57747197821311,57747197854079,57747197886847,57747197919615]},"available":false,"name":"CUBE TOURING HYBRID COMFORT SLX 800 CHARCOAL\/CHROME - Step-through \/ Easy Entry \/ charcoal\/chrome \/ 46 cm","public_title":"Step-through \/ Easy Entry \/ charcoal\/chrome \/ 46 cm","options":["Step-through \/ Easy Entry","charcoal\/chrome","46 cm"],"price":299900,"weight":32460,"compare_at_price":null,"inventory_management":"shopify","barcode":"4054571496065","featured_media":{"alt":null,"id":71336113013119,"position":8,"preview_image":{"aspect_ratio":1.561,"height":1281,"width":2000,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/111402.jpg?v=1781348012"}},"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":57747197821311,"title":"Step-through \/ Easy Entry \/ char
fig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019f37a7-f058-7bcb-a02d-3fb0b8a7522a/restockrocket-1-539/assets/restockrocket-collection.js' window._RestockRocketConfig.scriptUrlProductBis = 'https://cdn.shopify.com/extensions/019f37a7-f058-7bcb-a02d-3fb0b8a7522a/restockrocket-1-539/assets/restockrocket-product-bis.js' window._RestockRocketConfig.scriptUrlCollectionBis = 'https://cdn.shopify.com/extensions/019f37a7-f058-7bcb-a02d-3fb0b8a7522a/restockrocket-1-539/assets/restockrocket-collection-bis.js' window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1) // Canary override (STOQ-1287): prefer the Render host emitted into the // metafield-cached settings (api_host) when present, mirroring the same // override in assets/js/api.js. cachedSettings is populated above. Falls // back to the build-baked host for shops without the use_render_api_host // toggle (or environments w
<
<
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

= 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

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') // Fire stoq_initialized once per page load so the funnel pipeline has a definitive // "our code ran on this page" signal independent of any cusctedVariantId || '', liquid_rendered_at: _stoqInitConfig.liquidRenderedAt || 0, app_version: _stoqInitConfig.appVersion || '', liquid_cache_age: _stoqInitConfig.liquidCacheAge, // Selected variant's stock posture as our app saw it at render — explains // whether we *should* have treated it as a preorder candidate. inventory_policy: (_stoqInitConfig.variantsInventoryPolicy || {})[_stoqSelectedVariantId] || '', inventory_quantity: (_stoqInitConfig.variantsInventoryQuantity || {})[_stoqSelectedVariantId], }); } catch (e) { console.debug('STOQ - stoq_initialized publish failed:', e); } // STOQ-1595: publish stoq_accelerated_checkout_clicked for every accelerated-checkout // click (Buy Now / dynamic checkout / Shop Pay installments) on ALL surfaces, before our // bundle loads, via one delegated capture-phase listener (catches late-rendered buttons). // Only on shops with preorders configured (shared `preordersConfigured` signal from the // derivati
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 Türkiye (GBP£) <