Blog
Eswatini (GBP£)- Ascension Island (SHP£) Kenya (KESKSh) Austria (EUR€)
- Kosovo (EUR€) Belarus (GBP£)
- Latvia (EUR€) Belgium (EUR€) Lesotho (GBP£)
- Benin (XOFFr) Liberia (GBP£)
- Bosnia & Herzegovina (BAMКМ) Libya (GBP£) Botswana (BWPP)
- Liechtenstein (CHFCHF)
- Madagascar (GBP£)
- Malawi (MWKMK)
- Mali (XOFFr)
| 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.jp | ment":"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,"name30+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 | "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
= 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
- st('form');
var vidEl = form && form.querySelector('[name="id"]');
var variantId = (vidEl && vidEl.value) || _sqTrack.selected_variant_id || '';
// The enabled STOQ selling plan the clicked variant belongs to (if any), found once and
// reused for in_enabled_plan / enrolled_plan_id / enrolled_plan_provider below.
var _sqVidNum = Number(variantId);
var _sqPlan = null;
// Array.isArray guard (not `|| []`) so a truthy non-array sellingPlans can't throw and
// silently drop the whole publish.
var _sqPlans = Array.isArray(_sqTrack.sellingPlans) ? _sqTrack.sellingPlans : [];
_sqPlans.forEach(function (pl) {
if (!_sqPlan && pl && pl.enabled && Array.isArray(pl.variant_ids) &&
pl.variant_ids.indexOf(_sqVidNum) !== -1) { _sqPlan = pl; }
});
Shopify?.analytics?.publish?.('stoq_accelerated_checkout_clicked', {
variant_id: variantId,
product_id: (_sqTrcceleratedGateArmed,
gate_active_at_click: !!(document.documentElement &&
document.documentElement.classList.contains('stoq-buy-now-pending')),
},
});
} catch (err) { /* never break checkout */ }
}, true);
}
} catch (e) { /* fail open */ }
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 || {})tion 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); }); } }); } // ---- Live settings via the Storefront API (ad
< "settings") { value } } }'; fetch( `https://${cfg.shop}/api/2025-07/graphql.json`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Shopify-Storefront-Access-Token': cfg.storefrontAccessToken, }, body: JSON.stringify({ query: query, variables: { namespace: cfg.metafieldNamespace } }), } ) .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(', ')); } const value = body && body.data && body.data.shop && body.data.shop.metafield && body.data.shop.metafield.value; if (!value) { throw new Error('Storefront API returned no settings metafield value'); } cfg.stop' }; 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(cachedSettings); } else { console.error('S endpoint + ':', applyError); throw applyError; } }) .catch(function(error) { console.debug(`STOQ - using cached ${endpoint}:`, error.message); }); } function initializeScripts(settings) { settings = applyTranslations(settings); window._RestockRocketConfig.settings = settings; console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`); // Stale-Liquid resilience (default-on, per-shop opt-out via the // `disable_refresh_on_stale_liquid` Toggle, surfaced as the negative // `disable_refresh_on_stale_liquid` flag in settings.json so that // `undefined` -- in CDN-cached metafield payloads that predate this // key -- reads as `!undefined === true` and gets default-on behavior // immediately, no metafield rewrite required). // When the Liquid CDN cache is older than LIQUID_CACHE_MAX_AGE the in-page // selling_plans / integrations metafields can be wrong; refresh both from // the API before launching scr } }), fetchEmbedConfig('integrations', function(data) { if (Array.isArray(data)) { window._RestockRocketConfig.integrations = data; } }) ]), new Promise(function(resolve) { setTimeout(resolve, 1000); }) ]).then(function() { loadScripts(settings); }); return; } loadScripts(settings); } function loadScripts(settings) { // 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); }) // STOQ-1520: serve the lean back-in-stock-only build (no preorder/hijack code) // only to shops with NO preorder plans. Use the full build if preorder is o
onPageTypes = ['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) { // cart/article/blog/list-collections: full build so the cart sweep runs. createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection); } else { console.debug(`STOQ - no scripts enabled for ${pageType}`); } // Dispatch custom event when app is loaded // Cart selling plan updates will be triggered by stoq:inventory-data-loaded event const appLoadedEvent = new CustomEvent('stoq:loaded', { detail: { pageType: window._RestockR




Liberia (GBP£)






Côte d’Ivoire (XOFFr)
Djibouti (DJFFdj)
#SiteFooter {
--PT: 100px;
--PB: 10px;
--bg-lighten-darken-shimmer-bg: #0d0d0d;
--bg-lighten-darken-shimmer-effect: #121212;
--text: #ffffff;
--text-alpha-15: rgba(255, 255, 255, 0.15);
--text-alpha-50: rgba(255, 255, 255, 0.6);
--text-alpha-85: rgba(255, 255, 255, 0.85);--border: #ffffff;}
#SiteFooter .footer-bottom { --grid-columns: 3; }
#SiteFooter .footer-block--logo { min-width: calc(160px + calc(var(--gutter) / 2)); }
#SiteFooter .footer-block__logo-image { width: 160px; }
Quick Links