Chaos Scrubber – Textured Exfoliating Wash Cloth for Horses
Chaos Scrubber – Textured Exfoliating Wash Cloth for Horses

Chaos Scrubber – Textured Exfoliating Wash Cloth for Horses

$8.95
Tax included.

β€œInstantly cool, vibrant, and my horse loves it!”

James L., Horse Owner

SIZE
Only 96 left in stock!

Pickup available at 578 Coorong Avenue, Red Cliffs, VIC

Usually ready in 24 hours

same day shipping for orders before 11:30am AEST

30 day money back guarantee

Satisfaction guaranteed or your money back

Product Description

βˆ’

Because horse care gets chaotic. 🐴

Meet the Chaos Scrubber β€” your new secret weapon for bath day, show prep, and every muddy mess in between.

Inspired by traditional African bath nets, this textured exfoliating wash cloth is designed to lift dirt, loosen dried mud, and help your shampoo lather through even the thickest winter coat.

What it does:

  • Lifts stubborn dirt and dried mud from the coat
  • Helps shampoo lather faster and go further
  • Loosens hair and debris before washing
  • Gentle enough for sensitive skin
  • Works with any Horse Queened shampoo or wash

    How to use:

    🧴 With Suds It Wet the coat, apply your shampoo and work the Chaos Scrubber in circular motions to lather up and lift dirt and old hair from the coat

    🟣 With Mask It Apply your Mask It clay mask to the coat and use the Chaos Scrubber to work it through β€” perfect for a deep clean and brightening session

    🦡 For legs β€” the back-saver trickΒ  Wrap around the leg and hold one end in each hand, and gently work back and forth β€” no bending, no kneeling, no back complaints πŸ’œ Perfect for cleaning muddy legs, fetlocks and cannon areas without the struggle

    At 66cm x 20cm there's plenty of scrubber to work with β€” big enough to wrap around any leg from mini to warmblood 🐴

    From filthy to fabulous β€” in one scrub. πŸ’œ

    Cosmetic use only β€” not a veterinary product

    How to Use

    +

    No care instructions available.

    Ingredients & Safety

    +

    No safety information available.

    Lightweight gel with a fresh, cooling feel

    Subtle herbal scent β€” no overpowering odours

    Non-greasy, fast-absorbing formula

    Gentle on sensitive skin

    Made in Australia with natural ingredients

    FREQUENTLY ASKED QUESTIONS

    Whether you've got questions about your gear, shipping, or anything in between - we've got answers. And if we don't, we'll get back to you fast.

    When will my order ship?

    Same day shipping if placed before 11.30am AEST, fast daily shipping

    How do I track my order?

    Head to our Track Order page and enter your email and order number. You’ll get real-time updates on your shipment status.

    What’s your return policy?

    We offer a 30-day performance guarantee. If you’re not satisfied with your purchase, reach out to us and we’ll make it right - no questions asked.

    Do you offer international shipping?

    Yes! We ship worldwide. Shipping rates and delivery times are calculated at checkout based on your location.

    How do I contact customer support?

    Use the contact form from the β€œSupport” page. Please allow 24 business hours for a response from our support team.

    are your products safe?

    Sure! All natural, cosmetic formulas, external use only, not a veterinary product.

    Recently viewed

    /* Product zoom: mouse-follow + touch toggle Works with: product-zoom-element[data-magnify], .product-zoom--wrapper, .product-zoom--enlarged */ (() => { const ZOOM_ATTR = 'data-magnify'; const roots = Array.from(document.querySelectorAll(`product-zoom-element[${ZOOM_ATTR}]`)); if (!roots.length) return; roots.forEach(root => { // ensure root is focusable for keyboard access if (!root.hasAttribute('tabindex')) root.setAttribute('tabindex', '0'); const wrapper = root.querySelector('.product-zoom--wrapper'); const enlarged = root.querySelector('.product-zoom--enlarged'); if (!wrapper) return; const rawZoom = parseFloat(root.getAttribute('data-magnify')) || 1.7; let effectiveZoom = rawZoom; // may be increased if high-res image is larger let isZoomed = false; // compute effective zoom based on the natural size of the enlarged image (if available) function updateEffectiveZoom() { try { if (enlarged && enlarged.naturalWidth && root.offsetWidth) { const imageRatio = enlarged.naturalWidth / root.offsetWidth; // we want at least rawZoom but if enlarged image is bigger, allow larger zoom effectiveZoom = Math.max(rawZoom, imageRatio); } else { effectiveZoom = rawZoom; } } catch (err) { effectiveZoom = rawZoom; } } if (enlarged) { if (enlarged.complete) updateEffectiveZoom(); else enlarged.addEventListener('load', updateEffectiveZoom, { once: true }); // also update on window resize (image/container geometry changes) window.addEventListener('resize', () => { updateEffectiveZoom(); }); } // Utility: set transform-origin and scale for enlarged image function setOriginAndScale(clientX, clientY) { const rect = root.getBoundingClientRect(); // clamp values 0..100 const x = Math.min(100, Math.max(0, ((clientX - rect.left) / rect.width) * 100)); const y = Math.min(100, Math.max(0, ((clientY - rect.top) / rect.height) * 100)); if (enlarged) { enlarged.style.transformOrigin = `${x}% ${y}%`; enlarged.style.transform = `scale(${effectiveZoom})`; } // slight parallax: move wrapper transform-origin to follow cursor (subtle) wrapper.style.transformOrigin = `${x}% ${y}%`; } // Activate zoom (add class, set scale) function activateZoom(clientX, clientY) { updateEffectiveZoom(); root.classList.add('is-zoomed'); isZoomed = true; if (typeof clientX === 'number' && typeof clientY === 'number') { setOriginAndScale(clientX, clientY); } else { // center if no coordinates provided if (enlarged) { enlarged.style.transformOrigin = `50% 50%`; enlarged.style.transform = `scale(${effectiveZoom})`; } wrapper.style.transformOrigin = `50% 50%`; } } // Deactivate zoom (reset transforms) function deactivateZoom() { root.classList.remove('is-zoomed'); isZoomed = false; if (enlarged) { enlarged.style.transform = 'scale(1)'; enlarged.style.transformOrigin = '50% 50%'; } wrapper.style.transform = 'scale(1)'; wrapper.style.transformOrigin = '50% 50%'; } // Mouse handlers function onMouseMove(e) { if (!isZoomed) activateZoom(e.clientX, e.clientY); else setOriginAndScale(e.clientX, e.clientY); } function onMouseEnter(e) { // activate but don't force a jump β€” set origin from event activateZoom(e.clientX, e.clientY); } function onMouseLeave() { deactivateZoom(); } // Touch handlers (simple toggle on first tap; move origin while zoomed) let lastTouchEnd = 0; function onTouchStart(e) { if (e.touches.length > 1) { // ignore pinch for now β€” allow browser default return; } const t = e.touches[0]; // toggle on tap if (!isZoomed) { activateZoom(t.clientX, t.clientY); } else { // if already zoomed, just update origin (user may pan) setOriginAndScale(t.clientX, t.clientY); } } function onTouchMove(e) { if (!isZoomed || e.touches.length === 0) return; const t = e.touches[0]; setOriginAndScale(t.clientX, t.clientY); } function onTouchEnd(e) { // if touchend with no subsequent touches, keep zoom active; second tap will close. // implement a quick double-tap-to-close const now = Date.now(); if (now - lastTouchEnd < 300) { // double-tap detected -> close deactivateZoom(); } lastTouchEnd = now; } // Keyboard (Enter/Space toggles) function onKeyDown(e) { if (e.key === 'Enter' || e.key === ' ' || e.key === 'Spacebar') { e.preventDefault(); if (!isZoomed) activateZoom(root.getBoundingClientRect().left + root.offsetWidth / 2, root.getBoundingClientRect().top + root.offsetHeight / 2); else deactivateZoom(); } else if (e.key === 'Escape' && isZoomed) { deactivateZoom(); } } // Bind events root.addEventListener('mousemove', onMouseMove); root.addEventListener('mouseenter', onMouseEnter); root.addEventListener('mouseleave', onMouseLeave); // touch: use passive listeners where safe root.addEventListener('touchstart', onTouchStart, { passive: true }); root.addEventListener('touchmove', onTouchMove, { passive: true }); root.addEventListener('touchend', onTouchEnd, { passive: true }); root.addEventListener('keydown', onKeyDown); // Clean up in case element is removed (optional) // If you dynamically remove elements, consider removing listeners to avoid leaks. }); })();