Choose another country or region to see content specific to your location and shop online.
Global Site
  • Select your country
Continue
Deselect "Roborock Product and Service Updates" in app settings to stop receving these updates.

Save EXTRA 10% off with ID.meLearn more.

Start

[[ lottery.name ]]

[[ lottery.subTitle ]]

  • : [[ item ]]
Congratulations on winning the reward

[[ WinningInformation?.name?.replaceAll('\\n', '\n') ]]

Check Now
Congratulations on winning the reward

Loading...

[[ WinningInformation?.name?.replaceAll('\\n', '\n') ]]

[[WinningInformation?.prizeCouponCode]]

[[copyText]]
thanks

Woops! Something went wrong:(

[[ nowinningText ]]
Subscribe to get points
Subscribe now and earn [[lottery.subPoints]] points instantly!
Subscribe
Subscription Successful!
[[ isFirstSub ? lottery.subPoints : '' ]] [[ isFirstSub ? `points have been successfully added to your account.` : `Since you are not a first-time subscriber, you cannot receive the points reward.`]]
My rewards

You have unclaimed rewards. Participate in the lottery to win.

Go spin now!

Lucky Draw!

' el._loadingEl = loadingEl const computedStyle = getComputedStyle(el) if (!['relative', 'absolute', 'fixed'].includes(computedStyle.position)) { el.style.position = 'relative' } if (binding.value) { el.appendChild(loadingEl) } }, updated(el, binding) { if (binding.value !== binding.oldValue) { if (binding.value) { el.appendChild(el._loadingEl) } else { if (el.contains(el._loadingEl)) { el.removeChild(el._loadingEl) } } } }, unmounted(el) { if (el._loadingEl && el.contains(el._loadingEl)) { el.removeChild(el._loadingEl) } delete el._loadingEl } }; // cookie function drawSetCookie(name, value, days = 1) { const expires = new Date(); expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000); document.cookie = `${name}=${value}; expires=${expires.toUTCString()}; path=/`; }; function drawGetCookie(name) { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); if (parts.length === 2) return parts.pop().split(';').shift(); return null; }; // 推送 GA4 埋点封装 function GA4PushFun(eventName, eventParameters) { window.dataLayer.push({ event_parameters: null }); window.dataLayer.push({ event: "ga4Event", event_name: eventName, event_parameters: eventParameters }); } const AppVUE3 = createApp({ delimiters: ['[[', ']]'], setup() { const loginLink = 'https://account-us.roborock.com/login?service=https://us.roborock.com'; const isMobile = (window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth) isDialog ? ( !isPc() ? 620 : 1100) : isPc() ? 1100 : (isPad() ? window.innerWidth - 24 - 24 - 40 : (window.innerWidth - 24 - 24) * 2)); const mobCoe = computed(()=>isDialog ? 1.77 : (1100 / wheelSize.value)); const lottery = reactive({ id : 0, name : '', subTitle: '', bgPC: '', //PC端背景图 restTimes: 0, //剩余次数 costPoints: 0, //每次抽奖消耗积分数 userLimitDaily: 0, //每人每天最多允许抽奖数,看前端是否需要展示给用户 rule: '', //活动规则, prizeList: [], //奖品列表 isNeedLogin:true, //是否需要登录抽奖 defaultPointToPrizeId:null, defaultPointToPrizeIndex:null, subPoints:200,//订阅积分 userEmailMe: 0,//用户emailme 0 默认| 1用户同意 | 2 用户拒绝 activityEmailMe:0,//活动email me 0 不展示| 1展示勾选 | 2 展示不勾选 }); const WinningInformation = ref({}) //中奖信息 // 抽奖逻辑 const canvasRef = useTemplateRef('wheel'); let canvas = null; let ctx = null; const LineWidth = isMobile ? 2 : 4; // 线条宽度 let slices = 6; // 奖品区域数量默认6 const fontSize = isDialog ? (!isPc() ? Math.round(32/mobCoe.value) : 32) : Math.round(32/mobCoe.value); // 文案大小 let sliceDeg = 360 / slices; const colorList = '#9B6DB3, #B595D0, #D7C1E9, #E3DCF1,#9B6DB3, #B595D0,'.split(','); const prizeTextColor = '#000000'; const ellipseColor = '#54750D'; const lineColor = '#FFFFFF'; let isSpinning = false; let currentAngle = 0; const images = []; onMounted(async () => { if(isDialog){ const closed = drawGetCookie(COOKIE_KEY); lotteryPop.value = !closed; } if(lotteryPop.value){ // 有元素使才绘制 await nextTick(); rotaryHandle(); } // 奖励轮播 rewardCarousel(); document.getElementById('new-active-prize-draw-contentSection').style.visibility = 'visible'; // 显示元素 }); //弹窗埋点上报 function GA4PopFun(title, isWinning) { GA4PushFun( 'lucky_draw_result_popup', { module_name: "lucky draw", promotion_name: lottery.name, promotion_id: lottery.id, title:isWinning ? 'Congratulations on winning the reward--' + title : title } ) } function rotaryHandle() { canvas = canvasRef.value; ctx = canvas.getContext('2d'); slices = lottery.prizeList.length; sliceDeg = 360 / slices; // 预加载图片 lottery.prizeList.forEach((prize, index) => { if(prize.type == 'MISSED') prize.img = "//us.roborock.com/cdn/shop/files/796896641e4d484d20c5fcfa5f429676.png?v=1777341744"; const img = new Image(); img.src = prize.img; img.onload = function() { images[index] = img; // 当所有图片加载完成后绘制转盘 if (images.length === lottery.prizeList.length) { drawWheel(); loadingCanvas.value = false; } }; }); if (lottery.id && ISactiveOpen.value && lotteryPop.value) { console.log('埋点--抽奖模块曝光') //埋点--抽奖模块曝光 GA4PushFun( 'view_luck_draw', { module_name: "lucky draw", promotion_name: lottery.name, promotion_id: lottery.id, } ) } } // 绘制转盘 function drawWheel() { const centerX = canvas.width / 2; const centerY = canvas.height / 2; const radius = canvas.width / 2; const innerRadius = radius - (isDialog ? (!isPc() ? Math.round(48/mobCoe.value) : 48) : Math.round(48/mobCoe.value)); // 内环半径 const dotRadius = radius - (isDialog ? (!isPc() ? Math.round(24/mobCoe.value) : 24) : Math.round(24/mobCoe.value)); // 椭圆点的半径(稍微向外偏移) const startAngleOffset = sliceDeg / 2; // 起始角度偏移,使指针指向第一个奖品的中心 // === 修改点:计算动态缩放因子,使奖品越少,内容越靠近中心 === const scaleFactor = 1 + (8 - slices) * 0.03; const dynamicFontSize = fontSize * scaleFactor; for (let i = 0; i { // 逐行绘制文本 ctx.fillText(line, 0, index * lineHeight); }); // ctx.fillText(lottery.prizeList[i].name, 0, 0); ctx.restore(); ctx.restore(); } // === 画外层的 20 个椭圆点 === for (let i = 0; i = 1) { currentAngle = angle % (2 * Math.PI); if(isWinning){ WinningInformation.value = lottery.prizeList[randomIndex]; if(WinningInformation.value.type == 'MISSED') { //中的是谢谢惠顾的奖项 nowinningText.value = 'Sorry! You don’t win the reward'; nowinningPop.value = true; GA4PopFun(nowinningText.value); return; } //无需登录下:如果非优惠券码,直接打开 如果优惠券码,则判断是否已生成优惠券码 loading if(WinningInformation.value.type == 'COUPON' && !lottery?.isNeedLogin) { winningStatus.value = 'waiting'; getCode(); } winningPop.value = true; GA4PopFun(WinningInformation?.value?.name, true); } isSpinning = false; // onDone && onDone(); // 回调通知 } else { //补充逻辑 isSpinning = false; } } animationId = requestAnimationFrame(animate); return { stop:(num) => { isActive = false; animationId && cancelAnimationFrame(animationId); rotateWheelStop(num); isSpinning = false; } } } function rotateWheelStop (randomIndex) { const offsetRate = 0.1 + Math.random() * 0.4; // 偏移 70% ~ 80% const baseDeg = 360 - ((randomIndex + 1) * sliceDeg); // 扇形起点 const offsetDeg = sliceDeg/2 * offsetRate; // 偏移角度 const targetAngle = (randomIndex { if(data.result == 1){ if(data.data.type == "SUCCESS_PRIZE"){ isWinning = lottery.prizeList.some((item, k) => { if(data.data.prize.id == item.id){ rotateWheeltimer.stop(lottery.defaultPointToPrizeIndex); rotateWheel(k); lottery.restTimes = data.data.restTimes; lottery.userEmailMe = data.data.isEmailMe; token = data.data?.token; return true; } }); }; if(!isWinning){ // 没有返回中奖 lottery.restTimes = data?.data?.restTimes ?? lottery.restTimes; rotateWheeltimer.stop(lottery.defaultPointToPrizeIndex); nowinningText.value = 'Your participation was unsuccessful. Please try again later.'; nowinningPop.value = true; GA4PopFun(nowinningText.value); }; if(data.data.restTimes > 0){ isLotteryAllowed.value = true; }else{ isLotteryAllowed.value = false; }; }else{ InterfaceException(data); rotateWheeltimer.stop(lottery.defaultPointToPrizeIndex); } // 测试 // rotateWheeltimer.stop(); // rotateWheel(1); }, err => { $message(`Lottery failed, please try again later`, 'error'); rotateWheeltimer.stop(lottery.defaultPointToPrizeIndex); nowinningText.value = 'Lottery failed, please try again later'; nowinningPop.value = true; GA4PopFun(nowinningText.value); }); } // 获取抽奖信息 function getActivityInfo() { axios({ method: 'GET', url: '/a/ores/lottery/activity', params: { _: new Date().getTime(), // 去除缓存 id:'17' }, }).then( reque => { let res = reque.data; if(res.result == 1){ lottery.id = res.data.lottery.id; lottery.name = res.data.lottery.name; lottery.subTitle = res.data.lottery.subTitle; lottery.restTimes = res.data.lottery.restTimes; lottery.bgPC = isMobile ? res.data.lottery.bgM : res.data.lottery.bgPC; lottery.rule = res.data.lottery.rule; lottery.costPoints = res.data.lottery.costPoints; lottery.userLimitDaily = res.data.lottery.userLimitDaily; lottery.prizeList = sortHandle(res.data.lottery.prizeList); lottery.isNeedLogin = res.data.lottery.isNeedLogin; //是否需要登陆 lottery.activityEmailMe = res.data.lottery.activityEmailMe; subscribeVal.value = (res.data.lottery.activityEmailMe === 1); lottery.userEmailMe = res.data.lottery.userEmailMe; lottery.subPoints = res.data.lottery.subPoints; lottery.defaultPointToPrizeId = res.data.lottery.defaultPointToPrizeId; //默认奖项id lottery.defaultPointToPrizeIndex = lottery.prizeList.findIndex(item => item.id === lottery.defaultPointToPrizeId); //默认奖项idnex if(lottery.restTimes > 0 && res.data.lottery.prizeEnable){ isLotteryAllowed.value = true; }; getBroadcast(); // 获取广播信息 // getRewardsList(); // 获取奖励订单 ISactiveOpen.value = true; //活动开启 //抽奖弹窗和订阅弹窗互斥,活动开启则关闭订阅弹窗 ISactiveOpen.value && $("#popup-subscribe-modal").get(0)?.close(); if(lotteryPop.value){ // 有元素使才绘制 // await nextTick(); rotaryHandle(); }; }else{ InterfaceException(res); } }, err => { }); // let lotterysss = { // "id" : 1, // "userLimitDaily": 5, //每人每天最多允许抽奖数,看前端是否需要展示给用户 // "prizeList": [ //奖品列表 // { // name: 'Saros 10R', //奖品名称 // img: 'https://cdn.shopify.com/s/files/1/0664/8836/9324/files/prize1.png', //奖品图 // "brief": "", //使用说明 // "url": "", //奖品落地页链接 // "idx": 3, //顺序 // }, // { name: 'Roborock\\nF25 RT', img: 'https://cdn.shopify.com/s/files/1/0664/8836/9324/files/prize2.png' }, // { name: '$100 coupon\\ncode', img: '//cdn.awsusor0.fds.api.mi-img.com/newsroom/46bfc240f2b1c742fa8ceafb3052c570.jpg' }, // { name: 'Accessories', img: 'https://cdn.shopify.com/s/files/1/0664/8836/9324/files/prize4.png' }, // { name: 'Roborock\\n100 points', img: 'https://cdn.shopify.com/s/files/1/0664/8836/9324/files/prize5.png' }, // { name: '六等奖', img: 'https://cdn.awsusor0.fds.api.mi-img.com/newsroom/46bfc240f2b1c742fa8ceafb3052c570.jpg' }, // { name: '七等奖', img: 'https://cdn.shopify.com/s/files/1/0664/8836/9324/files/prize2.png' }, // { name: '八等奖', img: 'https://cdn.shopify.com/s/files/1/0664/8836/9324/files/prize3.png' } // ] // }; // lottery.prizeList = lotterysss.prizeList; }; function sortHandle(data) { return [...data].sort((a, b) => a.idx - b.idx); }; //奖励列表功能 const winninglist = ref([]); let timer = null; const winnIndex = ref(0); const isTransitionEnabled = ref(true) const displayList = computed(() => [...winninglist.value, winninglist.value[0]]); const listStyle = computed(() => ({ transform: `translateY(-${winnIndex.value * (isDialog ? (!isPc()?30:40) : 40)}px)`, transition: !isTransitionEnabled.value ? 'none' : 'transform 0.5s ease-in-out', })); function rewardCarousel() { timer = setInterval(() => { if (winnIndex.value { if(data.result == 1){ winninglist.value = data.data.map(item => { return `${item.user} ${item.prize.replaceAll('\\n', '')}` }); } }, err => { }); }; onBeforeUnmount(() => { clearInterval(timer) }); // 缩小弹层 async function reduceHandle() { lotteryPop.value = !lotteryPop.value; if(lotteryPop.value){ // 有元素使才绘制 await nextTick(); rotaryHandle(); }else{ // 设置本地储蓄 drawSetCookie(COOKIE_KEY, 'true', 1); // 设置1天有效 //埋点--抽奖弹窗关闭 GA4PushFun( 'close_lucky_draw', { module_name: "lucky draw", promotion_name: lottery.name, promotion_id: lottery.id, } ) } } // 关闭弹窗 function closeHandle() { winningPop.value = false; rulesPop.value = false; subscribePop.value = false; rewardsPop.value = false; nowinningPop.value = false; document.body.style.overflow = ''; if(codeTimer){ clearTimeout(codeTimer); codeTimer = null; } } function viewWinningPrizes() { getRewardsList(); closeHandle(); rewardsPop.value = true; }; // 规则页面 function openRules(event) { rulesPop.value = true; //埋点--查看抽奖规则 const buttonName = event.target.textContent.trim(); GA4PushFun( 'view_rules', { module_name: "lucky draw", promotion_name: lottery.name, promotion_id: lottery.id, button_name: buttonName } ) } // 订阅功能 const isSubscribeDisable = ref(true); const isCheck = ref(false); const isSubscriSucces = ref(false); //是否订阅成功 const loadingSub = ref(false); const isFirstSub = ref(false); //是否首次订阅 function openSubscribe(event) { if(isLogin.value){ subscribePop.value = true; //埋点--邮箱订阅入口 const buttonName = event.target.textContent.trim(); GA4PushFun( 'subscribe_entry', { module_name: "lucky draw", promotion_name: lottery.name, promotion_id: lottery.id, button_name: buttonName } ) }else{ window.location.href = loginLink; } } function checkHandle() { isCheck.value = !isCheck.value; if(isCheck.value){ isSubscribeDisable.value = false; }else{ isSubscribeDisable.value = true; } } function SubscribeHandle(event) { if (!isSubscribeDisable.value && !loadingSub.value) { loadingSub.value = true; axios({ method: 'POST', url: '/a/ores/lottery/subscribe', data: { "id": lottery.id, } }).then(({ data }) => { if(data.result == 1){ if(data.data.result == 1){ isSubscriSucces.value = true; isFirstSub.value = true; //埋点--订阅 const buttonName = event.target.textContent.trim(); GA4PushFun( 'subscribe', { module_name: "lucky draw", promotion_name: lottery.name, promotion_id: lottery.id, button_name: buttonName, method: "email", hash_email: localStorage.getItem("hashEmail") || "" } ) }else if(data.data.status == 'REPEAT_SUBSCRIBE'){ $message('You have already subscribed!', 'warning'); isSubscriSucces.value = true; isFirstSub.value = false; //埋点--订阅 const buttonName = event.target.textContent.trim(); GA4PushFun( 'subscribe', { module_name: "lucky draw", promotion_name: lottery.name, promotion_id: lottery.id, button_name: buttonName, method: "email", hash_email: localStorage.getItem("hashEmail") || "" } ) }else{ $message('Subscription failed. Please try again later!', 'error'); }; } setTimeout(() => { loadingSub.value = false; },3000); }, err => { $message('Subscription failed. Please try again later!', 'error'); setTimeout(() => { loadingSub.value = false; },3000); }); } } //非登录订阅按钮 const poicyVal = ref(true);//同意协议 const subscribeVal = ref(false);//接受订阅信息 const emailVal = ref("");//邮箱输入 const showErrorMsg = ref(false);//错误信息 // 输入邮箱,则可以提交订阅信息,判断邮箱格式 function emailChange(val){ let regx = /^[A-Za-z0-9_.-]+@[A-Za-z0-9_.-]+\.[A-Za-z]{2,4}$/; if(regx.test(emailVal.value)) { showErrorMsg.value = false; isLotteryAllowed.value = true; return; } showErrorMsg.value = true; isLotteryAllowed.value = false; } //勾选同意协议,全部勾选则可以提交订阅信息 function ckeckboxPiocy() { if(poicyVal.value && subscribeVal.value){ isLotteryAllowed.value = false; statusbar.value = true; } } // 我的奖励列表功能 const rewardsList = ref([]); function openRewards(event) { getRewardsList(); rewardsPop.value = true; const buttonName = event.target.textContent.trim(); //埋点--我的奖励 GA4PushFun( 'view_my_award', { module_name: "lucky draw", promotion_name: lottery.name, promotion_id: lottery.id, button_name: buttonName } ) } // 我的奖励列表接口 function getRewardsList() { axios({ method: 'POST', url: '/a/ores/lottery/history', data: { "id": lottery.id, } }).then(({ data }) => { if(data.result == 1){ rewardsList.value = data.data.drawList || []; }else{ } }, err => { }); }; const copyText = ref('Copied!'); const isShowCopy = ref(false); // 复制内容 function copyFun(event, prizeCouponCode) { function fallbackCopyTextToClipboard(text, cb) { let textArea = document.createElement("textarea"); textArea.value = text; textArea.style.top = "0"; textArea.style.left = "0"; textArea.style.position = "fixed"; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { var successful = document.execCommand('copy'); successful ? (cb && cb('success')) : (cb && cb('err')); } catch (err) { cb && cb(err); } document.body.removeChild(textArea); } function copyTextToClipboard(text, cb) { if (!navigator.clipboard) { fallbackCopyTextToClipboard(text, cb); return; } navigator.clipboard.writeText(text).then(function() { cb && cb('success'); }, function(err) { cb && cb(err); }); }; //埋点--复制奖品码 const buttonName = event.target.textContent.trim(); GA4PushFun( 'copy_gift_code', { module_name: "lucky draw", promotion_name: lottery.name, promotion_id: lottery.id, button_name: buttonName } ) copyTextToClipboard(prizeCouponCode, (str) => { if(str == 'success'){ $message('Copied!', 'success'); copyText.value = 'Copied!'; console.log('copy success'); }else{ $message('copy failed!', 'error'); copyText.value = 'copy failed!'; } isShowCopy.value = true; setTimeout(()=>{ isShowCopy.value = false; }, 3 * 1000); }); }; // 复制优惠码 function shopNowHandle(event,item) { // 优惠券自动使用 function addDis() { let xhr = new XMLHttpRequest() xhr.open('GET', '/discount/'+item.prizeCouponCode, true); xhr.send(); }; // 复制优惠码以及自动使用 if(item.prizeCouponCode){ copyFun(event, item.prizeCouponCode); addDis(); }else{ if(item.type == 'COUPON'){ $message('Coupons are being distributed, please wait.', 'info'); } }; window.location.href = item.url; }; function InterfaceException(data) { switch(data.result){ case 'ERROR_ACTIVITY_NOT_FOUND': // console.log('活动未开始'); nowinningText.value = 'The activity has not started yet!'; break; case 'ERROR_ACTIVITY_NOT_ENABLE': // console.log('活动未开始'); nowinningText.value = 'The activity has not started yet!'; break; case 'ERROR_ACTIVITY_TIME_EXPIRE': // console.log('活动未开始'); $message('The activity has not started yet!', 'info'); nowinningText.value = 'The activity has not started yet!'; break; case 'ERROR_USER_NOT_ENOUGH_POINTS': // console.log('用户积分不足'); isLotteryAllowed.value = false; $message('Your points are insufficient!', 'info'); nowinningText.value = 'Your points are insufficient!'; break; case 'ERROR_USER_NOT_ENOUGH_TIMES': // console.log('用户次数不足'); isLotteryAllowed.value = false; $message('Insufficient number of lucky draws!', 'info'); nowinningText.value = 'Insufficient number of lucky draws!'; break; case 'ERROR_USER_NEED_LOGIN': // console.log('用户未登录'); $message('Not logged in, please log in and try again!', 'info'); nowinningText.value = 'Not logged in, please log in and try again!'; break; case 'ERROR_PRIZE_EMPTY': // console.log('奖池已空'); $message('Your participation was unsuccessful. Please try again later.', 'info'); nowinningText.value = 'Your participation was unsuccessful. Please try again later.'; break; case "ERROR_IP_NOT_ENOUGH_TIMES": // console.log('ip次数不足'); isLotteryAllowed.value = false; nowinningText.value = "Your participation was unsuccessful, please try again later."; break; case "ERROR_USER_NEED_EMAIL": // console.log('用户邮箱不符合规范'); isLotteryAllowed.value = false; nowinningText.value = "Please provide a valid eamail adress."; break; case "ERROR_EMAIL_REPEAT": // console.log('用户邮箱已被注册'); isLotteryAllowed.value = false; nowinningText.value = "Each email address may participate in the draw only once."; break; default: // 默认情况下执行的代码 $message('Your participation was unsuccessful. Please try again later.', 'info'); nowinningText.value = 'Your participation was unsuccessful. Please try again later.'; } nowinningPop.value = true; GA4PopFun(nowinningText.value); } window.openActivePrizeDraw = function() { if (ISactiveOpen.value) { reduceHandle(); } } //获取优惠券码的接口调用 const winningStatus = ref(''); let codeTimer = null; let token = null; //未登录的token function getCode(){ axios({ method: "POST", url: "/a/ores/lottery/draw/info", data: { token:token }, timeout: 10 * 1000, }).then(({ data })=>{ console.log("success", data); if(data.data?.code && data.result === 1 && data.data?.status === 'success'){ WinningInformation.value.prizeCouponCode = data.data.code; codeTimer && clearTimeout(codeTimer); codeTimer = null; winningStatus.value = data.data?.status; return; }else if(data.data?.status === 'failed' || data.result !== 1){ codeTimer && clearTimeout(codeTimer); codeTimer = null; winningStatus.value = data.data?.status || 'failed'; return; } codeTimer = setTimeout(() => { getCode(); }, 10 * 1000); }).catch((err)=>{ console.log(err); winningStatus.value = 'failed'; codeTimer && clearTimeout(codeTimer); codeTimer = null; }) } // 奖励接口启动 const id = '17'; if(id) getActivityInfo(); const retract = ref(true); function retractHandle() { retract.value = !retract.value; } return { loadingCanvas, loginLink, ISactiveOpen, lotteryPop, winningPop, nowinningPop, nowinningText, rulesPop, subscribePop, rewardsPop, isLotteryAllowed, isLogin, lottery, wheelSize, StartHandle, WinningInformation, displayList, winnIndex, listStyle, handleTransitionEnd, reduceHandle, closeHandle, viewWinningPrizes, openRules, openSubscribe, isSubscribeDisable, isCheck, isSubscriSucces, loadingSub, isFirstSub, checkHandle, SubscribeHandle, openRewards, rewardsList, retract, retractHandle, shopNowHandle, poicyVal, subscribeVal, emailVal, showErrorMsg, emailChange, ckeckboxPiocy, winningStatus, copyFun, copyText, isShowCopy, isDialog } } }); AppVUE3.directive('loading', vLoading) AppVUE3.mount('#new-active-prize-draw-contentSection'); })();
  • Roborock Deals

    Limited-time discounts, up to $800 off

  • Roborock Trade-in Program

    Up to $700 discount

saros-z70

Saros Z70

OmniGrip Foldable 5-Axis Mechanical Arm

22,000 Pa HyperForce® Suction

AI-Powered Customization

7.98cm (3.14 inch) Ultra-Slim Design

Qrevo S Pro

Qrevo S Pro

Multifunctional Dock

18,500 Pa Extreme Suction Power

Anti-Tangle Side Brush

Reactive Tech Obstacle Avoidance

saros-20

Saros 20

AdaptiLift™ Chassis 3.0

StarSight™ Autonomous System 2.0

36,000 Pa HyperForce® Digital Motor

Dual Anti-Tangle System

saros-z70

Saros Z70

OmniGrip Foldable 5-Axis Mechanical Arm

22,000 Pa HyperForce® Suction

AI-Powered Customization

7.98cm (3.14 inch) Ultra-Slim Design

Qrevo S Pro

Qrevo S Pro

Multifunctional Dock

18,500 Pa Extreme Suction Power

Anti-Tangle Side Brush

Reactive Tech Obstacle Avoidance

saros-20

Saros 20

AdaptiLift™ Chassis 3.0

StarSight™ Autonomous System 2.0

36,000 Pa HyperForce® Digital Motor

Dual Anti-Tangle System

saros-z70

Saros Z70

OmniGrip Foldable 5-Axis Mechanical Arm

22,000 Pa HyperForce® Suction

AI-Powered Customization

7.98cm (3.14 inch) Ultra-Slim Design

Qrevo S Pro

Qrevo S Pro

Multifunctional Dock

18,500 Pa Extreme Suction Power

Anti-Tangle Side Brush

Reactive Tech Obstacle Avoidance

saros-20

Saros 20

AdaptiLift™ Chassis 3.0

StarSight™ Autonomous System 2.0

36,000 Pa HyperForce® Digital Motor

Dual Anti-Tangle System

roborock-f25-ultra

Roborock F25 Ultra

VaporFlow™: Engineered for Stubborn Messes & Hygienic Cleaning

WaveFlow™: Built for Greasy Buildup

Elevated 22,000 Pa Suction Power

roborock-f25-ace

Roborock F25 ACE

One-Stroke Wet-and-Dry Cleaning

FlatReach™: From Edges to Underneath

JawScrapers™: Zero-Tangle, Streak-Free Cleaning

SlideTech 2.0: Seamless Maneuverability

roborock f25 rt/gt

Roborock F25 RT/GT

One-Stroke Wet-and-Dry Cleaning

FlatReach™: From Edges to Underneath

JawScrapers™: Zero-Tangle, Streak-Free Cleaning

roborock-f25-ultra

Roborock F25 Ultra

VaporFlow™: Engineered for Stubborn Messes & Hygienic Cleaning

WaveFlow™: Built for Greasy Buildup

Elevated 22,000 Pa Suction Power

roborock-f25-ace

Roborock F25 ACE

One-Stroke Wet-and-Dry Cleaning

FlatReach™: From Edges to Underneath

JawScrapers™: Zero-Tangle, Streak-Free Cleaning

SlideTech 2.0: Seamless Maneuverability

roborock f25 rt/gt

Roborock F25 RT/GT

One-Stroke Wet-and-Dry Cleaning

FlatReach™: From Edges to Underneath

JawScrapers™: Zero-Tangle, Streak-Free Cleaning

roborock-f25-ultra

Roborock F25 Ultra

VaporFlow™: Engineered for Stubborn Messes & Hygienic Cleaning

WaveFlow™: Built for Greasy Buildup

Elevated 22,000 Pa Suction Power

roborock-f25-ace

Roborock F25 ACE

One-Stroke Wet-and-Dry Cleaning

FlatReach™: From Edges to Underneath

JawScrapers™: Zero-Tangle, Streak-Free Cleaning

SlideTech 2.0: Seamless Maneuverability

roborock f25 rt/gt

Roborock F25 RT/GT

One-Stroke Wet-and-Dry Cleaning

FlatReach™: From Edges to Underneath

JawScrapers™: Zero-Tangle, Streak-Free Cleaning

roborock-h60-hub-ultra

Roborock H60 Hub Ultra

Auto-Empty Dock

Strong Suction Power

Long-Lasting Detachable Battery

Anti-Tangle Brush for Floors & Carpets

roborock-h60-ultra

Roborock H60 Ultra

Strong Suction Power

Long-Lasting Detachable Battery

Flexible and Bendable Wand

Anti-Tangle Brush for Floors & Carpets

roborock-h60

Roborock H60

Strong Suction Power

Long-Lasting Detachable Battery

Flexible and Bendable Wand

Anti-Tangle Brush for Floors & Carpets

roborock-h60-hub-ultra

Roborock H60 Hub Ultra

Auto-Empty Dock

Strong Suction Power

Long-Lasting Detachable Battery

Anti-Tangle Brush for Floors & Carpets

roborock-h60-ultra

Roborock H60 Ultra

Strong Suction Power

Long-Lasting Detachable Battery

Flexible and Bendable Wand

Anti-Tangle Brush for Floors & Carpets

roborock-h60

Roborock H60

Strong Suction Power

Long-Lasting Detachable Battery

Flexible and Bendable Wand

Anti-Tangle Brush for Floors & Carpets

roborock-h60-hub-ultra

Roborock H60 Hub Ultra

Auto-Empty Dock

Strong Suction Power

Long-Lasting Detachable Battery

Anti-Tangle Brush for Floors & Carpets

roborock-h60-ultra

Roborock H60 Ultra

Strong Suction Power

Long-Lasting Detachable Battery

Flexible and Bendable Wand

Anti-Tangle Brush for Floors & Carpets

roborock-h60

Roborock H60

Strong Suction Power

Long-Lasting Detachable Battery

Flexible and Bendable Wand

Anti-Tangle Brush for Floors & Carpets

Introducing Saros 20

The Roborock Advantage

Excellent Cleaning Performance

Maintenance-free Docking

Expert Navigation

Customize Your Cleaning

From vacuuming to mopping, Roborock products guarantee to provide industry-leading cleaning solutions. HyperForce® suction effortlessly drags away the hidden dirt and debris on floors and carpets, while the powerful VibraRise® mopping system effectively mops your floors.

Roborock offers a range of smart docking systems, meaning even less for you to do after every cleanup. Options range from intelligent dust-emptying to washing and drying the mop, automatic mop removal, and water tank refilling, depending on your needs.

Every Roborock comes with a precise navigation system, from the PreciSense® LiDAR navigation in the Q series, ReactiveAI 3.0 obstacle avoidance in the Saros 10 and Autonomous StarSight™ System in the Saros 10R for a worry-free cleaning experience.

With the Roborock App, you have total control. You can see real-time cleaning routes, navigate your home through different types of maps, set cleaning schedules, customize maps using No-Go Zones, customize optimal cleaning strategy and so much more. * The Roborock app is not available on the E series.

This is a image
This is a image
This is a image
This is a image