Retro Halobag Cycling Saddle Bag
Retro Halobag Cycling Saddle Bag
Retro Halobag Cycling Saddle Bag
Retro Halobag Cycling Saddle Bag

Retro Halobag Cycling Saddle Bag

Price

$19.99 $15.99
Save 20%

color - Black

Please select a color

Quantity

Over $80 Free Shipping
Sustainably made
Secure payments

Enjoy the ride is your right! Keeping your belongings intact is what makes an enjoyable cycling experience.

Get our Halobag - The Premium Cycling Saddle Bag allows you to focus and enjoy your riding while holding your valuables, cycling accessories, and other essentials.

Without the worries of losing those items during the ride as this durable, waterproof ideal saddlebag is what you need to protect it.

This product is designed with a special reflective strap on both sides and taillights can be hung at the rear to make night trips safer. It comes with a seamed strap to conveniently attach a LED rear light (purchase separately).

 

LIMITED STOCK available so Click the above "ADD TO CART" now!

Features:

  • Materials - Carbon fiber PU leather
  • Exquisite, durable, and waterproof
  • Invisible and sealed zip design for better waterproof effect
  • Ideal to hold and protect your wallet, mobile phone, sunglasses, and other necessary items
  • Effective to reduce shock and bear slightly press without deformation
  • A belt on the back to hang taillight makes you more visible at night

     

    Specifications of our product:

    • Color: Black
    • Size: 190mm x 140mm x 50mm
    • Material: PU Leather+Carbon Fiber+EVA


    Please note that:

    • Please allow 1-3cm measuring deviation due to manual measurement.
    • Due to the different monitor and light effects, the actual color of the item might be slightly different from the color shown in the photos.


    Package Includes:

    • 1 unit x Halobag - Cycling Saddle Bag


    Our Refund Policy

    We believe our customers are the ones that we exist. That's why we ensure that you get the best service and we promise a 100% satisfaction guarantee.

    We will either refund or resend a new piece on all damaged products upon delivery so long it is not man-made.

    Please email us at support@rsscsports.com and let us know the reason you wish to ask for a refund of the products. Add images in case of damaged or faulty products.

    Once our team has received your email, we can either offer you a refund, perform an even exchange with a different product, or if you'd like, we can reinstate the full amount in store credit to use as you see fit! This will be determined on a case by case basis.

    If you don't have a positive experience for whatsoever reason, we offer a 30-day satisfaction guarantee and will do WHATEVER it takes to make sure you are 100% satisfied with your purchase.

    We have 24/7/365 Email Support. Please contact us if you need assistance.

     

     

     

    Customer Reviews

    Here are what our customers say.

    Write a Review
    Customer Reviews
    Wow you reached the bottom
    Newest
    Most liked
    Highest ratings
    Lowest ratings
    ×
    class SpzCustomFileUpload extends SPZ.BaseElement { constructor(element) { super(element); this.uploadCount_ = 0; this.fileList_ = []; } buildCallback() { this.action = SPZServices.actionServiceForDoc(this.element); this.registerAction('upload', (data) => { this.handleFileUpload_(data.event?.detail?.data || []); }); this.registerAction('delete', (data) => { this.handleFileDelete_(data?.args?.data); }); this.registerAction('preview', (data) => { this.handleFilePreview_(data?.args?.data); }); this.registerAction('limit', (data) => { this.handleFileLimit_(); }); this.registerAction('sizeLimit', (data) => { this.handleFileSizeLimit_(); }); } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } setData_(count, file) { this.uploadCount_ = count; this.fileList_ = file; } handleFileUpload_(data) { data.forEach(i => { if(this.fileList_.some(j => j.url === i.url)) return; this.fileList_.push(i); }) this.uploadCount_++; sessionStorage.setItem('fileList', JSON.stringify(this.fileList_)); this.triggerEvent_("handleFileUpload", { count: this.uploadCount_, files: this.fileList_}); if(this.fileList_.length >= 5){ document.querySelector('#review_upload').style.display = 'none'; } if(this.fileList_.length > 0){ document.querySelector('.apps-reviews-write-anonymous-box').style.marginTop = '8px'; } } handleFileDelete_(index) { this.fileList_.splice(index, 1); this.uploadCount_--; sessionStorage.setItem('fileList', JSON.stringify(this.fileList_)); this.triggerEvent_("handleFileDelete", { count: this.uploadCount_, files: this.fileList_}); document.querySelector('#review_upload').style.display = 'block'; if(this.fileList_?.length === 0){ document.querySelector('.apps-reviews-write-anonymous-box').style.marginTop = '132px'; } } handleFilePreview_(index) { const finalPreviewData = this.fileList_[index]; const filePreviewModal = document.getElementById('filePreviewModal'); const fullScreenVideo = document.getElementById('fullScreenVideo'); const fullScreenImage = document.getElementById('fullScreenImage'); const previewModalClose = document.getElementById('previewModalClose'); const previewLoading = document.getElementById('previewLoading'); filePreviewModal.style.display = 'block'; previewLoading.style.display = 'flex'; if(finalPreviewData?.type === 'video'){ const media = this.mediaParse_(this.fileList_[index]?.url); fullScreenVideo.addEventListener('canplaythrough', function() { previewLoading.style.display = 'none'; }); fullScreenImage.src = ''; fullScreenImage.style.display = 'none'; fullScreenVideo.style.display = 'block'; fullScreenVideo.src = media.mp4 || ''; } else { fullScreenImage.onload = function() { previewLoading.style.display = 'none'; }; fullScreenVideo.src = ''; fullScreenVideo.style.display = 'none'; fullScreenImage.style.display = 'block'; fullScreenImage.src = finalPreviewData.url; } previewModalClose.addEventListener('click', function() { filePreviewModal.style.display = 'none'; }); } handleFileLimit_() { alert(window.AppReviewsLocale.comment_file_limit || 'please do not upload files more than 5'); this.triggerEvent_("handleFileLimit"); } handleFileSizeLimit_() { alert(window.AppReviewsLocale.comment_file_size_limit || 'File size does not exceed 10M'); } clear(){ this.fileList_ = []; this.uploadCount_ = 0; sessionStorage.setItem('fileList', JSON.stringify(this.fileList_)); this.triggerEvent_("handleClear", { count: this.uploadCount_, files: this.fileList_}); document.querySelector('#review_upload').style.display = 'block'; } mediaParse_(url) { var result = {}; try { url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (str, key, value) { try { result[key] = decodeURIComponent(value); } catch (e) { result[key] = value; } }); result.preview_image = url.split('?')[0]; } catch (e) {}; return result; } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, name, data); this.action.trigger(this.element, name, event); } } SPZ.defineElement('spz-custom-file-upload', SpzCustomFileUpload);
    The review would not show in product details on storefront since it does not support to.