Genesis reserves the right to change product specifications without notice. Genesis will always ensure that these changes do not detract from the ride experience of the bike.Mens
Battery Integration :
Internal
This section doesn’t currently include any content. Add content to this section using the sidebar.
Specification Disclaimer :
Ridgeback reserves the right to change product specifications without notice. Ridgeback will always ensure that these changes do not detract from the ride experience of the bike.
[]
Frequently Asked Questions
{"@context":"http:\/\/schema.org\/","@id":"\/products\/ridgeback-advance-2#product","@type":"ProductGroup","brand":{"@type":"Brand","name":"Ridgeback"},"category":"Bicycles","description":"Advance by name advanced by nature.\nOur new Ridgeback Advance 2 has everything you need to explore your local roads, trails, towpaths or wherever your curiosity takes you.\nTaking advantage of the powerful Shimano STEPS E6100 pedal assist drive unit to power over the most daunting of climbs, matched with the easy-to-use STEPS E5000 combined display and switch for simple and elegant control.\nA beautifully hidden yet powerful 504Wh battery will keep you going for up to 75 miles giving you the chance to really head out on your adventure.\nmicroSHIFT 9 speed gearing provides the right gear for any situation, and powerful hydraulic disc brakes produce plenty of stopping power.\nComfort is handled by the RST Volant suspension fork combined with 50mm wide Schwalbe G-One tyres, soaking up those bumps and providing extra grip when things get slippery.\nThe Advance 2 is ready for your adventure with fully integrated lights powered by the STEPS system, bespoke full metal mudguards and a pannier rack featuring the brilliant AtranVelo rack system.\n \n\n\nBrake Type :\n Hydraulic Disc\n\n\n\n\nFork Material :\n Alloy\n\n\n\n\nFrame Material :\n Alloy\n\n\n\n\nBattery Type :\n DARFON INTERNAL 504wh\n\n\n\n\nWheel Size :\n 700c\n\n\n\n\nBrake Levers :\n Alhonga AHJ-OD7\n\n\n\n\nIntended Use :\n E-Bike\n\n\n\n\nBrakes :\n Alhonga AHJ-OD7\n\n\n\n\nCassette Freewheel :\n microSHIFT CS-H092 11-36 9-Speed\n\n\n\n\nChain :\n KMC X9EPT\n\n\n\n\nChain Set :\n Shimano ET39 38T 170mm\n\n\n\n\nCharger :\n DARFON 2AH Smartcharger\n\n\n\n\nFork :\n RST Volant PLS-TNL 60mm\n\n\n\n\nGrip Tape :\n Ridgeback\n\n\n\n\nHandlebars :\n Alloy 680 x 20mm 15 degree Backsweep\n\n\n\n\nHeadset :\n ACROS AZX-585 ZS56\/ZS56\n\n\n\n\nHubs :\n KT TC7 32h\n\n\n\n\nMotor :\n Shimano STEPS DU-E6100 250w 60Nm\n\n\n\n\nMudguard :\n Fitted\n\n\n\n\nPedals :\n Resin Metro\n\n\n\n\nRear Derailleur :\n microSHIFT Mezzo RD-M36L 9-Speed\n\n\n\n\nRims :\n STARS J26S 32h\n\n\n\n\nSeat Post :\n Alloy 30.9x350mm\n\n\n\n\nShifters :\n microSHIFT Mezzo TS39 9-Speed\n\n\n\n\nSpokes :\n Steel 14 g\n\n\n\n\nStem :\n Integrated Adjustable Ahead\n\n\n\n\nTyres :\n Schwalbe G-One Bite 700x50c\n\n\n\n\nFrame Shape :\n Crossbar\n\n\n\n\nGender :\n Mens\n\n\n\n\nBattery Integration :\n Internal\n\n\n\n\nSpecification Disclaimer :\n Ridgeback reserves the right to change product specifications without notice. Ridgeback will always ensure that these changes do not detract from the ride experience of the bike.\n\n","hasVariant":[{"@id":"\/products\/ridgeback-advance-2?variant=45760558563554#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/rb22128_detail_01.jpg?v=1722527566\u0026width=1920","name":"Ridgeback Advance 2 - Medium","offers":{"@id":"\/products\/ridgeback-advance-2?variant=45760558563554#offer","@type":"Offer","availability":"http:\/\/schema.org\/OutOfStock","price":"2150.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/ridgeback-advance-2?variant=45760558563554"},"sku":"RB22128MD"},{"@id":"\/products\/ridgeback-advance-2?variant=45760558596322#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/rb22128_detail_01.jpg?v=1722527566\u0026width=1920","name":"Ridgeback Advance 2 - Large","offers":{"@id":"\/products\/ridgeback-advance-2?variant=45760558596322#offer","@type":"Offer","availability":"http:\/\/schema.org\/InStock","price":"1500.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/ridgeback-advance-2?variant=45760558596322"},"sku":"RB22128LG"},{"@id":"\/products\/ridgeback-advance-2?variant=45760558629090#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/rb22128_detail_01.jpg?v=1722527566\u0026width=1920","name":"Ridgeback Advance 2 - X-Large","offers":{"@id":"\/products\/ridgeback-advance-2?variant=45760558629090#offer","@type":"Offer","availability":"http:\/\/schema.org\/OutOfStock","price":"1500.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/ridgeback-advance-2?variant=45760558629090"},"sku":"RB22128XL"}],"name":"Ridgeback Advance 2","productGroupID":"8661110030562","url":"https:\/\/projektride.co.uk\/products\/ridgeback-advance-2"}
ned `cachedSettings` comes from the app-embed Liquid render, which
// Shopify edge-caches and can serve stale. Reading the same `settings` metafield
// back over the Storefront API is a POST to /api/
/graphql.json — never
// CDN-cached — so it returns the live value on every page load. We fetch it
// best-effort and stash it on `window._RestockRocketConfig.storefrontSettings`
// so individual behaviours can migrate onto the fresh value over time. This is
// PURELY ADDITIVE: it does NOT change the resolution flow below, never blocks
// init, and silently no-ops on any failure / missing token.
(function loadStorefrontSettings() {
const cfg = window._RestockRocketConfig;
if (!cfg.storefrontAccessToken || cfg.disableStorefrontApi === true) return;
// Deferred to browser idle so this best-effort read runs strictly AFTER the
// critical init flow and never competes with it for a connection — the call
// is a live, uncached Storefront round-trip and can be slow (multi-second
// TTFB observed). Nothing on the critical path waits for it.
function run() {
const query = 'query StoqSettings($namespace: String!) { shop { metafield(namespace: $namespace, key: "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.storefrontSettings = JSON.parse(value);
console.debug('STOQ - stored live settings from Storefront API on config.storefrontSettings');
})
.catch(function(e) {
console.debug('STOQ - Storefront settings fetch failed (non-fatal):', e && e.message);
});
}
if (typeof window.requestIdleCallback === 'function') {
window.requestIdleCallback(run, { timeout: 5000 });
} else {
setTimeout(run, 0);
}
})();
// 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': 'ski
p'
};
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('Sipts. Race against a 1000ms timeout so a slow
// API can't block init indefinitely. If the timeout wins, the in-flight
// fetches still complete and update window._RestockRocketConfig — the
// bundle re-reads sellingPlans/integrations on every interaction, so the
// late-arriving values benefit subsequent renders even though the first
// paint may use the Liquid-cached values. On any failure the existing
// Liquid-loaded values stay in place via fetchEmbedConfig's catch.
if (!window._RestockRocketConfig.isLiquidCacheFresh && !settings.disable_refresh_on_stale_liquid) {
console.debug('STOQ - Liquid cache stale, refreshing selling_plans + integrations');
Promise.race([
Promise.all([
fetchEmbedConfig('selling_plans', function(data) {
if (data && Array.isArray(data.plans)) {
window._RestockRocketConfig.sellingPlans = data.plans;
window._RestockRocketConfig.disabledSellingPlanIds = data.disabled_plan_ids || [];
}
}),
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
n,
// an enabled offer exists, or a disabled-but-kept plan id remains (cart sweep
// must still strip those). Rationale in the PR.
const hasEnabledOffer = Array.isArray(window._RestockRocketConfig.sellingPlans)
&& window._RestockRocketConfig.sellingPlans.some(function(plan) { return plan && plan.enabled; });
const hasDisabledPlanIds = Array.isArray(window._RestockRocketConfig.disabledSellingPlanIds)
&& window._RestockRocketConfig.disabledSellingPlanIds.length > 0;
const usePreorderBuild = settings.preorder_enabled || hasEnabledOffer || hasDisabledPlanIds;
const collectionScriptUrl = usePreorderBuild
? window._RestockRocketConfig.scriptUrlCollection
: window._RestockRocketConfig.scriptUrlCollectionBis;
const productScriptUrl = usePreorderBuild
? window._RestockRocketConfig.scriptUrlProduct
: window._RestockRocketConfig.scriptUrlProductBis;
const pageType = window._RestockRocketConfig.pageType;
const collecti
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