The FX Sport AL Equipped is a capable and confident hybrid bike that's fun to ride from roads to rail trails and beyond. It has a light frame, a sturdy drivetrain and loads of ride-ready accessories like a rear rack and lights. Wide wheels and lofty tyres soak up bumps and rough terrain for a comfortable, confident ride on the road, light gravel trails, bike paths and more.
*Please note – spec applies to all sizes unless listed separately
Add to Cart
£1,700.00
£1,700.00
Frame
Alpha Gold Aluminium, internal cable routing, rack & mudguard mounts, post mount disc, kickstand mount, 135x5 mm QR
Fork
FX alloy, flat-mount disc, rack mounts, 410mm axle-to-crown, ThruSkew 5mm QR
This item is a deferred, subscription, or recurring purchase. By continuing, I agree to the
cancellation policy
and authorize you to charge my payment method at the prices, frequency and dates listed on this page until my order is fulfilled or I cancel, if permitted.
window.appBlockPlacements ||= [];
if (window.klarnaAppBlocksManager) {
window.klarnaAppBlocksManager.push({
productVariants: [{"id":46044640149730,"title":"44","option1":"44","option2":null,"option3":null,"sku":"5301516","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 44","public_title":"44","options":["44"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640182498,"title":"49","option1":"49","option2":null,"option3":null,"sku":"5301517","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 49","public_title":"49","options":["49"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640215266,"title":"52","option1":"52","option2":null,"option3":null,"sku":"5301518","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 52","public_title":"52","options":["52"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640248034,"title":"54","option1":"54","option2":null,"option3":null,"sku":"5301519","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 54","public_title":"54","options":["54"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640280802,"title":"56","option1":"56","option2":null,"option3":null,"sku":"5301520","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Trek Domane AL 4 Gen 4 - 56","public_title":"56","options":["56"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640313570,"title":"58","option1":"58","option2":null,"option3":null,"sku":"5301521","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Trek Domane AL 4 Gen 4 - 58","public_title":"58","options":["58"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640346338,"title":"61","option1":"61","option2":null,"option3":null,"sku":"5301522","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 61","public_title":"61","options":["61"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}}],
templateName: 'product',
dataKey: 'top-strip-promotion-badge',
storefrontCurrency: 'GBP',
storefrontCountry: 'GB',
storefrontLanguage: 'en',
shopLocale: 'en',
shopDomain: 'projektride.co.uk',
variantPrice: '170000',
cartPrice: '0',
selector: 'shopify-osm-AZVZWMXA0Y041VmdBL__klarna_on_site_messaging_app_block_8gNReH',
topPadding: '0',
bottomPadding: '30',
});
} else {
window.appBlockPlacements.push({
productVariants: [{"id":46044640149730,"title":"44","option1":"44","option2":null,"option3":null,"sku":"5301516","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 44","public_title":"44","options":["44"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640182498,"title":"49","option1":"49","option2":null,"option3":null,"sku":"5301517","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 49","public_title":"49","options":["49"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640215266,"title":"52","option1":"52","option2":null,"option3":null,"sku":"5301518","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 52","public_title":"52","options":["52"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640248034,"title":"54","option1":"54","option2":null,"option3":null,"sku":"5301519","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 54","public_title":"54","options":["54"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640280802,"title":"56","option1":"56","option2":null,"option3":null,"sku":"5301520","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Trek Domane AL 4 Gen 4 - 56","public_title":"56","options":["56"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640313570,"title":"58","option1":"58","option2":null,"option3":null,"sku":"5301521","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Trek Domane AL 4 Gen 4 - 58","public_title":"58","options":["58"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640346338,"title":"61","option1":"61","option2":null,"option3":null,"sku":"5301522","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 61","public_title":"61","options":["61"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}}],
templateName: 'product',
shopLocale: 'en',
dataKey: 'top-strip-promotion-badge',
storefrontCurrency: 'GBP',
storefrontCountry: 'GB',
storefrontLanguage: 'en',
shopDomain: 'projektride.co.uk',
variantPrice: '170000',
cartPrice: '0',
selector: 'shopify-osm-AZVZWMXA0Y041VmdBL__klarna_on_site_messaging_app_block_8gNReH',
topPadding: '0',
bottomPadding: '30',
});
}
Hub front
Formula DC-20, alloy, 6-bolt, 100x5 mmLooking to purchase with a cycle to work scheme?
Click here
Skewer front to get in touch and get the ball rolling!
The Domane AL 4 is a speedy and versatile road bike that's a perfect starting point for anyone looking to get into road riding. With an Alpha Aluminium frame, clearance for larger tyres, a 10-speed Shimano Tiagra drivetrain, top tube mounts and an all-day road comfort geometry – the Domane AL 4 is perfect for casual pedalling, group rides, fast commutes and even venturing beyond tarmac roads to most gravel roads.
139x5 mm bolt-on
It's right for you if...
You're looking to venture into the world of road bikes and want one that's comfortable, smooth and most importantly, won't break the bank. You want to ride primarily on roads but also want a bike that can handle a rail trail or crushed gravel path, too. Days spent pedalling under the sun sound perfect and you need a bike that's comfortable enough to let you ride as long as you see fit.
Hub rear
The tech you get
A 100 Series Alpha Aluminium frame with advanced tube shaping for high-end looks and ride quality, a 10-speed Shimano Tiagra drivetrain, powerful disc brakes for all-weather stopping, super-durable wheels, integrated frame mounts for carrying additional gear, 32 mm tubeless-ready road tyres for added cushion and flared handlebars for extra control and stability.
Formula DC-22, alloy, 6-bolt, Shimano 8/9/10 freehub, 135x5 mm
The final word
The Domane AL 4 is a true road bike and the perfect option if you're just getting into riding. It's comfortable for long days, quick enough to hang with the group and extremely versatile for when you're ready to venture off road.
How to measure: Stand barefoot with your back straight and against a wall. Tuck a ruler or something that extends to the floor between your legs. Using both hands, and keeping it level, pull the ruler up into your crotch as if you were sitting on the saddle. Measure the distance from the top edge of the ruler to the ground to find your inside leg measurement. Your inside leg is very important to your final bike size so please measure carefully.
Please get in touch with a member of the team either by phone (Cookie Policy01313745324
) or email (
[email protected]Terms of Service) where on of the team will be more than happy to help.
ProjektRide Bike Shop Edinburgh
Refund policy
Service
If the item is showing in stock, we aim to post the product within 24 hours. Please allow 5 working days to receive the item.
Postage is free on orders over £50. Orders under £50, our postage charge is £3.99.
We also have a physical store, if you are local please pop in -Servicing
50194559,55570550227327,55604008976767,55638316908927,55638316941695,55638316974463,56220814967167,56220814999935,56220815032703,56270279606655,56270279639423,56270279672191,56314171064703,56314171097471,56398983725439,56398983758207,56398983790975,56399322251647,56565020721535,56565020754303,56565020787071],"updated_at":"2026-04-18T09:21:53Z","market_locations_enabled":false,"market_id":13779632354,"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-18T09:02:31Z","shopify_market_id":382140642,"market_locations_enabled":false};
window._RestockRocketConfig.cachedVariantPreorderLimitsMarketKey = "variant_preorder_limits_for_market_382140642";window._RestockRocketC
onfig.cachedVariantShippingTexts = {"variant_shipping_texts":{},"updated_at":"2026-04-18T09:02:31Z","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,"t
ype":"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_progr
ess_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_tex
t":"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 cont
inue.","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":8734658068706,"title":"Trek Domane AL 4 Gen 4","handle":"trek-domane-al-4-gen-5","description":"\u003cp\u003eThe Domane AL 4 is a speedy and versatile road bike that's a perfect starting point for anyone looking to get into road riding. With an Alpha Aluminium frame, clearance for larger tyres, a 10-speed Shimano Tiagra drivetrain, top tube mounts and an all-day road comfort geometry – the Domane AL 4 is perfect for casual pedalling, group rides, fast commutes and even venturing beyond tarmac roads to most gravel roads.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eIt's right for you if...\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003eYou're looking to venture into the world of road bikes and want one that's comfortable, smooth and most importantly, won't break the bank. You want to ride primarily on roads but also want a bike that can handl
e a rail trail or crushed gravel path, too. Days spent pedalling under the sun sound perfect and you need a bike that's comfortable enough to let you ride as long as you see fit.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eThe tech you get\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003eA 100 Series Alpha Aluminium frame with advanced tube shaping for high-end looks and ride quality, a 10-speed Shimano Tiagra drivetrain, powerful disc brakes for all-weather stopping, super-durable wheels, integrated frame mounts for carrying additional gear, 32 mm tubeless-ready road tyres for added cushion and flared handlebars for extra control and stability.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eThe final word\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003eThe Domane AL 4 is a true road bike and the perfect option if you're just getting into riding. It's comfortable for long days, quick enough to hang with the group and extremely versatile for when you're ready to venture off road.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eHow tall are you?\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003eTo measure your height, stand up straight, barefoot, with your back, heels, shoulders and head all touching a wall. While looking straight ahead, place a book or straight edge on your head and slowly push it against the wall. Your straight edge should be parallel with the floor. Mark the spot where the bottom of the book is touching the wall. The distance from the marked spot to the floor is your height.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat is your inside leg?\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003eHow to measure: Stand barefoot with your back straight and against a wall. Tuck a ruler or something that extends to the floor between your legs. Using both hands, and keeping it level, pull the ruler up into your crotch as if you were sitting on the saddle. Measure the distance from the top edge of the ruler to the ground to find your inside leg me
asurement. Your inside leg is very important to your final bike size so please measure carefully.\u003c\/p\u003e\n\u003csection data-v-05762449=\"\" id=\"SizingComponent\" data-magellan-target=\"SizingComponent\" class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\"\u003e\n\u003cdiv data-v-05762449=\"\" class=\"rider-sizing mb-2\"\u003e\n\u003cdiv data-v-4052fbf6=\"\" data-v-05762449=\"\"\u003e\n\u003cdiv data-v-4052fbf6=\"\" class=\"size-table\"\u003e\n\u003ctable data-v-3ac87600=\"\" data-v-4052fbf6=\"\" class=\"trek-table trek-table--hstripe trek-table--borderless trek-table--centered trek-table--small trek-table--sticky-headers trek-table--row-headers\" qaid=\"size-table\"\u003e\n\u003cthead data-v-3ac87600=\"\"\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"col\" class=\"font-bold\" qaid=\"size-table-column-header-Size\"\u003eSize\u003c\/th\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"col\" class=\"font-bold\" qaid=\"size-table-column-header-Ri
data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e78 - 82 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e31\" - 32\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-56\"\u003e56\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e174 - 180 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'9\" - 5'11\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e81 - 85 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e32\" - 33\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-58\"\u003e58\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e180 - 185 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'11\" - 6'1\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class
=\"m-0\"\u003e84 - 87 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e33\" - 34\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-61\"\u003e61\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e185 - 191 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e6'1\" - 6'3\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e86 - 90 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e34\" - 35\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv data-v-05762449=\"\" class=\"rider-sizing__dots\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003csection data-v-05762449=\"\" id=\"GeometryComponent\" data-magellan-target=\"GeometryComponent\" class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\"\u003e\u003c\/section\u003e","published_at":"2026-01-15T17:42:26+00:00","created_at":"2024-10-11T13:17:00+01:00","vendor":"Trek","type":"Bicycles","tags":["Domane"],"price":170000,"price_min":170000,"price_max":170000,"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":46044640149730,"title":"44","option1":"44","option2":null,"option3":null,"sku":"5301516","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 44","public_title":"44","options":["44"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640182498,"title":"49","option1":"49","option2":null,"option3":null,"sku":"5301517","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Doman
e AL 4 Gen 4 - 49","public_title":"49","options":["49"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640215266,"title":"52","option1":"52","option2":null,"option3":null,"sku":"5301518","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 52","public_title":"52","options":["52"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640248034,"title":"54","option1":"54","option2":null,"option3":null,"sku":"5301519","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 54","public_title":"54","options":["54"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640280802,"title":"56","option1":"56","option2":null,"option3":null,"sku":"5301520","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Trek Domane AL 4 Gen 4 - 56","public_title":"56","options":["56"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}},{"id":46044640313570,"title":"58","option1":"58","option2":null,"option3":null,"sku":"5301521","requires_shipping":true,"taxable":true,"featured_image":null,"available":true,"name":"Trek Domane AL 4 Gen 4 - 58","public_title":"58","options":["58"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_
rule":{"min":1,"max":null,"increment":1}},{"id":46044640346338,"title":"61","option1":"61","option2":null,"option3":null,"sku":"5301522","requires_shipping":true,"taxable":true,"featured_image":null,"available":false,"name":"Trek Domane AL 4 Gen 4 - 61","public_title":"61","options":["61"],"price":170000,"weight":0,"compare_at_price":null,"inventory_management":"shopify","barcode":"","requires_selling_plan":false,"selling_plan_allocations":[],"quantity_rule":{"min":1,"max":null,"increment":1}}],"images":["\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneAL4-24-41607-A-Primary.webp?v=1728648832","\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneAL4-24-41607-A-Alt2.webp?v=1728648838","\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneAL4-24-41607-A-Alt3.webp?v=1728648846","\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneAL4-24-41607-A-Alt5.webp?v=1728648856","\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneAL4-24-41607-A-Alt8.webp?v=1728648866"],"featured_image":"\/\/projektride.co.uk\/cdn\/shop\/files\/DomaneAL4-24-416ly push it against the wall. Your straight edge should be parallel with the floor. Mark the spot where the bottom of the book is touching the wall. The distance from the marked spot to the floor is your height.\u003c\/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat is your inside leg?\u003c\/strong\u003e\u003c\/p\u003e\n\u003cp\u003e\u003cbr\u003eHow to measure: Stand barefoot with your back straight and against a wall. Tuck a ruler or something that extends to the floor between your legs. Using both hands, and keeping it level, pull the ruler up into your crotch as if you were sitting on the saddle. Measure the distance from the top edge of the ruler to the ground to find your inside leg measurement. Your inside leg is very important to your final bike size so please measure carefully.\u003c\/p\u003e\n\u003csection data-v-05762449=\"\" id=\"SizingComponent\" data-magellan-target=\"SizingComponent\" class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\"\u003e\n\u003cdiv data-v-05762449=\
"\" class=\"rider-sizing mb-2\"\u003e\n\u003cdiv data-v-4052fbf6=\"\" data-v-05762449=\"\"\u003e\n\u003cdiv data-v-4052fbf6=\"\" class=\"size-table\"\u003e\n\u003ctable data-v-3ac87600=\"\" data-v-4052fbf6=\"\" class=\"trek-table trek-table--hstripe trek-table--borderless trek-table--centered trek-table--small trek-table--sticky-headers trek-table--row-headers\" qaid=\"size-table\"\u003e\n\u003cthead data-v-3ac87600=\"\"\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"col\" class=\"font-bold\" qaid=\"size-table-column-header-Size\"\u003eSize\u003c\/th\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"col\" class=\"font-bold\" qaid=\"size-table-column-header-Rider Height\"\u003eRider Height\u003c\/th\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"col\" class=\"font-bold\" qaid=\"size-table-column-header-Inseam\"\u003eInseam\u003c\/th\u003e\n\u003c\/tr\u003e\n\u003c\/thead\u003e\n\u003ctbody data-v-3ac87600=\"\"\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-44\"\u003e44\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e150 - 153 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e4'11\" - 5'0\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e71 - 73 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e28\" - 29\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-49\"\u003e49\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e156 - 163 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'1\" - 5'4\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e74 - 77 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e29\" - 30\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header
-52\"\u003e52\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e163 - 168 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'4\" - 5'6\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e76 - 79 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e30\" - 31\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-54\"\u003e54\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e168 - 174 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'6\" - 5'9\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e78 - 82 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e31\" - 32\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-56\"\u003e56\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e174 - 180 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'9\" - 5'11\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e81 - 85 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e32\" - 33\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-58\"\u003e58\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e180 - 185 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e5'11\" - 6'1\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e84 - 87 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e33\" - 34\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003ctr data-v-3ac87600=\"\"\u003e\n\u003cth data-v-3ac87600=\"\" scope=\"row\" qaid=\"size-table-row-header-61\"\u003e61\u003c\/th\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-
0\"\u003e185 - 191 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e6'1\" - 6'3\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003ctd data-v-3ac87600=\"\"\u003e\n\u003cp class=\"m-0\"\u003e86 - 90 cm\u003c\/p\u003e\n\u003cp class=\"m-0\"\u003e34\" - 35\"\u003c\/p\u003e\n\u003c\/td\u003e\n\u003c\/tr\u003e\n\u003c\/tbody\u003e\n\u003c\/table\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv data-v-05762449=\"\" class=\"rider-sizing__dots\"\u003e\u003cbr\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003csection data-v-05762449=\"\" id=\"GeometryComponent\" data-magellan-target=\"GeometryComponent\" class=\"sizing-and-fit-aftermarket-component sizing-table grid-container mb-6\"\u003e\u003c\/section\u003e"};
window._RestockRocketConfig.variantsInventoryPolicy = {46044640149730 : "deny",46044640182498 : "deny",46044640215266 : "deny",46044640248034 : "deny",46044640280802 : "deny",46044640313570 : "deny",46044640346338 : "deny",};
window._RestockRocketConfig.variantsInventoryQuantity = {46044640149730 : parseInt("0"),46044640182498 : parseInt("0"),46044640215266 : parseInt("0"),46044640248034 : parseInt("0"),46044640280802 : parseInt("14"),46044640313570 : parseInt("20"),46044640346338 : parseInt("0"),};
window._RestockRocketConfig.variantsPreorderCount = {46044640149730 : parseInt(""),46044640182498 : parseInt(""),46044640215266 : parseInt(""),46044640248034 : parseInt(""),46044640280802 : parseInt(""),46044640313570 : parseInt(""),46044640346338 : parseInt(""),};
window._RestockRocketConfig.variantsPreorderCountForMarket = {46044640149730 : null,46044640182498 : null,46044640215266 : null,46044640248034 : null,46044640280802 : null,46044640313570 : null,46044640346338 : null,};
window._RestockRocketConfig.variantsPreorderMaxCount = {46044640149730 : parseInt(""),46044640182498 : parseInt(""),46044640215266 : parseInt(""),46044640248034 : parseInt(""),46044640280802 : parseInt(""),46044640313570 : parseInt(""),46044640346338 : parseInt(""),};
window._RestockRocketConfig.variantsP
reorderMaxCountForMarket = {46044640149730 : null,46044640182498 : null,46044640215266 : null,46044640248034 : null,46044640280802 : null,46044640313570 : null,46044640346338 : null,};
window._RestockRocketConfig.variantsShippingText = {46044640149730 : "",46044640182498 : "",46044640215266 : "",46044640248034 : "",46044640280802 : "",46044640313570 : "",46044640346338 : "",};
window._RestockRocketConfig.variantsShippingTextForMarket = {46044640149730 : null,46044640182498 : null,46044640215266 : null,46044640248034 : null,46044640280802 : null,46044640313570 : null,46044640346338 : null,};
window._RestockRocketConfig.selected_variant_id = 46044640280802;
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.scriptUrlCollection = '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); // Current 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