Bundles & Packs

Our Bundles & Packs bring together Horse Queened favourites in simple routines for grooming, coat care and everyday horse care.

Loading products...
501 RESULTS

Swash It.

Wow! Spray, Wipe, And Suddenly They Look Like They’ve Had A Full Pamper. Amazing Products. Love Horse Queened

Jordan C. - Sydney
★★★★★

Swash It.

Wow! Spray, Wipe, And Suddenly They Look Like They’ve Had A Full Pamper. Amazing Products. Love Horse Queened

Jordan C. - Sydney
★★★★★
The Whites & Brights Pack – Mask It + Sock It Whitening Duo - Horse QueenedThe Whites & Brights Pack – Mask It + Sock It Whitening Duo - Horse Queened

The Whites & Brights Pack – Mask It + Sock It Whitening Duo

Simple two-step routine for easy grooming
Lifts dirt and daily grime for a fresher finish
Enhances the look of natural whites
Purple
$59.95
14% Off
Hoof Rescue Pack – Clean, Conditioned Hooves, Every Day - Horse QueenedHoof Rescue Pack – Clean, Conditioned Hooves, Every Day - Horse Queened

Hoof Ritual Pack – Clean, Conditioned Hooves, Every Day

Perfect for healthy-looking hooves year-round
Easy targeted frog/sole routine
Daily hoof conditioning & care
SMALL 500ml Hoof It 60ml Thrush It
$89.00
Glitz It & Gloss It Pack – The Ultimate Show Shine Duo - Horse Queened

Glitz It & Gloss It Pack – The Ultimate Show Shine Duo

Soft, conditioned finish
Show-day ready shine
Instant glow
Clear
$89.95
The Essentials Kit - Horse Queened

The Essentials Kit

Perfect for every horse owner’s routine
Cooling, soothing + conditioning all in one pack
Complete daily care for hooves, legs + coat
Various Size
$149.95
Purple Chaos Caddy - Horse QueenedPurple Chaos Caddy - Horse Queened

Purple Chaos Caddy

Made for chaos, cleans up nicely
Stands upright, easy access
Corrals your care and grooming chaos
Purple
$79.95
15% Off
Soothe, Salve & Cool Pack - Horse Queened

Soothe, Salve & Cool Pack

Perfect post-ride or rest-day pack
Cooling, softening, and soothing routine
Daily comfort for legs + coat
500ml Spray
$140.95
Spa Glow Duo - Horse Queened

Spa Glow Duo

The Perfect Gift Bag
Purple Grooming Made Easy
Instant Glow-Up Finish
Purple
$82.90
20% Off
They Earned It Pack - Horse QueenedThey Earned It Pack - Horse Queened

They Earned It Pack

Perfect for horse recovery days
Cooling, softening, and conditioning care
Post-work routine for legs, hooves + coat
Spray 500ml
$199.00
Rug & Tack Cleaner Duo | Queened Wash + Buff Queened - Horse QueenedRug & Tack Cleaner Duo | Queened Wash + Buff Queened - Horse Queened

Rug & Tack Cleaner Duo | Queened Wash + Buff Queened

Leaves tack polished, nourished & ready to ride
Reduces static & stiffness in rug linings
Removes dust, sweat & stable smell fast
1L & 500ml
$67.95
13% Off
Recovery Queened Pack - Horse Queened

Post-Ride Ritual Pack

Perfect post-ride routine
Softens, cools, and comforts
Daily care for tired legs + muscles
Clear
$95.00
New

The Shed Happens Duo – Horse Shedding Made Simple

Leaves a healthy-looking shine
Lifts dirt, dust and buildup from the coat
Helps loosen shedding hair for easier removal
1000ml & 500ml
$79.95
1 of 1

UNLEASH YOUR HORSE'S BEST SHINE

Transform every grooming session into a spa-like experience, so your horse enjoys a healthy, glossy coat every day.

Premium Care Proven Results

Trusted by riders for stronger hooves and softer coats, this is the quality care your horse truly deserves.

/* 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. // If you dynamically remove elements, consider removing listeners to avoid leaks. // If you dynamically remove elements, consider removing listeners to avoid leaks. }); })();