We think by now, most of you get what Straggler is. It's a Cross Check with disc brakes instead of rim brakes. We also think you get why that's good. The Cross Check is a madly versatile bike that can be used for most types of riding and riding surfaces. It can be set up as a hauler or a mauler and so can Straggler. Better still is that you now have the option of 650b wheel size. 650b wheels were popular for a long time many years ago on 'Constructeur' style bicycles and we all know how real shit was back in the day.... 650b wheels strike a nice balance between the benefits of both 26" and 700c sizes. The smaller wheel allows smaller riders to fit well on smaller frames, produces a stronger wheel, makes fitting big ass tyres easier and are more agile than their larger counterparts.Global Versatility
Straggler has disc caliper mounts instead of rim brake studs. It'll accept rotors up to 160mm. The rear dropouts are unique, too. They're a partially closed horizontal design that accommodates singlespeed or geared drivetrains. They feature stop screws that thread in from the rear to further secure the wheel and to position the rear wheel for optimal shifting, plus a forward-mounted stop screw on the drive side to keep the wheel from slipping forward under the force of your gargantuan legs. The rear dropouts are spaced 135mm instead of 132.5mm like the Cross-Check simply because there are far more options for disc hubs in this spacing.
Long rides, short rides, trips to the shop and continental tours. The Tour De Fer 20 has been a dependable do-it-all model for many years.
Straggler shares all of the Cross-Check's braze-ons for fenders, racks and bottle cages. The Straggler's geometry is slightly different, with angles and tube lengths very close but not identical to the Cross-Check, but like the Cross-Check it's ready to take you just about anywhere. It's a day tripper and a weekender. It's a 'rough road' road bike. It's a cyclocross bike with no pretense about racing. It's a utilitarian townie. It's a light-duty touring bike. It's an all-weather commuter. And when you get tyred of one set up, you can swap parts around and turn it into something else.
Subtle frame updates bring simplified maintenance, improved braking and an even more comfortable riding position.
Frameset Specification
Modern componentry, internal dynamo cable routing and faster, more comfortable tyres make the Tour De Fer a pleasure to ride.
Tubing:
100% Surly proprietary 4130 CroMoly tubing. ED Coated. TIG-welded. Double-butted main triangle
Rear Dropouts:
Forward-exiting horizontal dropouts with adjusters give you singlespeed compatibility and wheelbase adjustability to help you fit the tyres and fenders you want to run with that drivetrain you want to run. 135mm spacing
Brake Compatibility:Lightweight DrivetrainDisc Only. Max 160 mm Rotor Size
Moving to a double drivetrain saves considerable weight over it's triple predecessor. A Shimano Claris 2 x 8-speed drivetrain coupled with an Acera rear derailleur maintains a wide range of ratios.
Braze-ons/extras: Fender eyelets at the dropouts, front and rear rack bosses and dual water bottle mounts. Oh yeah, it sports downtube shifter mounts
Seatpost diameter:
27.2mm
LowriderSeatpost clamp diameter:
30.0mm (we include our Surly stainless clamp with our framesets)A traditional AtranVelo Explorer front pannier rack keeps luggage as low as possible to maintain the Tour De Fer's sublime handling when fully loaded.
Headset/Steertube:
1-1/8" threadless
Front Derailleur Clamp Diameter:Accessorised28.6 mm
Fitted mudguards, front and rear luggage racks, dynamo cable routing and comfortable Vittoria Randonneur 40mm tyres complete the tour-ready specification. The Tour De Fer even comes with spare spokes.
Bottom bracket shell:
68mm wide, standard English threaded 1.37 x 24t
Chainring Clearance:
Precious MetalManipulated so you can fit pretty much whatever size rings you want. Go nuts
Our Mjolnir Chromoly tubeset is crafted to deliver a sublime ride feel with excellent comfort whilst also being immensely durable.Tyre Clearance:
Our Fatties Fit Fine (FFF) stays and our beautiful slope-crowned custom fork provide room for tyres up to 650b x 42mm! With fenders!
Fork:
4130 CroMoly, disc only, lugged and brazed. Sloping crown with threaded eylets, tapered and butted curved blades with mid-blade rack eyelets, dual dropout eyelets
"A truly excellent commuter capable of tackling all sorts of terrain, as well as that trip of a lifetime."
Read Now
SURLY BIKES
[]
BUILT TO LAST
{"@context":"http:\/\/schema.org\/","@id":"\/products\/genesis-tour-de-fer-21#product","@type":"ProductGroup","brand":{"@type":"Brand","name":"Genesis"},"category":"Bicycles","description":"\n\n\n\n\nGlobal Versatility\n\nLong rides, short rides, trips to the shop and continental tours. The Tour De Fer 20 has been a dependable do-it-all model for many years.\nSubtle frame updates bring simplified maintenance, improved braking and an even more comfortable riding position.\nModern componentry, internal dynamo cable routing and faster, more comfortable tyres make the Tour De Fer a pleasure to ride.\n\n\n\n\n\n\n\n\n\n\n\nLightweight Drivetrain\n\nMoving to a double drivetrain saves considerable weight over it's triple predecessor. A Shimano Claris 2 x 8-speed drivetrain coupled with an Acera rear derailleur maintains a wide range of ratios.\n\n\n\n\n\n\nLowrider\n\nA traditional AtranVelo Explorer front pannier rack keeps luggage as low as possible to maintain the Tour De Fer's sublime handling when fully loaded.\n\n\n\n\n\n\nAccessorised\n\nFitted mudguards, front and rear luggage racks, dynamo cable routing and comfortable Vittoria Randonneur 40mm tyres complete the tour-ready specification. The Tour De Fer even comes with spare spokes.\n\n\n\n\n\n\nPrecious Metal\n\nOur Mjolnir Chromoly tubeset is crafted to deliver a sublime ride feel with excellent comfort whilst also being immensely durable.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nTour de Fer 20: CyclingPlus’ Commuter Test Winner\n\nTour de Fer 20: Cyc
lingPlus’ Commuter Test Winner\nThe Genesis Tour de Fer 20 has once again triumphed in CyclingPlus's commuter group test, securing its place as the ultimate bike for urban adventures and beyond. Praised for its wide gear range, outstanding comfort, and versatility, it’s the perfect choice for both daily commutes and weekend explorations.\n\"A truly excellent commuter capable of tackling all sorts of terrain, as well as that trip of a lifetime.\"\nCyclingPlus\n\n\nRead Now\n\n\n\n\n\n\n\n\n\n","hasVariant":[{"@id":"\/products\/genesis-tour-de-fer-21?variant=45817776111842#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_01.jpg?v=1723720467\u0026width=1920","name":"Genesis Tour De Fer 20 - Extra Small","offers":{"@id":"\/products\/genesis-tour-de-fer-21?variant=45817776111842#offer","@type":"Offer","availability":"http:\/\/schema.org\/OutOfStock","price":"1500.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/genesis-tour-de-fer-21?varia
nt=45817776111842"},"sku":"GN13010XS"},{"@id":"\/products\/genesis-tour-de-fer-21?variant=45817776144610#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_01.jpg?v=1723720467\u0026width=1920","name":"Genesis Tour De Fer 20 - Small","offers":{"@id":"\/products\/genesis-tour-de-fer-21?variant=45817776144610#offer","@type":"Offer","availability":"http:\/\/schema.org\/InStock","price":"1500.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/genesis-tour-de-fer-21?variant=45817776144610"},"sku":"GN13010SM"},{"@id":"\/products\/genesis-tour-de-fer-21?variant=45817776177378#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_01.jpg?v=1723720467\u0026width=1920","name":"Genesis Tour De Fer 20 - Medium","offers":{"@id":"\/products\/genesis-tour-de-fer-21?variant=45817776177378#offer","@type":"Offer","availability":"http:\/\/schema.org\/InStock","price":"1500.00","priceCurrency":"GBP","url":"https:\/\/proj
ektride.co.uk\/products\/genesis-tour-de-fer-21?variant=45817776177378"},"sku":"GN13010MD"},{"@id":"\/products\/genesis-tour-de-fer-21?variant=45817776210146#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_01.jpg?v=1723720467\u0026width=1920","name":"Genesis Tour De Fer 20 - Large","offers":{"@id":"\/products\/genesis-tour-de-fer-21?variant=45817776210146#offer","@type":"Offer","availability":"http:\/\/schema.org\/InStock","price":"1500.00","priceCurrency":"GBP","url":"https:\/\/projektride.co.uk\/products\/genesis-tour-de-fer-21?variant=45817776210146"},"sku":"GN13010LG"},{"@id":"\/products\/genesis-tour-de-fer-21?variant=45817776242914#variant","@type":"Product","image":"https:\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_01.jpg?v=1723720467\u0026width=1920","name":"Genesis Tour De Fer 20 - Extra Large","offers":{"@id":"\/products\/genesis-tour-de-fer-21?variant=45817776242914#offer","@type":"Offer","availability":"http:\/\/schema.org\/OutOfStock",
Close
window._RestockRocketConfig = window._RestockRocketConfig || {}
// Helper function to normalize locale format from hyphen to underscore (e.g., 'en-US' -> 'en_us')
// This matches the backend's Mobility.normalize_locale behavior
// Returns empty string if locale is empty or invalid (matches original behavior)
function normalizeLocale(locale) {
if (!locale || locale.trim() === '') {
return '';
}
return locale.toString().toLowerCase().replace(/-/g, '_');
}
window._RestockRocketConfig.locale = 'en';
window._RestockRocketConfig.normalizedLocale = normalizeLocale('en');
window._RestockRocketConfig.shop = 'projektride.myshopify.com';
window._RestockRocketConfig.pageType = 'product';
window._RestockRocketConfig.liquidRenderedAt = 1776419817;window._RestockRocketConfig.marketId = 382140642;window._RestockRocketConfig.countryName = 'United Kingdom';
window._RestockRocketConfig.countryIsoCode = 'GB';window._RestockRocketConfig.cartInventoryQuantity = {};window._RestockRocketConfig.cachedSettings = {"id":38500,"shop_id":38436,"currency":"GBP","created_at":"2025-07-26T09:13:57.337Z","updated_at":"2025-12-28T14:44:23.508Z","enable_app":true,"enable_signup_widget":false,"storefront_button_text":"Notify me when available","storefront_button_text_color":"#FFFFFF","storefront_button_background_color":"#202223","storefront_form_header":"Notify me","storefront_form_description":"Get a notification as soon as this product is back in stock by signing up below!","storefront_form_button_text":"Notify me when available","storefront_form_button_text_color":"#FFFFFF","storefront_form_button_background_color":"#202223","storefront_form_terms":"Promise we won't spam. You'll only receive notifications for this product.","storefront_form_error":"Please enter a valid email address","storefront_form_success":"Thank you! We will notify you when the product is available.","enable_powered_by":true,"show_button_on_preorder":true,"sms_enabled":false,"email_enabled":true,"storefront_button_disable_tag":"rocket-hide","theme_config":{"disableDebugLoggingForNonPreorderItem":false},"storefront_form_email_placeholder":"Email address","storefront_form_phone_placeholder":"SMS","storefront_form_phone_label":"Phone number","storefront_form_email_label":"Email","storefront_form_phone_error":"Please enter a valid phone number","storefront_form_customer_name_placeholder":"Name","storefront_form_customer_name_error":"Please enter your name","storefront_form_did_you_mean_error":"Did you mean %{suggested_email}? Or use %{current_email}","form_customer_name_enabled":false,"form_customer_name_required":false,"css_config":"","js_config":null,"collect_promotion_consent":false,"storefront_form_promotion_consent_label":"Notify me about other news, sales, discounts & offers too","show_button_on_collection":false,"sms_default_country":"us","sms_allowed_countries":[],"sms_restrict_country":false,"sms_default_channel":true,"optin_required":false,"optin_success_text":"Registration confirmed! You'll receive an alert when the product is restocked.","storefront_button_border_radius":0,"storefront_button_disable_tag_hides_button":true,"storefront_button_disable_tag_enabled":false,"quantity_required":false,"storefront_form_quantity_label":"Quantity","enable_alerts":true,"sms_allowed":false,"email_allowed":true,"collect_promotion_consent_default":true,"insert_button_after_selector":null,"insert_button_after_selector_type":"afterend","storefront_button_position_type":"float-right","storefront_form_duplicate_error":"You've already subscribed for alerts to this product.","storefront_mixed_cart_error":"This item needs to be purchased separately. Please check out or clear your cart before adding this item.","storefront_error_heading":"Error","default_locale":"en","collection_page_button_text_color":"#FFFFFF","collection_page_button_background_color":"#202223","show_button_if_any_out_of_stock":false,"show_button_if_any_variant_out_of_stock_collection":false,"show_button_on_index":false,"insert_button_after_selector_collection":null,"insert_button_after_selector_index":null,"push_enabled":false,"push_allowed":false,"storefront_form_push_label":"Push","storefront_form_push_description":"Click 'Allow' to be notified via push notification","storefront_form_push_error":"Permission rejected! Please review notification settings and try again","storefront_font_family":"OpenSans","insert_button_after_selector_collection_type":"afterend","show_channel_selector":false,"storefront_form_empty_error":"Please fill in one or more of the options above","storefront_form_push_input":"Send notification to your browser","insert_button_after_selector_page":null,"show_button_on_page":false,"insert_button_after_selector_search":null,"show_button_on_search":false,"app_proxy_path_prefix":"/apps/restockrocket-production","collection_link_selector":"","index_link_selector":"","page_link_selector":"","search_link_selector":"","collection_check_link_visibility":true,"collection_buttons_container":null,"index_buttons_container":null,"page_buttons_container":null,"search_buttons_container":null,"extension_enable_url_variant_detection":true,"extension_enable_value_variant_detection":true,"extension_value_variant_selector":"[name='id']","resubscribe_text":"This product is out of stock. Get notified when it's restocked again by entering your details below!","preorder_enabled":true,"preorder_buy_button_selector":null,"preorder_add_to_cart_button_selector":"","preorder_badge_selector":"","preorder_button_out_of_stock_text":"Out of stock","preorder_button_add_to_cart_text":"Add to cart","preorder_form_selector":"form[action*=\"/cart/add\"]","preorder_collection_enabled":false,"preorder_collection_form_selector":"form[action*=\"/cart/add\"]","preorder_collection_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_index_enabled":false,"preorder_index_form_selector":"form[action*=\"/cart/add\"]","preorder_index_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_page_enabled":false,"preorder_page_form_selector":"form[action*=\"/cart/add\"]","preorder_page_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_search_enabled":false,"preorder_search_form_selector":"form[action*=\"/cart/add\"]","preorder_search_add_to_cart_button_selector":"form[action*=\"/cart/add\"] button","preorder_collection_badge_selector":null,"preorder_index_badge_selector":null,"preorder_page_badge_selector":null,"preorder_search_badge_selector":null,"preorder_badge_selector_type":"afterend","preorder_collection_badge_selector_type":"afterend","preorder_button_child_selector":"span","preorder_button_disclaimer_insert_selector":"","preorder_button_disclaimer_insert_selector_type":"afterend","preorder_payment_insert_selector":"","preorder_payment_insert_selector_type":"afterend","preorder_price_container_selector":"","preorder_price_container_selector_insert_type":"afterend","preorder_terms_insert_selector":"","preorder_terms_insert_selector_type":"afterend","preorder_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,"storefront_form_show_image":false,"storefront_form_text_color":"#202223","storefront_form_background_color":"#FFFFFF","storefront_form_border_radius":0,"market_setup_type":"single_market","shopify_app_id":5940125,"preorder_progress_bar_insert_selector":null,"preorder_progress_bar_insert_selector_type":"beforebegin","countdown_timer_insert_selector":null,"countdown_timer_insert_selector_type":"afterend","cache":true,"cached_at":"2026-01-08T16:12:13.364Z","multi_language_enabled":false,"translation_locale":"en"};window._RestockRocketConfig.cachedPreorderVariantIds = {"preorder_variant_ids":[42167799447778,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,43936107266274,43936124076258,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,43981362462946,43981362495714,43981362528482,43981369016546,43981369049314,43981374914786,43981374947554,43981374980322,43981392806114,43981392838882,43981392904418,43981392937186,43981695844578,43981695877346,43981695910114,43981695942882,43981986070754,43981987905762,43981987938530,44052906967266,44052907327714,44052907360482,44052907393250,44052907426018,44052907458786,44052907491554,44052909097186,44052909129954,44140279791842,44140279824610,44140279857378,44140279890146,44140279922914,44140292047074,44140292079842,44140292112610,44140293685474,44140302336226,44140302434530,44140302500066,44140302532834,44140302565602,44140302598370,44140302631138,44140302827746,44140302893282,44140302926050,44140315050210,44140317016290,44140321636578,44140335792354,44140335825122,44140335857890,44140339953890,44140339986658,44140340150498,44140340248802,44140340281570,44140340543714,44140340707554,44140340740322,44140340773090,44140345065698,44140352438498,44140388155618,44140388188386,44140397756642,44140404441314,44140404474082,44155590508770,44155590574306,44155594211554,44155594244322,44155594277090,44155594309858,44155594342626,44155594375394,44155594408162,44155594440930,44155594473698,44155594506466,44195991847138,44195991945442,44329993437410,44329993470178,44329993502946,44329993535714,44329993568482,44957136584930,44957136716002,44957136748770,44957136781538,44957136847074,44957136912610,44957136945378,45068753961186,45068753993954,45069622640866,45069622903010,45069622968546,45069750730978,45069750763746,45353010921698,45353010954466,45353010987234,45353018261730,45353018294498,45353018327266,46016406487266,55193312788863,55193316786559,55569712382335,55569712415103,55569712447871,55569712480639,55570017616255,55570550194559,55570550227327,55604008976767,55638316908927,55638316941695,55638316974463,56220814967167,56220814999935,56220815032703,56270279606655,56270279639423,56270279672191,56314171064703,56314171097471,56398983725439,56398983758207,56398983790975,56399322251647,56565020721535,56565020754303,56565020787071],"updated_at":"2026-04-17T09:55:53Z","market_locations_enabled":false,"market_id":382140642,"preorder_location_filter_enabled":false,"preorder_location_filter_ids":[],"collection_id":null,"bulk_operation":true};window._RestockRocketConfig.cachedInStockVariantIds = { in_stock_variant_ids: [] };window._RestockRocketConfig.cachedOutOfStockVariantIds = { out_of_stock_variant_ids: [] };window._RestockRocketConfig.cachedVariantPreorderLimits = {"variant_preorder_limits":{},"updated_at":"2026-04-17T09:48:44Z","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":"2026-04-17T09:28:45Z","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":[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_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_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":"stoq","preorder_badge_enabled":false,"preorder_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 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_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_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":"stoq","preorder_badge_enabled":false,"preorder_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 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.updated_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] 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":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":8677453529314,"title":"Genesis Tour De Fer 20","handle":"genesis-tour-de-fer-21","description":"\u003cdiv data-element=\"main\" data-appearance=\"contained\" data-content-type=\"row\"\u003e\n\u003cdiv data-pb-style=\"EYOYV8V\" data-element=\"inner\" data-video-fallback-src=\"\" data-video-lazy-load=\"true\" data-video-play-only-visible=\"true\" data-video-loop=\"true\" data-background-type=\"image\" data-background-images=\"{}\" data-parallax-speed=\"0.5\" data-enable-parallax=\"0\" class=\"col-pr-4\"\u003e\n\u003cdiv data-pb-style=\"VJMS909\" data-element=\"main\" data-grid-size=\"12\" data-appearance=\"default\" data-content-type=\"column-group\" data-background-images=\"{}\" class=\"pagebuilder-column-group\"\u003e\n\u003cdiv data-pb-style=\"V4AT17N\" data-element=\"main\" data-content-type=\"column-line\" class=\"pagebuilder-column-line\"\u003e\n\u003cdiv data-pb-style=\"X3A3UB3\" data-element=\"main\" data-background-images=\"{}\" data-appearance=\"full-height\" data-content-type=\"column\" class=\"pagebuilder-column\"\u003e\n\u003ch2 data-element=\"main\" data-appearance=\"default\" data-content-type=\"heading\"\u003eGlobal Versatility\u003c\/h2\u003e\n\u003cdiv data-element=\"main\" data-appearance=\"default\" data-content-type=\"text\"\u003e\n\u003cp\u003e\u003cspan\u003eLong rides, short rides, trips to the shop and continental tours. The Tour De Fer 20 has been a dependable do-it-all model for many years.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cspan\u003eSubtle frame updates bring simplified maintenance, improved braking and an even more comfortable riding position.\u003c\/span\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cspan\u003eModern componentry, internal dynamo cable routing and faster, more comfortable tyres make the Tour De Fer a pleasure to ride.\u003c\/span\u003e\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv\u003e\n\u003csection aria-label=\"Gallery\" dir=\"ltr\" class=\"carousel\" tabindex=\"0\"\u003e\n\u003cdiv class=\"carousel__viewport\"\u003e\n\u003col class=\"carousel__track\"\u003e\n\u003cli aria-hidden=\"true\" class=\"carousel__slide carousel__slide--clone\"\u003e\n\u003cdiv data-content-type=\"slide\" class=\"carousel__item pagebuilder-column\"\u003e\n\u003cfigure data-pb-style=\"H6W1KJ4\" data-element=\"main\" data-appearance=\"full-width\" data-content-type=\"image\" class=\"pagebuilder-image\"\u003e\u003cpicture\u003e\u003csource data-element=\"lazy_mobile_image\" srcset=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-a.jpg\" media=\"(max-width: 768px)\"\u003e\u003cimg data-element=\"lazy_image\" src=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-a.jpg\" title=\"\" alt=\"\"\u003e\u003c\/picture\u003e\u003c\/figure\u003e\n\u003ch3 data-pb-style=\"YG0Y13S\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"heading\" class=\"text-xl font-medium\"\u003eLightweight Drivetrain\u003c\/h3\u003e\n\u003cdiv data-pb-style=\"M7QOT0R\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"text\" class=\"h-40\"\u003e\n\u003cp id=\"NM8TUA9\"\u003eMoving to a double drivetrain saves considerable weight over it's triple predecessor. A Shimano Claris 2 x 8-speed drivetrain coupled with an Acera rear derailleur maintains a wide range of ratios.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli aria-hidden=\"true\" class=\"carousel__slide carousel__slide--clone\"\u003e\n\u003cdiv data-content-type=\"slide\" class=\"carousel__item pagebuilder-column\"\u003e\n\u003cfigure data-pb-style=\"XGGFJY4\" data-element=\"main\" data-appearance=\"full-width\" data-content-type=\"image\" class=\"pagebuilder-image\"\u003e\u003cpicture\u003e\u003csource data-element=\"lazy_mobile_image\" srcset=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-b.jpg\" media=\"(max-width: 768px)\"\u003e\u003cimg data-element=\"lazy_image\" src=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-b.jpg\" title=\"\" alt=\"\"\u003e\u003c\/picture\u003e\u003c\/figure\u003e\n\u003ch3 data-pb-style=\"H85QIP3\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"heading\" class=\"text-xl font-medium\"\u003eLowrider\u003c\/h3\u003e\n\u003cdiv data-pb-style=\"MBLSBN1\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"text\" class=\"h-40\"\u003e\n\u003cp id=\"NM8TUA9\"\u003eA traditional AtranVelo Explorer front pannier rack keeps luggage as low as possible to maintain the Tour De Fer's sublime handling when fully loaded.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli aria-hidden=\"true\" class=\"carousel__slide carousel__slide--clone\"\u003e\n\u003cdiv data-content-type=\"slide\" class=\"carousel__item pagebuilder-column\"\u003e\n\u003cfigure data-pb-style=\"TP6IV7K\" data-element=\"main\" data-appearance=\"full-width\" data-content-type=\"image\" class=\"pagebuilder-image\"\u003e\u003cpicture\u003e\u003csource data-element=\"lazy_mobile_image\" srcset=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-c.jpg\" media=\"(max-width: 768px)\"\u003e\u003cimg data-element=\"lazy_image\" src=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-c.jpg\" title=\"\" alt=\"\"\u003e\u003c\/picture\u003e\u003c\/figure\u003e\n\u003ch3 data-pb-style=\"AW7XFP6\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"heading\" class=\"text-xl font-medium\"\u003eAccessorised\u003c\/h3\u003e\n\u003cdiv data-pb-style=\"SFYMXJ3\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"text\" class=\"h-40\"\u003e\n\u003cp id=\"NM8TUA9\"\u003eFitted mudguards, front and rear luggage racks, dynamo cable routing and comfortable Vittoria Randonneur 40mm tyres complete the tour-ready specification. The Tour De Fer even comes with spare spokes.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli aria-hidden=\"true\" class=\"carousel__slide carousel__slide--clone carousel__slide--prev\"\u003e\n\u003cdiv data-content-type=\"slide\" class=\"carousel__item pagebuilder-column\"\u003e\n\u003cfigure data-pb-style=\"RI2SDBD\" data-element=\"main\" data-appearance=\"full-width\" data-content-type=\"image\" class=\"pagebuilder-image\"\u003e\u003cpicture\u003e\u003csource data-element=\"lazy_mobile_image\" srcset=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-d.jpg\" media=\"(max-width: 768px)\"\u003e\u003cimg data-element=\"lazy_image\" src=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-d.jpg\" title=\"\" alt=\"\"\u003e\u003c\/picture\u003e\u003c\/figure\u003e\n\u003ch3 data-pb-style=\"SKWN82T\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"heading\" class=\"text-xl font-medium\"\u003ePrecious Metal\u003c\/h3\u003e\n\u003cdiv data-pb-style=\"NPWAE7G\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"text\" class=\"h-40\"\u003e\n\u003cp id=\"NM8TUA9\"\u003eOur Mjolnir Chromoly tubeset is crafted to deliver a sublime ride feel with excellent comfort whilst also being immensely durable.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli aria-hidden=\"false\" class=\"carousel__slide carousel__slide--visible carousel__slide--active\"\u003e\n\u003cdiv data-content-type=\"slide\" class=\"carousel__item pagebuilder-column\"\u003e\u003c\/div\u003e\n\u003c\/li\u003e\n\u003c\/ol\u003e\n\u003c\/div\u003e\n\u003cdiv aria-atomic=\"true\" aria-live=\"polite\" class=\"carousel__liveregion carousel__sr-only\"\u003e\u003cpicture\u003e\u003csource data-element=\"lazy_mobile_image\" srcset=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-a.jpg\" media=\"(max-width: 768px)\"\u003e\u003c\/picture\u003e\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv data-element=\"main\" data-appearance=\"contained\" data-content-type=\"row\"\u003e\n\u003cdiv data-pb-style=\"UCJQB9T\" data-element=\"inner\" data-video-fallback-src=\"\" data-video-lazy-load=\"true\" data-video-play-only-visible=\"true\" data-video-loop=\"true\" data-background-type=\"image\" data-background-images=\"{}\" data-parallax-speed=\"0.5\" data-enable-parallax=\"0\"\u003e\n\u003cdiv data-pb-style=\"UA3GF04\" data-element=\"main\" data-grid-size=\"12\" data-appearance=\"default\" data-content-type=\"column-group\" data-background-images=\"{}\" class=\"pagebuilder-column-group\"\u003e\n\u003cdiv data-pb-style=\"VDK6QJO\" data-element=\"main\" data-content-type=\"column-line\" class=\"pagebuilder-column-line\"\u003e\n\u003cdiv data-pb-style=\"BY2ESFK\" data-element=\"main\" data-background-images=\"{}\" data-appearance=\"full-height\" data-content-type=\"column\" class=\"pagebuilder-column\"\u003e\n\u003ch2 data-pb-style=\"A97HX4X\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"heading\"\u003eTour de Fer 20: CyclingPlus’ Commuter Test Winner\u003c\/h2\u003e\n\u003cdiv data-element=\"main\" data-appearance=\"default\" data-content-type=\"text\"\u003e\n\u003cp\u003eTour de Fer 20: CyclingPlus’ Commuter Test Winner\u003c\/p\u003e\n\u003cp\u003eThe Genesis Tour de Fer 20 has once again triumphed in CyclingPlus's commuter group test, securing its place as the ultimate bike for urban adventures and beyond. Praised for its wide gear range, outstanding comfort, and versatility, it’s the perfect choice for both daily commutes and weekend explorations.\u003c\/p\u003e\n\u003cp\u003e\u003cem\u003e\"A truly excellent commuter capable of tackling all sorts of terrain, as well as that trip of a lifetime.\"\u003c\/em\u003e\u003c\/p\u003e\n\u003cp\u003eCyclingPlus\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv data-pb-style=\"RNRLO9E\" data-element=\"main\" data-same-width=\"false\" data-appearance=\"inline\" data-content-type=\"buttons\"\u003e\n\u003cdiv data-pb-style=\"KVMP5YB\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"button-item\"\u003e\u003ca data-pb-style=\"AQUE03H\" data-element=\"link\" data-link-type=\"default\" href=\"https:\/\/www.genesisbikes.co.uk\/stories\/tour-de-fer-20-cyclingplus-commuter-test-winner\" class=\"pagebuilder-button-primary\" target=\"\"\u003e\u003cspan data-element=\"link_text\"\u003eRead Now\u003c\/span\u003e\u003c\/a\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv data-pb-style=\"XYRRYUO\" data-element=\"main\" data-background-images=\"{}\" data-appearance=\"full-height\" data-content-type=\"column\" class=\"pagebuilder-column\"\u003e\n\u003cfigure data-pb-style=\"SHJ4OYA\" data-element=\"main\" data-appearance=\"full-width\" data-content-type=\"image\" class=\"pagebuilder-image\"\u003e\u003cpicture\u003e\u003csource data-element=\"lazy_mobile_image\" srcset=\"https:\/\/www.freewheel.co.uk\/media\/wysiwyg\/TDF20_4STAR_4mb_5.jpg\" media=\"(max-width: 768px)\"\u003e\u003cimg data-element=\"lazy_image\" src=\"https:\/\/www.freewheel.co.uk\/media\/wysiwyg\/TDF20_4STAR_4mb_5.jpg\" title=\"\" alt=\"\"\u003e\u003c\/picture\u003e\u003c\/figure\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!----\u003e","published_at":"2024-08-15T12:14:07+01:00","created_at":"2024-08-15T12:14:27+01:00","vendor":"Genesis","type":"Bicycles","tags":["bicycle","bike","spo-cs-disabled","spo-default","spo-disabled","spo-notify-me-disabled","Tour De Fer"],"price":150000,"price_min":150000,"price_max":150000,"available":true,"price_varies":false,"compare_at_price":149900,"compare_at_price_min":149900,"compare_at_price_max":149900,"compare_at_price_varies":false,"variants":[{"id":45817776111842,"title":"Extra Small","option1":"Extra Small","option2":null,"option3":null,"sku":"GN13010XS","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Genesis Tour De Fer 20 - Extra Small","public_title":"Extra Small","options":["Extra Small"],"price":150000,"weight":0,"compare_at_price":149900,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":45817776144610,"title":"Small","option1":"Small","option2":null,"option3":null,"sku":"GN13010SM","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Genesis Tour De Fer 20 - Small","public_title":"Small","options":["Small"],"price":150000,"weight":0,"compare_at_price":149900,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":45817776177378,"title":"Medium","option1":"Medium","option2":null,"option3":null,"sku":"GN13010MD","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Genesis Tour De Fer 20 - Medium","public_title":"Medium","options":["Medium"],"price":150000,"weight":0,"compare_at_price":149900,"inventory_management":"shopify","barcode":null,"requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":45817776210146,"title":"Large","option1":"Large","option2":null,"option3":null,"sku":"GN13010LG","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Genesis Tour De Fer 20 - Large","public_title":"Large","options":["Large"],"price":150000,"weight":0,"compare_at_price":149900,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":45817776242914,"title":"Extra Large","option1":"Extra Large","option2":null,"option3":null,"sku":"GN13010XL","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Genesis Tour De Fer 20 - Extra Large","public_title":"Extra Large","options":["Extra Large"],"price":150000,"weight":0,"compare_at_price":149900,"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\/gn13010_detail_01.jpg?v=1723720467","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_02.jpg?v=1723720467","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_03.jpg?v=1723720467","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_04.jpg?v=1723720467","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_05.jpg?v=1723720467","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_06.jpg?v=1723720467","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_07.jpg?v=1723720467","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_08.jpg?v=1723720467","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_09.jpg?v=1723720467","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_10.jpg?v=1723720467","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_11.jpg?v=1723720467","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_12.jpg?v=1723720468","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_13.jpg?v=1723720468","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_14.jpg?v=1723720468","\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_15.jpg?v=1723720468"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_01.jpg?v=1723720467","options":["Size"],"media":[{"alt":null,"id":34464631619810,"position":1,"preview_image":{"aspect_ratio":1.0,"height":1800,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_01.jpg?v=1723720467"},"aspect_ratio":1.0,"height":1800,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_01.jpg?v=1723720467","width":1800},{"alt":null,"id":34464631652578,"position":2,"preview_image":{"aspect_ratio":1.0,"height":1800,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_02.jpg?v=1723720467"},"aspect_ratio":1.0,"height":1800,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_02.jpg?v=1723720467","width":1800},{"alt":null,"id":34464631685346,"position":3,"preview_image":{"aspect_ratio":1.0,"height":1800,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_03.jpg?v=1723720467"},"aspect_ratio":1.0,"height":1800,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_03.jpg?v=1723720467","width":1800},{"alt":null,"id":34464631718114,"position":4,"preview_image":{"aspect_ratio":1.503,"height":1198,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_04.jpg?v=1723720467"},"aspect_ratio":1.503,"height":1198,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_04.jpg?v=1723720467","width":1800},{"alt":null,"id":34464631750882,"position":5,"preview_image":{"aspect_ratio":1.503,"height":1198,"width":1800,"
src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_05.jpg?v=1723720467"},"aspect_ratio":1.503,"height":1198,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_05.jpg?v=1723720467","width":1800},{"alt":null,"id":34464631783650,"position":6,"preview_image":{"aspect_ratio":1.0,"height":1800,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_06.jpg?v=1723720467"},"aspect_ratio":1.0,"height":1800,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_06.jpg?v=1723720467","width":1800},{"alt":null,"id":34464631816418,"position":7,"preview_image":{"aspect_ratio":1.503,"height":1198,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_07.jpg?v=1723720467"},"aspect_ratio":1.503,"height":1198,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_07.jpg?v=1723720467","width":1800},{"alt":null,"id":34464631849186,"position":8,"preview_image":{"aspect_ratio":1.0,"height":18
00,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_08.jpg?v=1723720467"},"aspect_ratio":1.0,"height":1800,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_08.jpg?v=1723720467","width":1800},{"alt":null,"id":34464631881954,"position":9,"preview_image":{"aspect_ratio":1.503,"height":1198,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_09.jpg?v=1723720467"},"aspect_ratio":1.503,"height":1198,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_09.jpg?v=1723720467","width":1800},{"alt":null,"id":34464631914722,"position":10,"preview_image":{"aspect_ratio":1.0,"height":1800,"width":1800,"src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_10.jpg?v=1723720467"},"aspect_ratio":1.0,"height":1800,"media_type":"image","src":"\/\/projektride.co.uk\/cdn\/shop\/files\/gn13010_detail_10.jpg?v=1723720467","width":1800},{"alt":null,"id":34464631947490,"position":11,"preview_image":{"aspect_ratio003csource data-element=\"lazy_mobile_image\" srcset=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-a.jpg\" media=\"(max-width: 768px)\"\u003e\u003cimg data-element=\"lazy_image\" src=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-a.jpg\" title=\"\" alt=\"\"\u003e\u003c\/picture\u003e\u003c\/figure\u003e\n\u003ch3 data-pb-style=\"YG0Y13S\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"heading\" class=\"text-xl font-medium\"\u003eLightweight Drivetrain\u003c\/h3\u003e\n\u003cdiv data-pb-style=\"M7QOT0R\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"text\" class=\"h-40\"\u003e\n\u003cp id=\"NM8TUA9\"\u003eMoving to a double drivetrain saves considerable weight over it's triple predecessor. A Shimano Claris 2 x 8-speed drivetrain coupled with an Acera rear derailleur maintains a wide range of ratios.\u003c\/p\u003e\n\u003c\/div\u0
03e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli aria-hidden=\"true\" class=\"carousel__slide carousel__slide--clone\"\u003e\n\u003cdiv data-content-type=\"slide\" class=\"carousel__item pagebuilder-column\"\u003e\n\u003cfigure data-pb-style=\"XGGFJY4\" data-element=\"main\" data-appearance=\"full-width\" data-content-type=\"image\" class=\"pagebuilder-image\"\u003e\u003cpicture\u003e\u003csource data-element=\"lazy_mobile_image\" srcset=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-b.jpg\" media=\"(max-width: 768px)\"\u003e\u003cimg data-element=\"lazy_image\" src=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-b.jpg\" title=\"\" alt=\"\"\u003e\u003c\/picture\u003e\u003c\/figure\u003e\n\u003ch3 data-pb-style=\"H85QIP3\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"heading\" class=\"text-xl font-medium\"\u003eLowrider\u003c\/h3\u003e\n\u003cdiv data-pb-style=\"MBLSBN1\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"text\" class=\"h-40\"\u003e\n\u003cp id=\"NM8TUA9\"\u003eA traditional AtranVelo Explorer front pannier rack keeps luggage as low as possible to maintain the Tour De Fer's sublime handling when fully loaded.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli aria-hidden=\"true\" class=\"carousel__slide carousel__slide--clone\"\u003e\n\u003cdiv data-content-type=\"slide\" class=\"carousel__item pagebuilder-column\"\u003e\n\u003cfigure data-pb-style=\"TP6IV7K\" data-element=\"main\" data-appearance=\"full-width\" data-content-type=\"image\" class=\"pagebuilder-image\"\u003e\u003cpicture\u003e\u003csource data-element=\"lazy_mobile_image\" srcset=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-c.jpg\" media=\"(max-width: 768px)\"\u003e\u003cimg data-element=\"lazy_image\" src=\"https:\/\/www.freewheel.co.uk\/media\/headless_we
bsites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-c.jpg\" title=\"\" alt=\"\"\u003e\u003c\/picture\u003e\u003c\/figure\u003e\n\u003ch3 data-pb-style=\"AW7XFP6\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"heading\" class=\"text-xl font-medium\"\u003eAccessorised\u003c\/h3\u003e\n\u003cdiv data-pb-style=\"SFYMXJ3\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"text\" class=\"h-40\"\u003e\n\u003cp id=\"NM8TUA9\"\u003eFitted mudguards, front and rear luggage racks, dynamo cable routing and comfortable Vittoria Randonneur 40mm tyres complete the tour-ready specification. The Tour De Fer even comes with spare spokes.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli aria-hidden=\"true\" class=\"carousel__slide carousel__slide--clone carousel__slide--prev\"\u003e\n\u003cdiv data-content-type=\"slide\" class=\"carousel__item pagebuilder-column\"\u003e\n\u003cfigure data-pb-style=\"RI2SDBD\" data-element=\"main\" data-appearance=\"full-width\" data-content-type=\"image\" class=\"pagebuilder-image\"\u003e\u003cpicture\u003e\u003csource data-element=\"lazy_mobile_image\" srcset=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-d.jpg\" media=\"(max-width: 768px)\"\u003e\u003cimg data-element=\"lazy_image\" src=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-d.jpg\" title=\"\" alt=\"\"\u003e\u003c\/picture\u003e\u003c\/figure\u003e\n\u003ch3 data-pb-style=\"SKWN82T\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"heading\" class=\"text-xl font-medium\"\u003ePrecious Metal\u003c\/h3\u003e\n\u003cdiv data-pb-style=\"NPWAE7G\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"text\" class=\"h-40\"\u003e\n\u003cp id=\"NM8TUA9\"\u003eOur Mjolnir Chromoly tubeset is crafted to deliver a sublime ride feel with excellent comfort whilst also being immensely durable.\u0
03c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli aria-hidden=\"false\" class=\"carousel__slide carousel__slide--visible carousel__slide--active\"\u003e\n\u003cdiv data-content-type=\"slide\" class=\"carousel__item pagebuilder-column\"\u003e\u003c\/div\u003e\n\u003c\/li\u003e\n\u003c\/ol\u003e\n\u003c\/div\u003e\n\u003cdiv aria-atomic=\"true\" aria-live=\"polite\" class=\"carousel__liveregion carousel__sr-only\"\u003e\u003cpicture\u003e\u003csource data-element=\"lazy_mobile_image\" srcset=\"https:\/\/www.freewheel.co.uk\/media\/headless_websites\/genesis\/tour_de_fer\/tdf_20\/800x1000-tdf20-keyfeature-a.jpg\" media=\"(max-width: 768px)\"\u003e\u003c\/picture\u003e\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv data-element=\"main\" data-appearance=\"contained\" data-content-type=\"row\"\u003e\n\u003cdiv data-pb-style=\"UCJQB9T\" data-element=\"inner\" data-video-fallback-src=\"\" data-video-lazy-load=\"true\" data-video-play-only-visible=\"true\" data-video-loop=\"true\" data-background-type=\"image\" data-background-images=\"{}\" data-parallax-speed=\"0.5\" data-enable-parallax=\"0\"\u003e\n\u003cdiv data-pb-style=\"UA3GF04\" data-element=\"main\" data-grid-size=\"12\" data-appearance=\"default\" data-content-type=\"column-group\" data-background-images=\"{}\" class=\"pagebuilder-column-group\"\u003e\n\u003cdiv data-pb-style=\"VDK6QJO\" data-element=\"main\" data-content-type=\"column-line\" class=\"pagebuilder-column-line\"\u003e\n\u003cdiv data-pb-style=\"BY2ESFK\" data-element=\"main\" data-background-images=\"{}\" data-appearance=\"full-height\" data-content-type=\"column\" class=\"pagebuilder-column\"\u003e\n\u003ch2 data-pb-style=\"A97HX4X\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"heading\"\u003eTour de Fer 20: CyclingPlus’ Commuter Test Winner\u003c\/h2\u003e\n\u003cdiv data-element=\"main\" data-appearance=\"default\" data-content-type=\"text\"\u003e\n\u003cp\u003eTour de Fer 20: Cyc
lingPlus’ Commuter Test Winner\u003c\/p\u003e\n\u003cp\u003eThe Genesis Tour de Fer 20 has once again triumphed in CyclingPlus's commuter group test, securing its place as the ultimate bike for urban adventures and beyond. Praised for its wide gear range, outstanding comfort, and versatility, it’s the perfect choice for both daily commutes and weekend explorations.\u003c\/p\u003e\n\u003cp\u003e\u003cem\u003e\"A truly excellent commuter capable of tackling all sorts of terrain, as well as that trip of a lifetime.\"\u003c\/em\u003e\u003c\/p\u003e\n\u003cp\u003eCyclingPlus\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv data-pb-style=\"RNRLO9E\" data-element=\"main\" data-same-width=\"false\" data-appearance=\"inline\" data-content-type=\"buttons\"\u003e\n\u003cdiv data-pb-style=\"KVMP5YB\" data-element=\"main\" data-appearance=\"default\" data-content-type=\"button-item\"\u003e\u003ca data-pb-style=\"AQUE03H\" data-element=\"link\" data-link-type=\"default\" href=\"https:\/\/www.genesisbikes.co.uk\/stories\/tour-de-fer-20-cyclingplus-commuter-test-winner\" class=\"pagebuilder-button-primary\" target=\"\"\u003e\u003cspan data-element=\"link_text\"\u003eRead Now\u003c\/span\u003e\u003c\/a\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv data-pb-style=\"XYRRYUO\" data-element=\"main\" data-background-images=\"{}\" data-appearance=\"full-height\" data-content-type=\"column\" class=\"pagebuilder-column\"\u003e\n\u003cfigure data-pb-style=\"SHJ4OYA\" data-element=\"main\" data-appearance=\"full-width\" data-content-type=\"image\" class=\"pagebuilder-image\"\u003e\u003cpicture\u003e\u003csource data-element=\"lazy_mobile_image\" srcset=\"https:\/\/www.freewheel.co.uk\/media\/wysiwyg\/TDF20_4STAR_4mb_5.jpg\" media=\"(max-width: 768px)\"\u003e\u003cimg data-element=\"lazy_image\" src=\"https:\/\/www.freewheel.co.uk\/media\/wysiwyg\/TDF20_4STAR_4mb_5.jpg\" title=\"\" alt=\"\"\u003e\u003c\/picture\u003e\u003c\/figure\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u0
03c\/div\u003e\n\u003c!----\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {45817776111842 : "deny",45817776144610 : "deny",45817776177378 : "deny",45817776210146 : "deny",45817776242914 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {45817776111842 : parseInt("0"),45817776144610 : parseInt("1"),45817776177378 : parseInt("1"),45817776210146 : parseInt("1"),45817776242914 : parseInt("0"),};
window._RestockRocketConfig.variantsPreorderCount = {45817776111842 : parseInt(""),45817776144610 : parseInt(""),45817776177378 : parseInt(""),45817776210146 : parseInt(""),45817776242914 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {45817776111842 : null,45817776144610 : null,45817776177378 : null,45817776210146 : null,45817776242914 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {45817776111842 : parseInt(""),45817776144610 : parseInt(""),45817776177378 : parseInt(""),45817776210146 : parseInt(""),45817776242914 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderMaxCountForMarket = {45817776111842 : null,45817776144610 : null,45817776177378 : null,45817776210146 : null,45817776242914 : null,};
window._RestockRocketConfig.variantsShippingText = {45817776111842 : "",45817776144610 : "",45817776177378 : "",45817776210146 : "",45817776242914 : "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {45817776111842 : null,45817776144610 : null,45817776177378 : null,45817776210146 : null,45817776242914 : null,};
window._RestockRocketConfig.selected_variant_id = 45817776144610;
window._RestockRocketConfig.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/019d9ac9-5dee-74e9-8643-e17aaa8798db/restockrocket-1-482/assets/restockrocket-product.js'
window._RestockRocketConfig.scr
iptUrlCollection = 'https://cdn.shopify.com/extensions/019d9ac9-5dee-74e9-8643-e17aaa8798db/restockrocket-1-482/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
const LIQUID_CACHE_MAX_AGE = 2 * 60 * 60; // 2 hours in seconds
// Calculate Liquid cache freshness once at initialization
const liquidRenderedAt = window._RestockRocketConfig.liquidRenderedAt;
// Validate timestamp and calculate cache age
if (!liquidRenderedAt || typeof liquidRenderedAt !== 'number' || isNaN(liquidRenderedAt)) {
console.debug('STOQ - Invalid or missing liquidRenderedAt timestamp, assuming fresh');
window._RestockRocketConfig.isLiquidCacheFresh = true;
} else {
const now = Math.floor(Date.now() / 1000); // Curr
ent time in seconds
const liquidCacheAge = now - liquidRenderedAt; // Age in seconds
// 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
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._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() - 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')
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 || {}));
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
];
if (value !== null && value !== undefined && value !== '') {
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;
}
}
// Setup event listener for cart selling plan updates
// This must be called before any scripts are loaded to avoid race conditions
function 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);
});
}
});
}
// 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.S
hopify.shop,
'ngrok-skip-browser-warning': 'skip'
};
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(cac
hedSettings);
} else {
console.error('STOQ - failed to load settings:', error);
}
})
.catch(function(e) {
console.error(e)
})
}
function initializeScripts(settings) {
settings = applyTranslations(settings);
window._RestockRocketConfig.settings = settings;
console.debug(`STOQ - settings configured for ${window._RestockRocketConfig.pageType}`);
// 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);
})
if(window._RestockRocketConfig.pageType === 'collection' && (settings.show_button_on_collection || settings.preorder_collection_enabled)) {
createRestockRocketScript(window._RestockRocketCon