your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enabled":false,"preorder_progress_bar_text":"{{ sold }} of {{ total }} claimed","preorder_progress_bar_fill_color":"#000000","preorder_progress_bar_background_color":"#e5e5e5","preorder_progress_bar_text_color":"#FFFFFF","preorder_progress_bar_border_radius":4,"preorder_progress_bar_show_percentage":false}];(function() {
const cachedData = {"plans":[{"shopify_selling_plan_group_id":98590196095,"shopify_selling_plan_id":713071886719,"enabled":true,"variant_ids":[55569712382335,55569712415103,55569712480639,55570017616255,55570017550719,55569712447871,55570017583487],"product_variants_source":"custom","name":"Preorder","preorder_button_text":"Preorder","preorder_button_description":"Note: This is a preorder. Items will ship based on the estimated delivery date.","preorder_button_description_enabled":true,"preorder_button_description_background_color":"#ebebeb","preorder_button_description_text_color":"#000000","preorder_button_description_b
order_radius":10,"preorder_button_description_show_quantity_limit":false,"preorder_button_description_quantity_limit_suffix":" units available for preorder","preorder_button_description_shipping_text_prefix":"Shipping: ","delivery_exact_time":null,"delivery_after_n_intervals":null,"delivery_at":"2025-07-26T09:20:18.169Z","delivery_type":"asap","quantity_limit_text":"{{ quantity }} units available for preorder","preorder_button_description_show_shipping":true,"preorder_button_description_icons_enabled":true,"preorder_shipping_text":"Shipping: {{ date }}","shipping_applies_to_all_products":true,"shipping_text":"Estimated to ship within 2 months","payment_type":"full","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"discount_text":"Save {{ discount }}","billing_title":"Full payment","billing_description":null,"enable_billing_widget":false,"inventory_provider"Using selling plans from cachedSellingPlans (cached_at: ' + cachedData.cached_at + ')');
}
} else {
// When using old format (stale cache), don't trust disabled_plan_ids
window._RestockRocketConfig.disabledSellingPlanIds = [];
console.debug('[RR] Using selling plans from old format (max updated_at: ' + maxUpdatedAt + ')');
}
}
})();window._RestockRocketConfig.enabledNotifyMeVariantIds = [];window._RestockRocketConfig.disabledNotifyMeVariantIds = [];window._RestockRocketConfig.backInStockTemplates = [];window._RestockRocketConfig.restockNotes = {};window._RestockRocketConfig.integrations = [{"id":"15c94526-b6b8-4de1-9bc1-23b1ca52ddb0","shop_id":38436,"enabled":true,"page_types":["product","collection","index","search","page","cart","list-collections","article","blog"],"configuration":{"toastDuration":10000,"toastPosition":"bottom-right","enableXHRHijack":true,"enableFetchHijack":true,"quantityLimitDisabled":false},"type":"hijack","css_config":nu
ll,"js_config":null,"created_at":"2025-07-26T09:16:04.076Z","updated_at":"2025-07-26T09:16:04.076Z"}];window._RestockRocketConfig.obfuscateInventoryQuantity = false;window._RestockRocketConfig.product = {"id":15327699042687,"title":"Marin Alcatraz 1","handle":"marin-alcatraz-1","description":"\u003cp\u003eThe Alcatraz 1 allows the rider to follow in Matt Jones’ footsteps to build and personalize the best dirt jump bike possible. At home boosting your local 6-pack, ripping up the pump track, or hitting the local skate park the Alcatraz has what you need to take care of business.\u003cbr\u003e\u003c\/p\u003e\n\u003cp\u003eThe Series 3 aluminum frame is built for the hard knocks and is stiff enough for lightning-fast acceleration and tough enough for the heavy hits. Short stays keep manuals easy and ambidextrous cable routing means you can run your brake on the left or right of the bars. There’s a suspension-corrected CrMo fork, front and rear Tektro disc brakes, Vee Tire rubber and plenty of bombproof Marinlse,"name":"Marin Alcatraz 1 - Small","public_title":"Small","options":["Small"],"price":84900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":56189674291583,"title":"Large","option1":"Large","option2":null,"option3":null,"sku":"739116002","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Marin Alcatraz 1 - Large","public_title":"Large","options":["Large"],"price":84900,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}}],"images":["\/\/projektride.co.uk\/cdn\/shop\/files\/ALCATRAZ-1-25-P_bc01cc3c-cc52-48ba-9afa-f20ac582426b.jpg?v=1760008444"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/ALCATRAZ-1-25-P_bc01cc3c-cc52-48ba-9afa-f20ac582426b.jpg?v=1760008444","options":
["Size"],"media":[{"alt":null,"id":68074177659263,"position":1,"preview_image":{"aspect_ratio":1.459,"height":1478,"width":2157,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/ALCATRAZ-1-25-P_bc01cc3c-cc52-48ba-9afa-f20ac582426b.jpg?v=1760008444"},"aspect_ratio":1.459,"height":1478,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/ALCATRAZ-1-25-P_bc01cc3c-cc52-48ba-9afa-f20ac582426b.jpg?v=1760008444","width":2157}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cp\u003eThe Alcatraz 1 allows the rider to follow in Matt Jones’ footsteps to build and personalize the best dirt jump bike possible. At home boosting your local 6-pack, ripping up the pump track, or hitting the local skate park the Alcatraz has what you need to take care of business.\u003cbr\u003e\u003c\/p\u003e\n\u003cp\u003eThe Series 3 aluminum frame is built for the hard knocks and is stiff enough for lightning-fast acceleration and tough enough for the heavy hits. Short stays keep manuals easy and ambiInt(""),56189674291583 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {56189674258815 : null,56189674291583 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {56189674258815 : parseInt(""),56189674291583 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {56189674258815 : null,56189674291583 : null,};
window._RestockRocketConfig.variantsShippingText = {56189674258815 : "",56189674291583 : "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {56189674258815 : null,56189674291583 : null,};
window._RestockRocketConfig.selected_variant_id = 56189674258815;
window._RestockRocketConfig.selected_variant_available = window._RestockRocketConfig.product.variants.find(function(variant) { return variant.id == window._RestockRocketConfig.selected_variant_id }).available;// STOQ-1595/1612 shared signal, derived once here so both the accelerated-checkout block
// gate (STOQ-1612) and the click tracker (ST
OQ-1595) read one clearly-owned flag rather
// than a side effect buried in either consumer's try/catch: whether this shop has preorders
// configured at all — an enabled selling plan plus at least one preorder variant id,
// independent of the block toggle. Fail-open: on error the flag stays unset and both
// consumers no-op.
try {
var _sqCfg = window._RestockRocketConfig;
var _sqPlanEnabled = Array.isArray(_sqCfg.sellingPlans) &&
_sqCfg.sellingPlans.some(function (p) { return p && p.enabled; });
var _sqPreCount = ((_sqCfg.cachedPreorderVariantIds &&
_sqCfg.cachedPreorderVariantIds.preorder_variant_ids) || []).length;
_sqCfg.preordersConfigured = !!(_sqPlanEnabled && _sqPreCount);
} catch (e) { /* fail open */ }
// STOQ-1612: block (not hide) Buy Now / Shop Pay until our JS runs, so a tap in the
// load window can't bypass preorder. pointer-events via .stoq-buy-now-pending (no
// reflow); timeout releases; renderPreorderButton / featured_product.js lift it.
<
uuid>/
Trek Domane+ AL 5erms') ? 'shop_pay_installments' : 'buy_now'; var form = host.closest('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_accelerat
ed_checkout_clicked', { variant_id: variantId, product_id: (_sqTrack.product && _sqTrack.product.id) || '', channel: channel, market_id: _sqTrack.marketId || '', country_code: _sqTrack.countryIsoCode || '', page_type: _sqTrack.pageType || '', cart_token: _sqTrack.cartToken || '', page_url: (window.location && window.location.href) || '', properties: { // Mirror the bundle's own preorder check (preorder.js checkInventoryProvider- // WithCachedFallback): the live set config.preorderVariantIds (refreshed after // page load by loadVariantInventoryData) OR the Liquid-injected // cachedPreorderVariantIds — always present, so it covers clicks before the // bundle loads (why this tracker is inline). ORing both (not preferring one) // matches the bundle and is correct even if the live set is an empty array. Both / / hold integer ids; the click-time id comes off a DOM input (.value → string) or // selected_variant_id, so coerce with Number for a like-typed compare. is_preorder_variant: (function () { var vid = Number(variantId); var has = function (a) { return Array.isArray(a) && a.indexOf(vid) !== -1; }; return has(_sqTrack.preorderVariantIds) || has(_sqTrack.cachedPreorderVariantIds && _sqTrack.cachedPreorderVariantIds.preorder_variant_ids); })(), // Narrow, authoritative preorder signal: enrolled in an ENABLED STOQ selling plan // (is_preorder_variant above is the broad OOS+continue heuristic — non-STOQ too). in_enabled_plan: !!_sqPlan, // In-stock preorder signal: enrolled but currently IN STOCK (in the inStockVariantIds // set, not the OOS preorderVariantIds set). Same live-OR-cached pattern as // is_pre.error('STOQ - error updating cart selling plans:', error);
});
}
});
}
// ---- Live settings via the Storefront API (additive, does not gate init) ----
// The inlined `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/
<
version>/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.stoTOQ - failed to load settings:', error);
}
})
.catch(function(e) {
console.error(e)
})
}
function fetchEmbedConfig(endpoint, apply) {
return fetch(
`${window._RestockRocketConfig.host}/api/v1/embed/${endpoint}.json`,
{
headers: {
'X-Shopify-Shop-Domain': window._RestockRocketConfig.shop || window.Shopify.shop,
'ngrok-skip-browser-warning': 'skip'
}
}
)
.then(function(response) {
if (!response.ok) throw new Error(`Failed to fetch ${endpoint}`);
return response.json();
})
.then(function(data) {
try {
apply(data);
} catch (applyError) {
// Apply failures are programming bugs (e.g. response shape changed
// server-side and the assignment threw). Surface them as console.error
// so they're visible in browser logs, then re-throw to fall through
// to the same Liquid-cached fallback as a fetch failure.
console.error('STOQ - apply failed for ' +
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
ipts. 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
Hire
Bikes
QuantitySee More
Singular
Frog
Surly
New Bikes
- See More1
- Shop All New Bikes 2 Road / Gravel / Touring Bikes
- Hybrid / City Bikes3 Mountain Bikes
- 4 Electric Bikes
- Kids Bikes 5 Frames
See More
Looking to purchase with a cycle to work scheme?
Click hereWorkshop to get in touch and get the ball rolling!
See More

I'm looking to find out more information about a product, where can I find this?

Refund policy



198770914,45824207978722,45824208011490,45824208044258,45824208077026,45824208109794,45824208142562,45824208175330,45824208208098,45824208240866,45824374767842,45824374800610,45824374833378,45824374866146,45824374898914,45824374931682,45824374964450,45824374997218,45824375029986,45824375062754,45824375095522,45824375128290,45824375161058,45824375193826,45824375226594,45824375259362,45824375292130,45824375324898,45824384434402,45824384467170,45824384499938,45824384532706,45824384565474,45824384598242,45824384631010,45824384663778,45824384696546,45824385515746,45824385548514,45824385581282,45824385614050,45824385646818,45824385679586,45824385712354,45824385745122,45824385777890,45824388956386,45824389054690,45824389120226,45824389185762,45824389218530,45824389284066,45824389316834,45824389349602,45824389382370,45824389415138,45824389447906,45824389480674,45824389513442,45824389546210,45824389578978,45824394887394,45824394920162,45824423035106,45824423067874,45824423100642,45824423198946,45824477069538,458244771
02306,45824477167842,45824477200610,45824492372194,45824492404962,45824492470498,45824504922338,45824504955106,45824505020642,45824505053410,45824505151714,45824511574242,45824511607010,45824516260066,45824516292834,45824516423906,45824516554978,45824527794402,45824527827170,45824527859938,45824527925474,45824527991010,45824534872290,45824534937826,45824535036130,45824535068898,45824535101666,45824620331234,45824634355938,45824634421474,45824634487010,45824634519778,45824705298658,45824705331426,45824771653858,45824798687458,45824798720226,45824798752994,45824798785762,45824798818530,45824798851298,45824798884066,45824798916834,45824798949602,45824798982370,45824799015138,45824799047906,45824799080674,45824799113442,45824799146210,45824799178978,45824799211746,45824799244514,45824799277282,45824799310050,45824799342818,45824799375586,45824799408354,45824799441122,45824799473890,45824799506658,45824799539426,45824799572194,45824799604962,45824799637730,45824815399138,45824831389922,45824831422690,4582483145545
01439,55464813134207,55464813166975,55464813199743,55482461389183,55482461421951,55482461454719,55482461487487,55482461520255,55482461553023,55482489176447,55482489209215,55482489241983,55482489274751,55482489307519,55482489340287,55482515620223,55482515652991,55482515685759,55482515718527,55482526794111,55482526826879,55482526859647,55482526892415,55482526925183,55482526957951,55482539016575,55482539049343,55482539082111,55482539114879,55482539147647,55482539180415,55482573554047,55482573586815,55482573619583,55482573652351,55482573685119,55482573717887,55482589643135,55482589675903,55482589708671,55482589741439,55482589774207,55482589806975,55482603536767,55482603569535,55482603602303,55482603635071,55482603667839,55482603700607,55482623361407,55482623394175,55482623426943,55482623459711,55482623492479,55482639122815,55482639155583,55482639188351,55482639221119,55482666844543,55482671497599,55482671530367,55482671563135,55482671595903,55482671628671,55482675102079,55482675134847,55482675167615,5548267562636
7,55482675659135,55482675691903,55482677952895,55482679787903,55482684965247,55553117356415,55553117389183,55553117454719,55553117487487,55553117520255,55553117553023,55553117585791,55570017517951,55585620263295,55585620296063,55585620328831,55585620361599,55664837296511,55664857874815,55664857907583,55664857940351,55664857973119,55664858005887,55664864625023,56051529482623,56051529515391,56051529548159,56051529580927,56051529613695,56063296373119,56063296405887,56063296438655,56063296471423,56063370428799,56063370461567,56063370494335,56063370527103,56063691129215,56140121801087,56140121833855,56140121899391,56140121932159,56140121964927,56166204834175,56166204866943,56166204899711,56166204932479,56166204965247,56166204998015,56189671768447,56189671801215,56189671833983,56189672456575,56189672489343,56189672522111,56189672554879,56189672620415,56189672653183,56189672685951,56189673177471,56189673243007,56189673275775,56189673472383,56189673537919,56189673570687,56189673734527,56266456596863,56266456629631,56
reorder_badge_text":"Preorder","preorder_badge_text_color":"#FFFFFF","preorder_badge_background_color":"#000000","preorder_discounted_price_enabled":null,"payment_line_item_property_enabled":false,"shipping_line_item_property_enabled":true,"custom_line_item_property_text":null,"preorder_button_text_color":"#ffffff","preorder_button_background_color":"#565557","preorder_button_colors_enabled":true,"markets_enabled":false,"market_id":13779632354,"shopify_market_ids":[],"use_shopify_selling_plan":true,"use_simplified_shipping_text":false,"translations":{},"payment_options":[{"billing_type":"no_remaining_balance","billing_checkout_charge_type":"percentage","billing_checkout_charge_amount":null,"billing_checkout_charge_percentage":"100.0","billing_at":"2025-07-26T09:20:38.472Z","billing_after_n_intervals":7,"billing_after_interval_type":"day","pricing_type":"no_discount","pricing_amount":null,"pricing_percentage":null,"billing_title":"Full payment","billing_description":null,"discount_text":"Save {{ discount }}","
shopify_selling_plan_id":713071886719,"is_default":true,"type":"full","translations":{}}],"require_preorder_acknowledgement":false,"preorder_acknowledgement_text":"I acknowledge and agree to the preorder terms and conditions for this product.","disable_button_until_acknowledged":false,"preorder_min_quantity":null,"preorder_max_quantity":null,"countdown_timer_enabled":false,"countdown_timer_style":"text","countdown_timer_text_color":"#000000","countdown_timer_background_color":"#f5f5f5","countdown_timer_border_radius":8,"countdown_timer_format":"DHMS","countdown_timer_use_schedule_dates":true,"countdown_timer_custom_start_date":null,"countdown_timer_custom_end_date":null,"countdown_timer_starts_text":null,"countdown_timer_ends_text":null,"schedule_offer":false,"schedule_start_date":null,"schedule_end_date":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true,"mixed_cart_error_message":"Preorders must be purchased separately from regular items. Please complete your current order first, or clear
plete your current order first, or clear your cart to continue.","b2b_enabled":true,"preorder_progress_bar_enabled":false,"preorder_progress_bar_text":"{{ sold }} of {{ total }} claimed","preorder_progress_bar_fill_color":"#000000","preorder_progress_bar_background_color":"#e5e5e5","preorder_progress_bar_text_color":"#FFFFFF","preorder_progress_bar_border_radius":4,"preorder_progress_bar_show_percentage":false}],"disabled_plan_ids":[713813721471,713176482175,714631872895],"cached_at":"2026-04-09T09:16:46Z"};
if (cachedData && typeof cachedData === 'object' && cachedData.cached_at) {
// Find the maximum updated_at from all items in old array
const oldPlans = window._RestockRocketConfig.sellingPlans;
const maxUpdatedAt = Array.isArray(oldPlans) && oldPlans.length > 0
? oldPlans.reduce(function(max, plan) {
// Parse dates for proper comparison (handles mixed ISO formats)
if (plan.updated_at) {
const planDate = new Date(plan.upda
ted_at);
const maxDate = max ? new Date(max) : null;
return (!maxDate || (planDate && !isNaN(planDate) && planDate > maxDate)) ? plan.updated_at : max;
}
return max;
}, '')
: null;
// Use cached if old array is empty/has no timestamps, or cached is newer
// Parse dates for comparison to handle format differences (+00:00 vs .000Z)
const cachedDate = new Date(cachedData.cached_at);
const maxDate = maxUpdatedAt ? new Date(maxUpdatedAt) : null;
const useCached = !maxUpdatedAt || (cachedDate && !isNaN(cachedDate) && (!maxDate || cachedDate > maxDate));
if (useCached) {
if (Array.isArray(cachedData.plans)) {
window._RestockRocketConfig.sellingPlans = cachedData.plans;
// Only use disabled_plan_ids when using cached plans
window._RestockRocketConfig.disabledSellingPlanIds = cachedData.disabled_plan_ids || [];
console.debug('[RR]
e\n\u003cp\u003eHeadset\u003cbr\u003eFSA No 57E, Semi-Sealed Cartridge Bearings, 1 1\/8\" x 1 1\/2”\u003c\/p\u003e\n\u003cp\u003eSeatpost\u003cbr\u003eMarin Alloy, 30.9mm\u003c\/p\u003e\n\u003cp\u003eSaddle\u003cbr\u003eMarin DJ Saddle\u003c\/p\u003e\n\u003cp\u003ePedals\u003cbr\u003eAlloy Platform\u003c\/p\u003e\n\u003cp\u003eExtras\u003cbr\u003eMarin Chain Tension Device\u003c\/p\u003e\n\u003cp\u003eSpecifications, pricing, and availability are subject to change without notice.\u003c\/p\u003e\n\u003cul class=\"bike-intro__description-links\"\u003e\n\u003cli\u003e\u003ca href=\"https:\/\/marin-bikes-assets.s3.us-west-1.amazonaws.com\/sales-documents\/257\/high\/MARIN_OWNERS_MANUAL.pdf\" class=\"download-link\"\u003e\u003cspan aria-hidden=\"true\"\u003e\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" height=\"32\" width=\"32\" viewbox=\"0 0 32 32\"\u003e\u003cg fill=\"none\" fill-rule=\"evenodd\"\u003e\u003crect width=\"32\" height=\"32\" fill=\"#000\" rx=\"5\"\u003e\u003c\/rect\u003e\u003cg fill-rule=\"n
onzero\"\u003e\u003cpath fill=\"#FFF\" d=\"M22.194 22.281H9.812a1.431 1.431 0 000 2.862h12.381a1.431 1.431 0 000-2.862z\"\u003e\u003c\/path\u003e\u003cpath fill=\"#00A0DF\" d=\"M14.99 19.208a1.431 1.431 0 002.024 0l5.124-5.125a1.43 1.43 0 10-2.023-2.023l-2.681 2.681V8.288a1.431 1.431 0 00-2.862 0v6.453L11.89 12.06a1.43 1.43 0 10-2.023 2.023l5.124 5.125z\"\u003e\u003c\/path\u003e\u003c\/g\u003e\u003c\/g\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e","published_at":"2025-10-09T11:11:31+01:00","created_at":"2025-10-09T11:11:31+01:00","vendor":"Marin","type":"Bicycles","tags":["Alcatraz 1"],"price":84900,"price_min":84900,"price_max":84900,"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":56189674258815,"title":"Small","option1":"Small","option2":null,"option3":null,"sku":"739116001","requires_shipping":true,"taxable":true,"featured_image":null,"available":fa
0mm Width, 4º Up, 9º Back\u003c\/p\u003e\n\u003cp\u003eStem\u003cbr\u003eMarin 3D Forged Alloy, 31.8mm clamp, 40mm extension\u003c\/p\u003e\n\u003cp\u003eGrips\u003cbr\u003eMarin MTN, Closed End\u003c\/p\u003e\n\u003cp\u003eHeadset\u003cbr\u003eFSA No 57E, Semi-Sealed Cartridge Bearings, 1 1\/8\" x 1 1\/2”\u003c\/p\u003e\n\u003cp\u003eSeatpost\u003cbr\u003eMarin Alloy, 30.9mm\u003c\/p\u003e\n\u003cp\u003eSaddle\u003cbr\u003eMarin DJ Saddle\u003c\/p\u003e\n\u003cp\u003ePedals\u003cbr\u003eAlloy Platform\u003c\/p\u003e\n\u003cp\u003eExtras\u003cbr\u003eMarin Chain Tension Device\u003c\/p\u003e\n\u003cp\u003eSpecifications, pricing, and availability are subject to change without notice.\u003c\/p\u003e\n\u003cul class=\"bike-intro__description-links\"\u003e\n\u003cli\u003e\u003ca href=\"https:\/\/marin-bikes-assets.s3.us-west-1.amazonaws.com\/sales-documents\/257\/high\/MARIN_OWNERS_MANUAL.pdf\" class=\"download-link\"\u003e\u003cspan aria-hidden=\"true\"\u003e\u003csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\
" height=\"32\" width=\"32\" viewbox=\"0 0 32 32\"\u003e\u003cg fill=\"none\" fill-rule=\"evenodd\"\u003e\u003crect width=\"32\" height=\"32\" fill=\"#000\" rx=\"5\"\u003e\u003c\/rect\u003e\u003cg fill-rule=\"nonzero\"\u003e\u003cpath fill=\"#FFF\" d=\"M22.194 22.281H9.812a1.431 1.431 0 000 2.862h12.381a1.431 1.431 0 000-2.862z\"\u003e\u003c\/path\u003e\u003cpath fill=\"#00A0DF\" d=\"M14.99 19.208a1.431 1.431 0 002.024 0l5.124-5.125a1.43 1.43 0 10-2.023-2.023l-2.681 2.681V8.288a1.431 1.431 0 00-2.862 0v6.453L11.89 12.06a1.43 1.43 0 10-2.023 2.023l5.124 5.125z\"\u003e\u003c\/path\u003e\u003c\/g\u003e\u003c\/g\u003e\u003c\/svg\u003e\u003c\/span\u003e\u003c\/a\u003e\u003c\/li\u003e\n\u003c\/ul\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {56189674258815 : "deny",56189674291583 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {56189674258815 : parseInt("0"),56189674291583 : parseInt("0"),};
window._RestockRocketConfig.variantsPreorderCount = {56189674258815 : parse
-94c9-7a24-9306-bf1118ca3099/restockrocket-1-554/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 where THEME_EXTENSION_API_HOST is unset), so the
// setting.json + fetchEmbedConfig calls below route to the same host as the
// rest of the extension's API traffic instead of staying on the baked host.
window._RestockRocketConfig.host = (window._RestockRocketConfig.cachedSettings && window._RestockRocketConfig.cachedSettings.api_host) || 'https://app.restockrocket.io'
// Deployed extension build number, read from the CDN as
set host Shopify generates:
// https://cdn.shopify.com/extensions/