true,"taxable":true,"featured_image":null,"available":false,"name":"Restrap Fast Straps - Medium \/ Black","public_title":"Medium \/ Black","options":["Medium","Black"],"price":1200,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":46007576854754,"title":"Large \/ Orange","option1":"Large","option2":"Orange","option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Restrap Fast Straps - Large \/ Orange","public_title":"Large \/ Orange","options":["Large","Orange"],"price":1400,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":46007576887522,"title":"Large \/ Black","option1":"Large","option2":"Black","option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Restrap Fast Straps - Large \/ Black","public_title":"
"barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]}],
templateName: 'product',
dataKey: 'top-strip-promotion-badge',
storefrontCurrency: 'GBP',
storefrontCountry: 'GB',
storefrontLanguage: 'en',
shopLocale: 'en',
shopDomain: 'projektride.co.uk',
variantPrice: '1000',
cartPrice: '0',
selector: 'shopify-osm-ASUorQUNvQS9uckFQO__klarna_on_site_messaging_app_block_8gNReH',
topPadding: '0',
bottomPadding: '0',
});
} else {
window.appBlockPlacements.push({
productVariants: [{"id":46007576723682,"title":"Small \/ Orange","option1":"Small","option2":"Orange","option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Restrap Fast Straps - Small \/ Orange","public_title":"Small \/ Orange","options":["Small","Orange"],"price":1000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_p
/Product Details
New productsWhether it's carrying luggage anywhere on the bike, for tying items together, or even repairs - our tough Hypalon straps are designed to be versatile and hold steady./Objects strapped to bike are for scale only, we don't re
,"barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":46007576920290,"title":"Mixed \/ Orange","option1":"Mixed","option2":"Orange","option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Restrap Fast Straps - Mixed \/ Orange","public_title":"Mixed \/ Orange","options":["Mixed","Orange"],"price":1800,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":46007576953058,"title":"Mixed \/ Black","option1":"Mixed","option2":"Black","option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Restrap Fast Straps - Mixed \/ Black","public_title":"Mixed \/ Black","options":["Mixed","Black"],"price":1800,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]}],"images":["\/\/projektride.co.uk\/cdn\/shop\/file
and hold steady.\u003c\/span\u003e\u003cbr\u003e\u003cbr\u003e\u003cspan\u003eObjects strapped to bike are for scale only, we don't recommend fixing meal deals to your bike.\u003c\/span\u003e\u003cbr\u003e\u003cbr\u003e\u003cspan\u003eAvailable in three sizes, 25cm, 45cm and 65cm.\u003c\/span\u003e\u003cbr\u003e\u003cbr\u003e\u003cspan\u003eSold as pairs or a mix of all three.\u003c\/span\u003e\u003c\/p\u003e"}
SKU: 555161
[]
{
"@context": "http://schema.org/",
"@type": "Product",
"name": "Restrap Fast Straps",
"url": "https:\/\/projektride.co.uk\/products\/restrap-fast-straps","image": [
"https:\/\/projektride.co.uk\/cdn\/shop\/files\/RS_FST_SML_BLK_FastStraps_Black_Small_4f5e3246-1cac-4f99-bd4d-df8e52caa61b_1024x.jpg?v=1727442015"
],"description": "Whether it's carrying luggage anywhere on the bike, for tying items together, or even repairs - our tough Hypalon straps are designed to be versatile and hold steady.Objects strapped to bike are for scale only, we don't recommend fixing meal deals to your bike.Available in three sizes, 25cm, 45cm and 65cm.Sold as pairs or a mix of all three.","brand": {
"@type": "Thing",
"name": "Restrap"
},"gtin8": "","offers": [{
"@type" : "Offer","availability" : "http://schema.org/OutOfStock",
"price" : 10.0,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/restrap-fast-straps?variant=46007576723682"
},
{
"@type" : "Offer","availability" : "http://schema.org/OutOfStock",
"price" : 10.0,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/restrap-fast-straps?variant=46007576756450"
},
{
"@type" : "Offer","availability" : "http://schema.org/OutOfStock",
"price" : 12.0,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/restrap-fast-straps?variant=,"availability" : "http://schema.org/OutOfStock",
"price" : 18.0,
"priceCurrency" : "GBP",
"url" : "https:\/\/projektride.co.uk\/products\/restrap-fast-straps?variant=46007576953058"
}
]
}
span class="visually-hidden">Life Systems Pocket First Aid Kit - HIRE
div class="product__media-hover-img product__media" style="background-image: url(//projektride.co.uk/cdn/shop/files/Screenshot2022-02-24at21.18.32_9d81277b-124e-4fdc-8a0f-fbfb40a9343d_600x.png?v=1691610357)">
>
Life Systems Pocket First Aid Kit - HIRE
£0.00Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable
a class="product__media product__media--featured"
href="/collections/new-collection/products/kryptolok-standard-u-lock-with-4-foot-kryptoflex-cable-hire"
title="Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable"
aria-label="Hire Kryptolok Standard U-Lock & 4 foot Kryptoflex cable"
style="background-image: url(//projektride.co.uk/cdn/shop/files/Screenshot2022-03-09at20.04.46_560e2033-8232-4b
original_price_selector":"","preorder_price_format":"{{amount}} {{currency}}","show_badge_if_any_variant_is_preorder":false,"enable_console_debug":false,"inline_form_enabled":false,"inline_form_selector":null,"inline_form_selector_type":"afterend","storefront_form_prefill_customer":true,"market_setup_type":"single_market","shopify_app_id":5940125,"cache":true,"cached_at":"2025-11-11T14:27:02.333Z","multi_language_enabled":false,"translation_locale":"en"};window._RestockRocketConfig.cachedPreorderVariantIds = {"preorder_variant_ids":[42167799447778,43590980075746,43916521013474,43934694998242,43934695031010,43934695620834,43935975440610,43935975473378,43935989399778,43935989432546,43935990284514,43935994118370,43935995625698,43935995855074,43936000835810,43936003195106,43936003227874,43936008012002,43936008044770,43936022757602,43936022790370,43936022823138,43936022855906,43936056115426,43936061030626,43936064930018,43936070631650,43936078037218,43936078069986,43936088195298,43936093470946,43936101138658,43936
div class="result__image" data-aspectratio="{{ it.product.image.aspectRatio }}" data-product-image>
13282,43981362462946,43981362495714,43981362528482,43981369016546,43981369049314,43981374914786,43981374947554,43981374980322,43981392904418,43981695844578,43981695877346,43981695910114,43981695942882,43981986070754,43981987905762,43981987938530,44052906967266,44052907327714,44052907360482,44052907393250,44052907426018,44052907458786,44052907491554,44052909097186,44052909129954,44140302827746,44140302893282,44140317016290,44155590508770,44155590541538,44155594211554,44155594244322,44155594277090,44155594309858,44155594342626,44155594375394,44155594440930,44155594473698,44155594506466,44195991847138,44195991945442,44329993437410,44329993470178,44329993502946,44329993535714,44329993568482,44957136584930,44957136781538,44957136945378,45068753961186,45068753993954,45069622640866,45069622903010,45069622968546,45069750730978,45069750763746,45353010921698,45353010954466,45353010987234,45353018261730,45353018294498,45353018327266,55569712382335,55569712447871,55569712480639,55569933074815,55570550194559,5557055022732
a href="{{ it.product.url }}" class="result__image-link" aria-label='{{ it.product.title }}'>
fy_market_id":382140642,"market_locations_enabled":false};
window._RestockRocketConfig.cachedVariantShippingTextsMarketKey = "variant_shipping_texts_for_market_382140642";window._RestockRocketConfig.sellingPlans = [{"shopify_selling_plan_group_id":98590196095,"shopify_selling_plan_id":713071886719,"enabled":true,"variant_ids":[55569933140351,55569712382335,55569712415103,55569712480639,55569933173119,55570017616255,55569933074815,55570017550719,55569712447871,55569933107583,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_background_color":"#ebebeb","preorder_button_description_text_color":"#000000","preorder_button_description_border_radius":10,"preorder_button_description_show_quantity_limit":false,"preorder_button_description_quantity_limit_suffix":" units available for preorder","preorder_button_description_sh
div class="result__image-img product__media lazyload fade-in"
data-bgset="{{ it.product.image.thumb }}"
data-aspectratio="{{ it.product.image.aspectRatio }}"
data-sizes="auto">
{{@if(it.product.badgeText)}}
":true,"enableFetchHijack":true,"quantityLimitDisabled":false},"type":"hijack","css_config":null,"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":8723973243106,"title":"Restrap Fast Straps","handle":"restrap-fast-straps","description":"\u003cp\u003e\u003cmeta charset=\"utf-8\"\u003e\u003cspan\u003eWhether it's carrying luggage anywhere on the bike, for tying items together, or even repairs - our tough Hypalon straps are designed to be versatile and hold steady.\u003c\/span\u003e\u003cbr\u003e\u003cbr\u003e\u003cspan\u003eObjects strapped to bike are for scale only, we don't recommend fixing meal deals to your bike.\u003c\/span\u003e\u003cbr\u003e\u003cbr\u003e\u003cspan\u003eAvailable in three sizes, 25cm, 45cm and 65cm.\u003c\/span\u003e\u003cbr\u003e\u003cbr\u003e\u003cspan\u003eSold as pairs or a mix of all three.\u003c\/span\u003e\u003c\/p\u003e","pub
span>{{ it.product.badgeText | safe }}
,"available":false,"name":"Restrap Fast Straps - Small \/ Black","public_title":"Small \/ Black","options":["Small","Black"],"price":1000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":46007576789218,"title":"Medium \/ Orange","option1":"Medium","option2":"Orange","option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Restrap Fast Straps - Medium \/ Orange","public_title":"Medium \/ Orange","options":["Medium","Orange"],"price":1200,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]},{"id":46007576821986,"title":"Medium \/ Black","option1":"Medium","option2":"Black","option3":null,"sku":"","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Restrap Fast Straps - Medium \/ Black","public_title":"Medium \/ Black","options":["Medium"0131 374 5324>
\u003cbr\u003e\u003cbr\u003e\u003cspan\u003eObjects strapped to bike are for scale only, we don't recommend fixing meal deals to your bike.\u003c\/span\u003e\u003cbr\u003e\u003cbr\u003e\u003cspan\u003eAvailable in three sizes, 25cm, 45cm and 65cm.\u003c\/span\u003e\u003cbr\u003e\u003cbr\u003e\u003cspan\u003eSold as pairs or a mix of all three.\u003c\/span\u003e\u003c\/p\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {46007576723682 : "deny",46007576756450 : "deny",46007576789218 : "deny",46007576821986 : "deny",46007576854754 : "deny",46007576887522 : "deny",46007576920290 : "deny",46007576953058 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {46007576723682 : parseInt("0"),46007576756450 : parseInt("0"),46007576789218 : parseInt("0"),46007576821986 : parseInt("0"),46007576854754 : parseInt("0"),46007576887522 : parseInt("0"),46007576920290 : parseInt("0"),46007576953058 : parseInt("0"),};
window._RestockRocketConfig.variantsPreorderCount = {46007576723682 : pa
>
ld
// Metafield hasn't been backfilled yet - force refresh
console.debug('STOQ - multi-language enabled but no translation data in cache, fetching fresh');
return null;
}
// Translations object exists in metafield - cache is valid
// If current locale isn't translated, applyTranslations will gracefully use default locale from base fields
if (window._RestockRocketConfig.normalizedLocale &&
!Object.prototype.hasOwnProperty.call(settings.translations, window._RestockRocketConfig.normalizedLocale)) {
console.debug('STOQ - locale not explicitly translated, will use default language from cache');
}
// Don't return null - continue using cache even for untranslated locales
}
const updatedAt = new Date(settings.updated_at);
if (isNaN(updatedAt.getTime())) {
console.debug('STOQ - Invalid updated_at date format in settings');
return null;
}
const age = Date.now() - updatedALocation>
<
<<
p class="result__title">
!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 || {}));
delete settings.translations;
return settings;
}
console.debug(`STOQ - Applying translations for normalized locale: ${normalizedLocale} (original: ${window._RestockRocketConfig.locale})`);
const translatedFields = translations[normalizedLocale];
if (translatedFields && typeof translatedFields === 'object') {
Object.keys(translatedFields).forEach(function(key) {
const value = translatedFields[key82 Newington Roada href="{{ it.product.url }}">{{ it.product.title }}
e?.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('STOQ - faileEdinburgh>
indow._RestockRocketConfig.scriptUrlCollection);
} else if(window._RestockRocketConfig.pageType === 'search' && (settings.show_button_on_search || settings.preorder_search_enabled)) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else if(window._RestockRocketConfig.pageType === 'page' && (settings.show_button_on_page || settings.preorder_page_enabled)) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else if(window._RestockRocketConfig.pageType === 'product') {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlProduct);
} else if(hijackIntegration) {
createRestockRocketScript(window._RestockRocketConfig.scriptUrlCollection);
} else {
console.debug(`STOQ - no scripts enabled for ${window._RestockRocketConfig.pageType}`);
}
// Check and update cart selling plans after scripts are loaded
if (settings.preorder_enabled) {
updateCartSellingPlansEH9 1QN>
maxRetries) {
console.debug(`STOQ - API not ready, retry ${attempt}/${maxRetries}`);
setTimeout(() => attemptCartCheck(attempt + 1), retryDelay);
} else {
console.debug('STOQ - API not loaded after max retries, skipping cart selling plan check');
}
}
attemptCartCheck();
}
tarts_text":null,"countdown_timer_ends_text":null,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true}];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":null,"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":14907813593471,"title":"Trek 920 Frameset","handle":"trek-920-frameset","description":"\u003cp\u003e920 is a go-anywhere adventure touring bike. This frame set is designed to tackle any rugged terrain you'll encounter on a bikepacking expedition, and equipped with endless mounts so you can set
u003c\/strong\u003e\u003cbr\u003eHead set FSA Integrated, sealed cartridge bearing, 1-1\/8\"\u003cbr\u003eWe reserve the right to make changes to the product information contained on this site at any time without notice, including with respect to equipment, specifications, models, colours, materials and pricing. Due to supply chain issues, compatible parts may be substituted at any time without notice.\u003c\/p\u003e\n\u003cp\u003eBike and frame weights are based on pre-production painted frames at time of publication. Weights may vary in final production.\u003c\/p\u003e","published_at":"2025-01-11T10:01:39+00:00","created_at":"2025-01-11T10:01:39+00:00","vendor":"Trek","type":"Bicycles","tags":["920"],"price":115000,"price_min":115000,"price_max":115000,"available":true,"price_varies":false,"compare_at_price":null,"compare_at_price_min":0,"compare_at_price_max":0,"compare_at_price_varies":false,"variants":[{"id":54945187430783,"title":"49","option1":"49","option2":null,"option3":null,"sku":"555161","req
onfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1)
window._RestockRocketConfig.host = 'https://app.restockrocket.io'
const SETTINGS_CACHE_DURATION = 15 * 60 * 1000; // 15 minutes in milliseconds
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 translation data in metafield
// Metafield hasn't been backfilled yet - force refresh
console.debug('STOQ - multi-lan
<
!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 || {}));
delete settings.translations;
return settings;
}
console.debug(`STOQ - Applying translations for normalized locale: ${normalizedLocale} (original: ${window._RestockRocketConfig.locale})`);
const translatedFields = translations[normalizedLocale];
if (translatedFields && typeof translatedFields === 'object') {
Object.keys(translatedFields).forEach(function(key) {
const value = translatedFields[key
settings[key] = value;
}
});
} else {
console.debug('STOQ - No translated fields found for locale:', normalizedLocale);
}
delete settings.translations;
return settings;
} catch (e) {
console.debug('STOQ - error applying translations:', e);
return settings;
}
}
// 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': 'skip'
};
if (window.Shopify?.theme?.role === 'main') {
headers['X-Shopify-Theme-Schema-Name'] = window.Shopif
36124076258,43936124109026,43936124141794,43936124174562,43936129941730,43936129974498,43936130007266,43936142393570,43936142426338,43936142459106,43936152060130,43936152092898,43936152125666,43936193118434,43936250429666,43936255803618,43936266682594,43936266715362,43936293978338,43936294011106,43936316424418,43936316457186,43936320880866,43936320913634,43936320946402,43936327041250,43936327074018,43936327106786,43936331661538,43936332349666,43936333103330,43936351224034,43936353714402,43936362889442,43936362922210,43936388153570,43936389333218,43936395526370,43936398508258,43936401522914,43936408568034,43936414400738,43936700727522,43936706101474,43936706134242,43936706167010,43936706199778,43936706232546,43936706265314,43938308587746,43938308653282,43938308718818,43938308751586,43938308784354,43938308817122,43938322612450,43938322645218,43938322677986,43981336051938,43981336084706,43981336117474,43981336150242,43981345587426,43981345620194,43981345652962,43981345685730,43981357580514,43981357613282,4398136If you are returning your bike on a Sunday, please add a note to your order with your number and your ETA return date so we can arrange your drop off out of hours.
2462946,43981362495714,43981362528482,43981369016546,43981369049314,43981374914786,43981374947554,43981374980322,43981392904418,43981695844578,43981695877346,43981695910114,43981695942882,43981986070754,43981987905762,43981987938530,44052906967266,44052907327714,44052907360482,44052907393250,44052907426018,44052907458786,44052907491554,44052909097186,44052909129954,44140302827746,44140302893282,44140317016290,44155590508770,44155590541538,44155594211554,44155594244322,44155594277090,44155594309858,44155594342626,44155594375394,44155594440930,44155594473698,44155594506466,44195991847138,44195991945442,44329993437410,44329993470178,44329993502946,44329993535714,44329993568482,44957136584930,44957136781538,44957136945378,45068753961186,45068753993954,45069622640866,45069622903010,45069622968546,45069750730978,45069750763746,45353010921698,45353010954466,45353010987234,45353018261730,45353018294498,45353018327266,55569712382335,55569712447871,55569712480639,55569933074815,55570550194559,55570550227327,55604008976
767,55638316908927,55638316941695,55638316974463,56220814999935,56220815032703,56270279606655,56270279639423,56270279672191,56314171064703,56314171097471,56398983725439,56398983758207,56398983790975,56399322251647],"updated_at":"2025-12-14T01:16:10Z","market_locations_enabled":false,"market_id":382140642,"preorder_location_filter_enabled":false,"preorder_location_filter_ids":[],"collection_id":null};window._RestockRocketConfig.cachedInStockVariantIds = { in_stock_variant_ids: [] };window._RestockRocketConfig.cachedOutOfStockVariantIds = { out_of_stock_variant_ids: [] };window._RestockRocketConfig.cachedVariantPreorderLimits = {"variant_preorder_limits":{},"updated_at":"2025-12-14T01:16:09Z","shopify_market_id":382140642,"market_locations_enabled":false};
window._RestockRocketConfig.cachedVariantPreorderLimitsMarketKey = "variant_preorder_limits_for_market_382140642";window._RestockRocketConfig.cachedVariantShippingTexts = {"variant_shipping_texts":{},"updated_at":"2025-12-14T01:16:09Z","shopify_market_id"
:382140642,"market_locations_enabled":false};
window._RestockRocketConfig.cachedVariantShippingTextsMarketKey = "variant_shipping_texts_for_market_382140642";window._RestockRocketConfig.sellingPlans = [{"shopify_selling_plan_group_id":98590196095,"shopify_selling_plan_id":713071886719,"enabled":true,"variant_ids":[55569933140351,55569712382335,55569712415103,55569712480639,55569933173119,55570017616255,55569933074815,55570017550719,55569712447871,55569933107583,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_background_color":"#ebebeb","preorder_button_description_text_color":"#000000","preorder_button_description_border_radius":10,"preorder_button_description_show_quantity_limit":false,"preorder_button_description_quantity_limit_suffix":" units available for preorder","preorder_button_description_shipping_text_p
refix":"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":"stoq","preorder_badge_enabled":false,"preorder_badge_text":"Preorder","preorder_badge_text_color":"#FFFFFF","preorder_badge_background_color":"#000000","preorder_discounted_price_enabled":null,"payme
nt_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_tex
t":"I acknowledge and agree to the preorder terms and conditions for this product.","preorder_min_quantity":null,"preorder_max_quantity":null,"countdown_timer_enabled":false,"countdown_timer_insert_selector":null,"countdown_timer_insert_selector_type":"afterend","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,"updated_at":"2025-08-19T10:05:43.042Z","allow_mixed_cart":true}];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,"enabl
BatteryeFetchHijack":true,"quantityLimitDisabled":false},"type":"hijack","css_config":null,"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":7477752037602,"title":"Park Tool SK-4 - Home Mechanic Starter Kit","handle":"park-tool-sk-4-home-mechanic-starter-kit","description":"\u003cmeta charset=\"utf-8\"\u003e\n\u003cul class=\"description-overview\" data-mce-fragment=\"1\"\u003e\n\u003cli data-mce-fragment=\"1\"\u003eA perfect way to start a bicycle tool collection!\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eA great combination of tools to help a home mechanic clean, adjust, maintain, and do some basic repairs on their bike\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eThe SK-4 includes more than 15 genuine Park Tool products that can perform dozens of tasks, and includes a custom Park Tool toolbox with extra room for spare parts and more tool
s\u003c\/li\u003e\n\u003c\/ul\u003e","published_at":"2021-12-17T13:46:29+00:00","created_at":"2021-12-17T13:43:54+00:00","vendor":"Park Tool","type":"","tags":["maintenance","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled","Tools \u0026 Maintenance"],"price":17499,"price_min":17499,"price_max":17499,"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":42171003994338,"title":"Default Title","option1":"Default Title","option2":null,"option3":null,"sku":"QKSK4UOM","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Park Tool SK-4 - Home Mechanic Starter Kit","public_title":null,"options":["Default Title"],"price":17499,"weight":10000,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[]}],"images":["\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2021-12-17at13.41.4
9.png?v=1639748636"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2021-12-17at13.41.49.png?v=1639748636","options":["Title"],"media":[{"alt":null,"id":28866106753250,"position":1,"preview_image":{"aspect_ratio":1.0,"height":1178,"width":1178,"src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2021-12-17at13.41.49.png?v=1639748636"},"aspect_ratio":1.0,"height":1178,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/products\/Screenshot2021-12-17at13.41.49.png?v=1639748636","width":1178}],"requires_selling_plan":false,"selling_plan_groups":[],"content":"\u003cmeta charset=\"utf-8\"\u003e\n\u003cul class=\"description-overview\" data-mce-fragment=\"1\"\u003e\n\u003cli data-mce-fragment=\"1\"\u003eA perfect way to start a bicycle tool collection!\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u003eA great combination of tools to help a home mechanic clean, adjust, maintain, and do some basic repairs on their bike\u003c\/li\u003e\n\u003cli data-mce-fragment=\"1\"\u
003eThe SK-4 includes more than 15 genuine Park Tool products that can perform dozens of tasks, and includes a custom Park Tool toolbox with extra room for spare parts and more tools\u003c\/li\u003e\n\u003c\/ul\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {42171003994338 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {42171003994338 : parseInt("0"),};
window._RestockRocketConfig.variantsPreorderCount = {42171003994338 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {42171003994338 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {42171003994338 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {42171003994338 : null,};
window._RestockRocketConfig.variantsShippingText = {42171003994338 : "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {42171003994338 : null,};
window._RestockRocketConfig.selected_variant_id = 42171003994338;
window._Rest
ockRocketConfig.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/019b1405-52e0-7e89-a6c1-1ac7fea6dd8f/restock-rocket-shopify-410/assets/restockrocket-product.js'
window._RestockRocketConfig.scriptUrlCollection = 'https://cdn.shopify.com/extensions/019b1405-52e0-7e89-a6c1-1ac7fea6dd8f/restock-rocket-shopify-410/assets/restockrocket-collection.js'
window._RestockRocketConfig.scriptHost = window._RestockRocketConfig.scriptUrlProduct.substring(0, window._RestockRocketConfig.scriptUrlProduct.lastIndexOf('/') + 1)
window._RestockRocketConfig.host = 'https://app.restockrocket.io'
const SETTINGS_CACHE_DURATION = 15 * 60 * 1000; // 15 minutes in milliseconds
function checkSettingsExpiry(settings) {
try {
if (!settings || !settings.updated_at) {
console.debug('STOQ - Invalid set
tings 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 translation data in metafield
// Metafield hasn't been backfilled yet - force refresh
console.debug('STOQ - multi-language enabled but no translation data in cache, fetching fresh');
return null;
}
// Translations object exists in metafield - cache is valid
// If current locale isn't translated, applyTranslations will gracefully use default locale from base fields
if (window._RestockRocketConfig.normalizedLocale &&
!Object.prototype.hasOwnProperty.call(settings.translations, window._RestockRo
cketConfig.normalizedLocale)) {
console.debug('STOQ - locale not explicitly translated, will use default language from cache');
}
// Don't return null - continue using cache even for untranslated locales
}
const updatedAt = new Date(settings.updated_at);
if (isNaN(updatedAt.getTime())) {
console.debug('STOQ - Invalid updated_at date format in settings');
return null;
}
const age = Date.now() - updatedAt.getTime();
if (age