{"id":2570,"date":"2026-10-19T17:47:26","date_gmt":"2026-10-19T15:47:26","guid":{"rendered":"https:\/\/www.bonavenir.ca\/?page_id=2570"},"modified":"2026-10-25T01:37:05","modified_gmt":"2026-10-24T23:37:05","slug":"moving-price-calculator","status":"publish","type":"page","link":"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/","title":{"rendered":"Moving price calculator"},"content":{"rendered":"<h1>Moving price calculator \u2013 Greater Montreal, South Shore and North Shore<\/h1>\n<div class=\"ba-calc-intro\">\n<p class=\"ba-calc-q\"><strong>How much will your move cost?<\/strong><\/p>\n<p>Our calculator gives you an instant estimate based on your route, your type of home, the floor of each home, the number of boxes and the crew you choose.<\/p>\n<p>It only uses the rates published on our <a href=\"\/en\/our-prices\/\">Our prices<\/a> page: $130\/h for 2 movers with a 20-foot truck, and $175\/h for 3 movers with a 30-foot truck, plus one hour of travel. Amounts are shown before taxes, for information only.<\/p>\n<\/div>\n<style id=\"ba-calc-css\">\r\n\/* Calculator page layout (900px) *\/\r\nbody.page-id-2099 #page h1,body.page-id-2570 #page h1{max-width:900px;margin-left:auto!important;margin-right:auto!important;text-align:center!important}\r\n.ba-calc-intro{max-width:900px;margin:10px auto 0;text-align:left;color:#212b36}\r\n.ba-calc-intro p{font-size:18px!important;line-height:1.75!important;margin:0 0 14px!important}\r\n.ba-calc-intro p:last-child{margin-bottom:0!important}\r\n.ba-calc-intro p.ba-calc-q{font-size:21px!important;line-height:1.4!important;margin-bottom:8px!important;color:#183b64}\r\n#page .ba-calc{max-width:900px;background:#f3f6fb;border:1px solid #e1e7f0;border-radius:16px;padding:24px;gap:18px;margin-top:28px}\r\n#page .ba-calc fieldset{background:#fff;border-color:#dfe5ee;border-radius:12px;padding:16px 18px 18px}\r\n#page .ba-calc legend{font-size:15px;font-weight:800;letter-spacing:.05em;color:#183b64;padding:0 8px}\r\n#page .ba-calc label.ba-f{font-size:16px}\r\n#page .ba-calc select,#page .ba-calc input[type=date],#page .ba-calc input[type=number]{font-size:16px;padding:11px 12px;background:#fff}\r\n#page .ba-calc .ba-chip span{font-size:15px}\r\n#page .ba-calc .ba-check{font-size:16px}\r\n#page .ba-calc .ba-note{font-size:15px}\r\n#page .ba-calc .ba-chip span{font-size:16px}\r\n#page .ba-calc .ba-check small,#page .ba-calc .ba-card small{font-size:15px}\r\n#page .ba-calc dl.ba-detail,#page .ba-calc .ba-extras,#page .ba-calc .ba-phone,#page .ba-calc .ba-sub{font-size:16px}\r\n#page .ba-calc .ba-disc{font-size:15px;line-height:1.55}\r\n.ba-calc-infos{max-width:900px;margin:40px auto 0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;text-align:left}\r\n.ba-calc-info{background:#fff;border:1px solid #dfe5ee;border-radius:12px;padding:22px 22px 20px;box-shadow:0 2px 8px rgba(24,59,100,.05)}\r\n.ba-calc-info h2{display:flex;align-items:center;gap:12px;font-size:20px!important;line-height:1.3!important;font-weight:700!important;color:#183b64!important;text-transform:none!important;margin:0 0 10px!important;letter-spacing:0!important}\r\n.ba-calc-info h2::before{content:\"\";flex:0 0 38px;height:38px;border-radius:10px;background-color:#0c24e2;background-position:center;background-repeat:no-repeat;background-size:22px}\r\n.ba-calc-info:nth-child(1) h2::before{background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M7 2h10a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2zM8 6h8v4H8zM8 14h.01M12 14h.01M16 14h.01M8 18h.01M12 18h.01M16 18h.01'\/%3E%3C\/svg%3E\")}\r\n.ba-calc-info:nth-child(2) h2::before{background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 20h5v-5h5v-5h5V5h3'\/%3E%3C\/svg%3E\")}\r\n.ba-calc-info:nth-child(3) h2::before{background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 6h12v10H2zM14 9h4l3 3v4h-7M6.5 19.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4zM17.5 19.5a2 2 0 1 0 0-4 2 2 0 0 0 0 4z'\/%3E%3C\/svg%3E\")}\r\n.ba-calc-info:nth-child(4) h2::before{background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9h12l2 11H4zM9 9a3 3 0 1 1 6 0'\/%3E%3C\/svg%3E\")}\r\n.ba-calc-info:nth-child(5) h2::before{background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 5h16v15H4zM4 10h16M8 3v4M16 3v4'\/%3E%3C\/svg%3E\")}\r\n.ba-calc-info:nth-child(6) h2::before{background-image:url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6L9 17l-5-5'\/%3E%3C\/svg%3E\")}\r\n.ba-calc-info p{font-size:17px!important;line-height:1.7!important;margin:0!important;color:#212b36}\r\nbody.page-id-2099 #ba-faq,body.page-id-2570 #ba-faq{margin-top:40px}\r\nbody.page-id-2099 #ba-faq .container,body.page-id-2570 #ba-faq .container{max-width:900px!important;margin-left:auto!important;margin-right:auto!important;text-align:left}\r\nhtml body.page-id-2099 section#ba-faq h2.ba-faq-titre,html body.page-id-2570 section#ba-faq h2.ba-faq-titre{font-size:26px!important;font-weight:700!important;color:#183b64!important;text-transform:none!important;margin:0 0 16px!important}\r\n#ba-faq details.ba-acc{border:1px solid #dfe5ee;border-radius:10px;background:#fff;margin:0 0 10px;padding:0}\r\n#ba-faq details.ba-acc summary{list-style:none;cursor:pointer;padding:15px 52px 15px 18px;position:relative;display:block}\r\n#ba-faq details.ba-acc summary::-webkit-details-marker{display:none}\r\n#ba-faq details.ba-acc summary h3{margin:0!important;font-size:17px!important;font-weight:700!important;text-transform:none!important;color:#183b64!important;line-height:1.4!important}\r\n#ba-faq details.ba-acc summary::after{content:\"+\";position:absolute;right:18px;top:50%;transform:translateY(-50%);font-size:28px;font-weight:400;color:#0c24e2;line-height:1}\r\n#ba-faq details.ba-acc[open] summary::after{content:\"\\2212\"}\r\n#ba-faq details.ba-acc summary:focus-visible{outline:3px solid #0c24e2;outline-offset:2px;border-radius:10px}\r\n#ba-faq .ba-acc-rep{padding:0 18px 16px}\r\n#ba-faq .ba-acc-rep p{font-size:16px!important;line-height:1.7!important;margin:0 0 8px!important}\r\n#ba-faq .ba-acc-rep p:last-child{margin-bottom:0!important}\r\n\/* 2 colonnes ordinateur *\/\r\n@media (min-width:1100px){\r\nbody.page-id-2099 #page .container,body.page-id-2570 #page .container{display:grid;grid-template-columns:minmax(0,1.42fr) minmax(0,1fr);column-gap:40px;align-items:start;width:min(1260px,calc(100% - 80px))!important;max-width:none!important;margin-left:auto!important;margin-right:auto!important}\r\nbody.page-id-2099 #page .container>*,body.page-id-2570 #page .container>*{grid-column:1}\r\nbody.page-id-2099 #page .container>h1,body.page-id-2570 #page .container>h1{grid-column:1\/-1;grid-row:1;max-width:1000px}\r\nbody.page-id-2099 #page .container>.ba-calc-intro,body.page-id-2570 #page .container>.ba-calc-intro{grid-row:2;max-width:none;margin:10px 0 0}\r\nbody.page-id-2099 #page .container>.ba-calc,body.page-id-2570 #page .container>.ba-calc{grid-row:3;max-width:none;margin:28px 0 0}\r\nbody.page-id-2099 #page .container>.ba-calc-infos,body.page-id-2570 #page .container>.ba-calc-infos{grid-column:2;grid-row:2\/span 2;max-width:none;margin:10px 0 0;grid-template-columns:minmax(0,1fr);gap:18px}\r\n}\r\n@media (max-width:1023px){.ba-calc-infos{width:100%}body.page-id-2099 #ba-faq .container,body.page-id-2570 #ba-faq .container{width:calc(100% - 60px)!important;padding-left:0!important;padding-right:0!important}}\r\n@media (max-width:767px){.ba-calc-intro p{font-size:16px!important;line-height:1.7!important}.ba-calc-intro p.ba-calc-q{font-size:19px!important}#page .ba-calc{padding:14px;border-radius:14px}.ba-calc-infos{grid-template-columns:minmax(0,1fr);gap:16px;margin-top:32px}.ba-calc-info{padding:18px}.ba-calc-info h2{font-size:19px!important}.ba-calc-info p{font-size:16px!important}html body.page-id-2099 section#ba-faq h2.ba-faq-titre,html body.page-id-2570 section#ba-faq h2.ba-faq-titre{font-size:23px!important}body.page-id-2099 #ba-faq,body.page-id-2570 #ba-faq{margin-top:32px}}\r\n.ba-calc{--ba-navy:#183b64;--ba-blue:#0c24e2;--ba-ink:#212b36;--ba-muted:#5b6878;--ba-line:#d6dde7;--ba-soft:#f3f6fb;--ba-warn-bg:#fff4e5;--ba-warn:#7a4300;--ba-star:#d10000;\r\n  font-family:inherit;color:var(--ba-ink);margin:24px auto 32px;display:grid;grid-template-columns:minmax(0,1fr);gap:20px;align-items:start;width:100%;max-width:820px;text-align:left}\r\n.ba-calc *{box-sizing:border-box}\r\n@media (max-width:900px){.ba-calc{grid-template-columns:minmax(0,1fr)}}\r\n.ba-calc form{display:flex;flex-direction:column;gap:14px;margin:0}\r\n.ba-calc fieldset{border:1px solid var(--ba-line);border-radius:10px;background:#fff;margin:0;padding:14px 16px 16px;display:flex;flex-direction:column;gap:12px;min-width:0}\r\n.ba-calc legend{font-weight:700;font-size:13px;letter-spacing:.06em;text-transform:uppercase;color:var(--ba-navy);padding:0 6px}\r\n.ba-calc .ba-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}\r\n@media (max-width:540px){.ba-calc .ba-row{grid-template-columns:minmax(0,1fr)}}\r\n.ba-calc label.ba-f{display:flex;flex-direction:column;gap:5px;font-weight:600;font-size:14px;min-width:0;margin:0}\r\n.ba-calc select,.ba-calc input[type=date],.ba-calc input[type=number]{font:inherit;font-size:15px;color:var(--ba-ink);background:#fff;border:1px solid var(--ba-line);border-radius:7px;padding:9px 11px;width:100%;min-width:0;height:auto;margin:0}\r\n.ba-calc select:focus-visible,.ba-calc input:focus-visible{outline:3px solid var(--ba-blue);outline-offset:1px}\r\n.ba-calc .ba-chips{display:flex;flex-wrap:wrap;gap:6px}\r\n.ba-calc .ba-chip{position:relative;margin:0}\r\n.ba-calc .ba-chip input{position:absolute;opacity:0;inset:0;margin:0;cursor:pointer;width:100%;height:100%}\r\n.ba-calc .ba-chip span{display:inline-block;border:1px solid var(--ba-line);background:#fff;border-radius:999px;padding:6px 13px;font-size:14px;font-weight:600;cursor:pointer;user-select:none}\r\n.ba-calc .ba-chip input:checked+span{background:var(--ba-navy);border-color:var(--ba-navy);color:#fff}\r\n.ba-calc .ba-chip input:focus-visible+span{outline:3px solid var(--ba-blue);outline-offset:2px}\r\n.ba-calc .ba-form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}\r\n@media (max-width:540px){.ba-calc .ba-form-grid{grid-template-columns:minmax(0,1fr)}}\r\n.ba-calc .ba-formule{position:relative;margin:0}\r\n.ba-calc .ba-formule input{position:absolute;opacity:0;inset:0;margin:0;cursor:pointer;width:100%;height:100%}\r\n.ba-calc .ba-formule .ba-card{display:flex;flex-direction:column;gap:2px;border:1.5px solid var(--ba-line);border-radius:9px;padding:10px 12px;background:#fff;cursor:pointer;height:100%;font-size:14px}\r\n.ba-calc .ba-formule .ba-card strong{font-size:16px}\r\n.ba-calc .ba-formule .ba-rate{color:var(--ba-navy);font-weight:700}\r\n.ba-calc .ba-formule .ba-min{font-size:13px;color:var(--ba-muted)}\r\n.ba-calc .ba-formule input:checked+.ba-card{border-color:var(--ba-navy);box-shadow:0 0 0 3px #dfe6f1}\r\n.ba-calc .ba-formule input:disabled+.ba-card{opacity:.45;cursor:not-allowed}\r\n.ba-calc .ba-formule input:focus-visible+.ba-card{outline:3px solid var(--ba-blue);outline-offset:2px}\r\n.ba-calc .ba-check{display:flex;gap:9px;align-items:flex-start;font-size:15px;margin:0;font-weight:400}\r\n.ba-calc .ba-check input{width:18px;height:18px;margin:3px 0 0;accent-color:var(--ba-navy)}\r\n.ba-calc .ba-check small{display:block;color:var(--ba-muted);font-size:13px}\r\n.ba-calc .ba-note{background:var(--ba-soft);border-radius:7px;padding:9px 12px;font-size:14px;margin:0}\r\n.ba-calc .ba-err{color:var(--ba-star);font-size:13px;font-weight:600;margin:4px 0 0}\r\n.ba-calc input[aria-invalid=\"true\"]{border-color:var(--ba-star)}\r\n.ba-calc .ba-dim{opacity:.5}\r\n.ba-calc aside{position:static;width:100%}\r\n@media (max-width:900px){.ba-calc aside{position:static}}\r\n.ba-calc .ba-result{background:var(--ba-navy);color:#fff;border-radius:12px;padding:18px 20px;display:flex;flex-direction:column;gap:10px;scroll-margin-top:110px}\r\n.ba-calc .ba-lbl{text-transform:uppercase;letter-spacing:.1em;font-size:12px;color:#b9c8de;font-weight:700}\r\n.ba-calc .ba-amount{font-weight:700;font-size:30px;line-height:1.1;font-variant-numeric:tabular-nums}\r\n.ba-calc .ba-amount small{font-size:14px;font-weight:600;color:#b9c8de}\r\n.ba-calc .ba-amount.ba-wait{font-size:16px;font-weight:600;color:#d5e0ef}\r\n.ba-calc dl.ba-detail{display:grid;grid-template-columns:auto minmax(0,1fr);gap:3px 12px;font-size:14px;margin:0}\r\n.ba-calc dl.ba-detail dt{color:#b9c8de;margin:0}\r\n.ba-calc dl.ba-detail dd{margin:0}\r\n.ba-calc .ba-pill{display:inline-block;border-radius:999px;padding:1px 8px;font-size:12px;font-weight:700;background:var(--ba-warn-bg);color:var(--ba-warn)}\r\n.ba-calc .ba-extras{display:flex;flex-direction:column;gap:5px;border-top:1px solid rgba(255,255,255,.2);padding-top:9px;font-size:14px}\r\n.ba-calc .ba-extras div{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap}\r\n.ba-calc .ba-alert{background:var(--ba-warn-bg);color:var(--ba-warn);border-radius:7px;padding:8px 11px;font-size:14px}\r\n.ba-calc .ba-alert b{color:var(--ba-star)}\r\n.ba-calc .ba-sub{font-size:14px;color:#d5e0ef}\r\n.ba-calc .ba-sub a,.ba-calc .ba-result a.ba-lnk{color:#fff;text-decoration:underline}\r\n.ba-calc .ba-btn{display:block;width:100%;background:#fff;color:var(--ba-navy);font-weight:700;border:0;border-radius:7px;padding:11px 14px;font-size:15px;cursor:pointer;text-align:center;font-family:inherit}\r\n.ba-calc .ba-btn:hover{background:#e6ecf5}\r\n.ba-calc .ba-btn:focus-visible{outline:3px solid #fff;outline-offset:2px}\r\n.ba-calc .ba-phone{font-size:14px;color:#d5e0ef;text-align:center}\r\n.ba-calc .ba-phone span{color:#fff;font-weight:700;user-select:all}\r\n.ba-calc .ba-disc{font-size:12.5px;color:#b9c8de;border-top:1px solid rgba(255,255,255,.2);padding-top:9px;margin:0}\r\n.ba-calc-bar{display:none}\r\n@media (max-width:900px){\r\n  .ba-calc-bar{position:fixed;left:0;right:0;bottom:0;z-index:999;background:#183b64;color:#fff;display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 16px calc(10px + env(safe-area-inset-bottom,0px));box-shadow:0 -4px 14px rgba(0,0,0,.18);font-family:inherit;transform:translateY(110%);transition:transform .2s}\r\n  .ba-calc-bar.ba-on{transform:none}\r\n  .ba-calc-bar b{display:block;font-size:17px;font-variant-numeric:tabular-nums}\r\n  .ba-calc-bar span{font-size:12px;color:#b9c8de}\r\n  .ba-calc-bar button{background:#fff;color:#183b64;border:0;border-radius:6px;padding:8px 12px;font-weight:700;font-family:inherit;font-size:14px;cursor:pointer;white-space:nowrap}\r\n}\r\n@media (prefers-reduced-motion:reduce){.ba-calc-bar{transition:none}}\r\n<\/style>\r\n<script nowprocket>\r\n(function(){function go(){var f=document.getElementById(\"ba-faq\");if(!f||f.getAttribute(\"data-acc\"))return;f.setAttribute(\"data-acc\",\"1\");var c=f.querySelector(\".container\")||f;[].slice.call(c.querySelectorAll(\"h3\")).forEach(function(h){var d=document.createElement(\"details\");d.className=\"ba-acc\";var s=document.createElement(\"summary\");h.parentNode.insertBefore(d,h);s.appendChild(h);d.appendChild(s);var r=document.createElement(\"div\");r.className=\"ba-acc-rep\";var n=d.nextSibling;while(n&&!(n.nodeType===1&&(n.tagName===\"H3\"||n.tagName===\"DETAILS\"||n.tagName===\"H2\"))){var x=n.nextSibling;r.appendChild(n);n=x;}d.appendChild(r);});}if(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",go);else go();})();\r\n<\/script>\r\n\r\n\r\n<div class=\"ba-calc\" id=\"ba-calc\">\r\n  <form id=\"ba-calc-form\" novalidate>\r\n    <fieldset>\r\n      <legend>Route and date<\/legend>\r\n      <div class=\"ba-row\">\r\n        <label class=\"ba-f\" for=\"ba-depart\">Moving from<select id=\"ba-depart\"><\/select><\/label>\r\n        <label class=\"ba-f\" for=\"ba-arrivee\">Moving to<select id=\"ba-arrivee\"><\/select><\/label>\r\n      <\/div>\r\n      <label class=\"ba-f\" for=\"ba-date\">Moving date<input type=\"date\" id=\"ba-date\"><\/label>\r\n    <\/fieldset>\r\n\r\n    <fieldset>\r\n      <legend>Home<\/legend>\r\n      <div class=\"ba-chips\" role=\"radiogroup\" aria-label=\"Type of home\" id=\"ba-logements\"><\/div>\r\n    <\/fieldset>\r\n\r\n    <fieldset id=\"ba-fs-formule\">\r\n      <legend>Crew and truck<\/legend>\r\n      <div class=\"ba-form-grid\">\r\n        <label class=\"ba-formule\"><input type=\"radio\" name=\"ba-formule\" id=\"ba-f2\" value=\"f2\" checked>\r\n          <span class=\"ba-card\"><strong>2 movers<\/strong><span>20-foot truck<\/span><span class=\"ba-rate\">$130\/h<\/span><span class=\"ba-min\">Minimum 2 h of work + 1 h of travel<\/span><\/span><\/label>\r\n        <label class=\"ba-formule\"><input type=\"radio\" name=\"ba-formule\" id=\"ba-f3\" value=\"f3\">\r\n          <span class=\"ba-card\"><strong>3 movers<\/strong><span>30-foot truck<\/span><span class=\"ba-rate\">$175\/h<\/span><span class=\"ba-min\">Minimum 4 h of work + 1 h of travel<\/span><\/span><\/label>\r\n      <\/div>\r\n      <p class=\"ba-note\" id=\"ba-note-ld\" hidden>For this long-distance route, the published flat rate is based on 2 movers and a 20-foot truck.<\/p>\r\n    <\/fieldset>\r\n\r\n    <fieldset id=\"ba-fs-acces\">\r\n      <legend>Access and volume<\/legend>\r\n      <div class=\"ba-row\">\r\n        <div style=\"display:flex;flex-direction:column;gap:7px;min-width:0\">\r\n          <label class=\"ba-f\" for=\"ba-niv-dep\">Floor at the departure address<select id=\"ba-niv-dep\"><\/select><\/label>\r\n          <label class=\"ba-check\"><input type=\"checkbox\" id=\"ba-asc-dep\"> Elevator available<\/label>\r\n        <\/div>\r\n        <div style=\"display:flex;flex-direction:column;gap:7px;min-width:0\">\r\n          <label class=\"ba-f\" for=\"ba-niv-arr\">Floor at the arrival address<select id=\"ba-niv-arr\"><\/select><\/label>\r\n          <label class=\"ba-check\"><input type=\"checkbox\" id=\"ba-asc-arr\"> Elevator available<\/label>\r\n        <\/div>\r\n      <\/div>\r\n      <div>\r\n        <label class=\"ba-f\" for=\"ba-boites\" style=\"max-width:220px\">Number of boxes\r\n          <input type=\"number\" id=\"ba-boites\" min=\"0\" max=\"300\" step=\"1\" inputmode=\"numeric\" placeholder=\"0\"><\/label>\r\n        <p class=\"ba-err\" id=\"ba-err-boites\" hidden>Enter a number between 0 and 300.<\/p>\r\n      <\/div>\r\n    <\/fieldset>\r\n\r\n    <fieldset>\r\n      <legend>Heavy or special items<\/legend>\r\n      <label class=\"ba-check\"><input type=\"checkbox\" id=\"ba-piano\"><span>Piano<small>From $350<\/small><\/span><\/label>\r\n      <label class=\"ba-check\"><input type=\"checkbox\" id=\"ba-billard\"><span>Pool table<small>From $450<\/small><\/span><\/label>\r\n      <label class=\"ba-check\"><input type=\"checkbox\" id=\"ba-lourds\"><span>Other heavy items (safe, large appliances\u2026)<small>Rate to be confirmed \/ upon quote<\/small><\/span><\/label>\r\n    <\/fieldset>\r\n  <\/form>\r\n\r\n  <aside aria-live=\"polite\">\r\n    <section class=\"ba-result\" id=\"ba-result\" aria-label=\"Estimate\"><\/section>\r\n  <\/aside>\r\n<\/div>\r\n<div class=\"ba-calc-bar\" id=\"ba-calc-bar\" aria-hidden=\"true\"><div><span>Estimate<\/span><b id=\"ba-bar-amount\">\u2014<\/b><\/div><button type=\"button\" id=\"ba-bar-btn\" tabindex=\"-1\">See details<\/button><\/div>\r\n\r\n<script nowprocket>\r\n\/\/ Moteur de calcul \u2014 Calculateur de prix Bon Avenir (version de test)\r\n\/\/ Toutes les valeurs viennent des pages publi\u00e9es \u00ab Nos prix \u00bb, \u00ab D\u00e9m\u00e9nagement r\u00e9sidentiel \u00bb\r\n\/\/ et \u00ab Longue distance \u00bb de bonavenir.ca (relev\u00e9es le 4 octobre 2026).\r\n\r\nconst BA_CONFIG = {\r\n  formules: {\r\n    f2: { libelle: \"2 movers + 20-foot truck\", tarif: 130, minTravail: 2 },\r\n    f3: { libelle: \"3 movers + 30-foot truck\", tarif: 175, minTravail: 4 }\r\n  },\r\n  heureDeplacement: 1, \/\/ 30 min arriv\u00e9e chez le client + 30 min retour au stationnement\r\n\r\n  \/\/ Dur\u00e9es publi\u00e9es (tableau \u00ab Exemple de calcul \u00bb), en heures de travail [min, max]\r\n  durees: {\r\n    studio: { libelle: \"Studio \/ 1\u00bd\", f2: [2, 2],  f3: null },\r\n    \"2.5\":  { libelle: \"2 \u00bd\",     f2: [2, 3],  f3: null },\r\n    \"3.5\":  { libelle: \"3 \u00bd\",     f2: [3, 4],  f3: [3, 4] },\r\n    \"4.5\":  { libelle: \"4 \u00bd\",     f2: [4, 5],  f3: [3, 5] },\r\n    \"5.5\":  { libelle: \"5 \u00bd\",     f2: [5, 6],  f3: [4, 5] },\r\n    \"6.5\":  { libelle: \"6 \u00bd\",     f2: [6, 7],  f3: [5, 6] },\r\n    maison: { libelle: \"House\",  f2: [7, 14], f3: [6, 12] }\r\n  },\r\n\r\n  piano: 350,   \/\/ \u00ab \u00e0 partir de \u00bb\r\n  billard: 450, \/\/ \u00ab \u00e0 partir de \u00bb\r\n\r\n  \/\/ Forfaits longue distance publi\u00e9s (2 movers + 20-foot truck, au d\u00e9part du Grand Montr\u00e9al)\r\n  longueDistance: {\r\n    \"Qu\u00e9bec\":         [1500, 2500],\r\n    \"Gatineau\":       [1550, 2500],\r\n    \"Ottawa\":         [1550, 2500],\r\n    \"Mont-Tremblant\": [700, 1500],\r\n    \"Sherbrooke\":     [1550, 2250],\r\n    \"Trois-Rivi\u00e8res\": [1300, 1850],\r\n    \"Gasp\u00e9\":          [2900, 3800],\r\n    \"Toronto\":        [2500, 3500]\r\n  },\r\n\r\n    hauteSaison: { debut: [6, 15], fin: [7, 10] } \/\/ du 15 juin au 10 juillet inclusivement (choix de Bon Avenir)\r\n};\r\n\r\n\/\/ Villes desservies = pages \/ville\/ du site (hors pages \u00ab Montr\u00e9al vers\u2026 \u00bb)\r\nconst BA_VILLES = {\r\n  \"Montr\u00e9al\": [\"Montr\u00e9al\", \"Anjou\", \"C\u00f4te-des-Neiges\", \"C\u00f4te-Saint-Luc\", \"Dollard-des-Ormeaux\", \"Dorval\",\r\n    \"Hampstead\", \"Hochelaga-Maisonneuve\", \"\u00cele-des-S\u0153urs\", \"Kirkland\", \"Lachine\", \"LaSalle\",\r\n    \"Le Plateau-Mont-Royal\", \"Mont-Royal\", \"Montr\u00e9al-Est\", \"Montr\u00e9al-Nord\", \"Montr\u00e9al-Ouest\",\r\n    \"Notre-Dame-de-Gr\u00e2ce\", \"Outremont\", \"Parc-Extension\", \"Pierrefonds\", \"Pointe-aux-Trembles\",\r\n    \"Pointe-Claire\", \"Rivi\u00e8re-des-Prairies\", \"Rosemont\", \"Saint-L\u00e9onard\", \"Saint-Michel\",\r\n    \"Sainte-Anne-de-Bellevue\", \"Sainte-Genevi\u00e8ve\", \"Senneville\", \"Verdun\", \"Ville-Marie\", \"Westmount\"],\r\n  \"South Shore\": [\"Beloeil\", \"Boucherville\", \"Brossard\", \"Candiac\", \"Chambly\", \"Ch\u00e2teauguay\", \"Delson\",\r\n    \"Greenfield Park\", \"La Prairie\", \"Longueuil\", \"Saint-Amable\", \"Saint-Bruno-de-Montarville\",\r\n    \"Saint-Constant\", \"Saint-Hubert\", \"Saint-Jean-sur-Richelieu\", \"Saint-Lambert\", \"Sainte-Catherine\",\r\n    \"Sainte-Julie\", \"Varennes\", \"McMasterville\", \"Mont-Saint-Hilaire\", \"Otterburn Park\", \"Saint-Hyacinthe\"],\r\n  \"Laval and North Shore\": [\"Laval\", \"Chomedey\", \"Blainville\", \"Boisbriand\", \"Charlemagne\", \"Deux-Montagnes\",\r\n    \"Lachenaie\", \"Lorraine\", \"Mascouche\", \"Mirabel\", \"Repentigny\", \"Rosem\u00e8re\", \"Saint-Eustache\",\r\n    \"Sainte-Th\u00e9r\u00e8se\", \"Terrebonne\"]\r\n};\r\n\r\nconst BA_ZONE = new Set(Object.values(BA_VILLES).flat());\r\n\r\nfunction baArrondiDemi(h) { return Math.round(h * 2) \/ 2; }\r\n\r\n\/\/ Points d'acc\u00e8s par adresse (servent uniquement \u00e0 se placer dans la fourchette d'heures publi\u00e9e)\r\n\/\/ Rez-de-chauss\u00e9e 0 \u00b7 sous-sol 1 \u00b7 1er 1 \u00b7 2e 2 \u00b7 3e 3 \u00b7 4e et 5e ou plus 4 \u00b7 avec ascenseur (hors rez-de-chauss\u00e9e) 1\r\nconst BA_NIVEAUX = [[\"ss\",\"Basement\"],[\"rdc\",\"Ground floor\"],[\"1\",\"1 floor up\"],[\"2\",\"2 floors up\"],[\"3\",\"3 floors up\"],[\"4\",\"4 floors up\"],[\"5\",\"5 floors up or more\"]];\r\nconst BA_POINTS_NIVEAU = { rdc: 0, ss: 1, \"1\": 1, \"2\": 2, \"3\": 3, \"4\": 4, \"5\": 4 };\r\nfunction baPointsAdresse(niveau, ascenseur) {\r\n  const p = BA_POINTS_NIVEAU[niveau] ?? 0;\r\n  if (p === 0) return 0;\r\n  return ascenseur ? 1 : p;\r\n}\r\n\/\/ Number of boxes \u2192 points (usage interne uniquement, jamais affich\u00e9 au client)\r\n\/\/ [jusqu'\u00e0 X bo\u00eetes = 0 point, \u00e0 partir de Y bo\u00eetes = 4 points, entre les deux = 2 points]\r\nconst BA_SEUILS_BOITES = { studio: [10, 20], \"2.5\": [15, 25], \"3.5\": [20, 35], \"4.5\": [30, 45], \"5.5\": [40, 60], \"6.5\": [50, 75], maison: [60, 100] };\r\nconst BA_BOITES_MAX = 300;\r\nfunction baPointsBoites(logement, n) {\r\n  const s = BA_SEUILS_BOITES[logement]; const v = Math.max(0, Math.min(BA_BOITES_MAX, Math.floor(Number(n) || 0)));\r\n  if (!s) return 0;\r\n  return v <= s[0] ? 0 : (v >= s[1] ? 4 : 2);\r\n}\r\nconst BA_POINTS_MAX = 12; \/\/ 4 + 4 + 4\r\n\r\nfunction baEstHauteSaison(dateStr) {\r\n  if (!dateStr) return false;\r\n  const [, m, j] = dateStr.split(\"-\").map(Number);\r\n  const v = m * 100 + j;\r\n  const { debut, fin } = BA_CONFIG.hauteSaison;\r\n  return v >= debut[0] * 100 + debut[1] && v <= fin[0] * 100 + fin[1];\r\n}\r\n\r\n\/\/ Fourchette d'heures de travail selon la position (0 = le plus simple, 1 = le plus exigeant)\r\nfunction baFourchetteHeures(hmin, hmax, position) {\r\n  const span = hmax - hmin;\r\n  let bas, haut, bande;\r\n  if (position < 1 \/ 3)      { bas = hmin;            haut = hmin + span \/ 2; bande = \"bas\"; }\r\n  else if (position < 2 \/ 3) { bas = hmin + span \/ 4; haut = hmax - span \/ 4; bande = \"milieu\"; }\r\n  else                       { bas = hmin + span \/ 2; haut = hmax;            bande = \"haut\"; }\r\n  \/\/ \u00c0 la demi-heure pr\u00e8s, toujours \u00e0 l'int\u00e9rieur des dur\u00e9es publi\u00e9es\r\n  bas = Math.max(hmin, Math.floor(bas * 2) \/ 2);\r\n  haut = Math.min(hmax, Math.ceil(haut * 2) \/ 2);\r\n  return { bas, haut, bande };\r\n}\r\n\r\nfunction baCalculer(e) {\r\n  const out = { type: null, lignes: [], avertissements: [], notes: [] };\r\n  const depZone = BA_ZONE.has(e.depart);\r\n  const arrZone = BA_ZONE.has(e.arrivee);\r\n  const arrLD = Object.prototype.hasOwnProperty.call(BA_CONFIG.longueDistance, e.arrivee);\r\n\r\n  if (!e.depart || !e.arrivee || !e.logement) { out.type = \"incomplet\"; return out; }\r\n\r\n  \/\/ Objets sp\u00e9ciaux (communs local \/ longue distance)\r\n  const extras = [];\r\n  if (e.piano) extras.push({ libelle: \"Piano\", texte: \"from $\" + BA_CONFIG.piano, montant: BA_CONFIG.piano });\r\n  if (e.billard) extras.push({ libelle: \"Pool table\", texte: \"from $\" + BA_CONFIG.billard, montant: BA_CONFIG.billard });\r\n  if (e.autresLourds) extras.push({ libelle: \"Other heavy items\", texte: \"Rate to be confirmed \/ upon quote\", montant: null });\r\n  out.extras = extras;\r\n\r\n  if (baEstHauteSaison(e.date)) out.avertissements.push(\"Rate to be confirmed depending on the date.\");\r\n\r\n  \/\/ Longue distance publi\u00e9e\r\n  if (depZone && arrLD) {\r\n    const [min, max] = BA_CONFIG.longueDistance[e.arrivee];\r\n    out.type = \"longue-distance\";\r\n    out.min = min; out.max = max;\r\n    out.notes.push(\"Published flat rate Montr\u00e9al \u2192 \" + e.arrivee + \" for 2 movers + 20-foot truck. The exact amount depends on the volume.\");\r\n    if (e.formule === \"f3\") out.notes.push(\"The 3-mover option for long distance: upon quote.\");\r\n    return out;\r\n  }\r\n\r\n  \/\/ Hors des cas publi\u00e9s\r\n  if (!depZone || !(arrZone || arrLD)) {\r\n    out.type = \"soumission\";\r\n    out.raison = !depZone && arrLD\r\n      ? \"Our published long-distance flat rates start from Greater Montreal. A quote is required for this route.\"\r\n      : \"This route is not covered by our published rates. A quote is required.\";\r\n    return out;\r\n  }\r\n\r\n  \/\/ Local\r\n  const d = BA_CONFIG.durees[e.logement];\r\n  const f = BA_CONFIG.formules[e.formule];\r\n  const plage = d[e.formule];\r\n  if (!plage) {\r\n    out.type = \"formule-indisponible\";\r\n    out.raison = \"The \u201c\" + f.libelle + \"\u201d option is not available for a \" + d.libelle + \".\";\r\n    return out;\r\n  }\r\n  const points = baPointsAdresse(e.etagesDepart, e.ascenseurDepart)\r\n               + baPointsAdresse(e.etagesArrivee, e.ascenseurArrivee)\r\n               + baPointsBoites(e.logement, e.nbBoites);\r\n  const position = points \/ BA_POINTS_MAX;\r\n  const fh = baFourchetteHeures(plage[0], plage[1], position);\r\n  const hBas = Math.max(fh.bas, f.minTravail);\r\n  const hHaut = Math.max(fh.haut, f.minTravail);\r\n  const dep = BA_CONFIG.heureDeplacement;\r\n\r\n  out.type = \"local\";\r\n  out.formule = f.libelle;\r\n  out.tarif = f.tarif;\r\n  out.plagePubliee = plage;\r\n  out.position = position;\r\n  out.bande = fh.bande;\r\n  out.heuresTravail = [hBas, hHaut];\r\n  out.minAppliqu\u00e9 = fh.bas < f.minTravail || fh.haut < f.minTravail;\r\n  out.min = (hBas + dep) * f.tarif;\r\n  out.max = (hHaut + dep) * f.tarif;\r\n\r\n  \/\/ Comparaison avec l'autre formule (m\u00eames r\u00e8gles)\r\n  const autreCle = e.formule === \"f2\" ? \"f3\" : \"f2\";\r\n  const autre = BA_CONFIG.formules[autreCle];\r\n  const plageAutre = d[autreCle];\r\n  if (plageAutre) {\r\n    const fa = baFourchetteHeures(plageAutre[0], plageAutre[1], position);\r\n    const a1 = Math.max(fa.bas, autre.minTravail), a2 = Math.max(fa.haut, autre.minTravail);\r\n    out.comparaison = { formule: autre.libelle, min: (a1 + dep) * autre.tarif, max: (a2 + dep) * autre.tarif };\r\n  }\r\n  return out;\r\n}\r\n<\/script>\r\n<script nowprocket>\r\n(function(){\r\nfunction init(){\r\n  var $ = function(id){ return document.getElementById(id); };\r\n  if(!$(\"ba-calc-form\")) return;\r\n  var fmt = function(n){ return \"$\" + n.toLocaleString(\"en-CA\", Number.isInteger(n) ? {maximumFractionDigits:0} : {minimumFractionDigits:2, maximumFractionDigits:2}); };\r\n  var fh = function(h){ return String(h); };\r\n  var track = function(name, params){ try { if (typeof window.gtag === \"function\") window.gtag(\"event\", name, params || {}); } catch(e){} };\r\n\r\n  function opt(v,t){ var e=document.createElement(\"option\"); e.value=v; e.textContent=(t==null?v:t); return e; }\r\n  function remplirVilles(sel, avecLD){\r\n    sel.appendChild(opt(\"\", \"Choose a city\"));\r\n    Object.keys(BA_VILLES).forEach(function(region){\r\n      var g=document.createElement(\"optgroup\"); g.label=region;\r\n      BA_VILLES[region].slice().sort(function(a,b){return a.localeCompare(b,\"fr\");}).forEach(function(v){ g.appendChild(opt(v)); });\r\n      sel.appendChild(g);\r\n    });\r\n    if(avecLD){ var g=document.createElement(\"optgroup\"); g.label=\"Long distance\"; Object.keys(BA_CONFIG.longueDistance).forEach(function(v){ g.appendChild(opt(v)); }); sel.appendChild(g); }\r\n    var a=document.createElement(\"optgroup\"); a.label=\"Elsewhere\"; a.appendChild(opt(\"__autre__\",\"Other city\")); sel.appendChild(a);\r\n  }\r\n  remplirVilles($(\"ba-depart\"), false);\r\n  remplirVilles($(\"ba-arrivee\"), true);\r\n  Object.keys(BA_CONFIG.durees).forEach(function(k){\r\n    var l=document.createElement(\"label\"); l.className=\"ba-chip\";\r\n    var i=document.createElement(\"input\"); i.type=\"radio\"; i.name=\"ba-logement\"; i.value=k; i.id=\"ba-log-\"+k.replace(\".\",\"_\");\r\n    var s=document.createElement(\"span\"); s.textContent=BA_CONFIG.durees[k].libelle;\r\n    l.appendChild(i); l.appendChild(s); $(\"ba-logements\").appendChild(l);\r\n  });\r\n  [\"ba-niv-dep\",\"ba-niv-arr\"].forEach(function(id){ BA_NIVEAUX.forEach(function(n){ var o=opt(n[0],n[1]); if(n[0]===\"rdc\") o.selected=true; $(id).appendChild(o); }); });\r\n\r\n  \/\/ R\u00e9ponses venant de l'accueil (#de=\u2026&a=\u2026&date=\u2026&logement=\u2026)\r\n  (function(){\r\n    if(!location.hash || location.hash.length<2) return;\r\n    var p={}; location.hash.slice(1).split(\"&\").forEach(function(kv){ var i=kv.indexOf(\"=\"); if(i>0){ try{ p[kv.slice(0,i)]=decodeURIComponent(kv.slice(i+1).replace(\/\\+\/g,\" \")); }catch(e){} } });\r\n    var setSel=function(sel,v){ if(v && [].some.call(sel.options,function(o){return o.value===v;})) sel.value=v; };\r\n    setSel($(\"ba-depart\"), p.de); setSel($(\"ba-arrivee\"), p.a);\r\n    if(p.date && \/^\\d{4}-\\d{2}-\\d{2}$\/.test(p.date)) $(\"ba-date\").value=p.date;\r\n    if(p.logement && BA_CONFIG.durees[p.logement]){ var r=$(\"ba-log-\"+p.logement.replace(\".\",\"_\")); if(r) r.checked=true; }\r\n  })();\r\n\r\n  var val=function(n){ var e=document.querySelector('input[name=\"'+n+'\"]:checked'); return e?e.value:undefined; };\r\n  function lire(){\r\n    return { depart:$(\"ba-depart\").value, arrivee:$(\"ba-arrivee\").value, date:$(\"ba-date\").value,\r\n      logement:val(\"ba-logement\"), formule:val(\"ba-formule\"),\r\n      etagesDepart:$(\"ba-niv-dep\").value, ascenseurDepart:$(\"ba-asc-dep\").checked,\r\n      etagesArrivee:$(\"ba-niv-arr\").value, ascenseurArrivee:$(\"ba-asc-arr\").checked,\r\n      nbBoites:$(\"ba-boites\").value, piano:$(\"ba-piano\").checked, billard:$(\"ba-billard\").checked, autresLourds:$(\"ba-lourds\").checked };\r\n  }\r\n  var DISC=\"Indicative estimate before taxes, based on our published rates. This is not a guaranteed final price: the final price must be confirmed by D\u00e9m\u00e9nagement Bon Avenir in your quote.\";\r\n  var dernier=null, dernierE=null, estimationSuivie=false;\r\n\r\n  function rendre(interaction){\r\n    var e=lire();\r\n    var nb=$(\"ba-boites\").value.trim(), nbv=Number(nb);\r\n    var invalide = nb!==\"\" && (!Number.isInteger(nbv) || nbv<0 || nbv>300);\r\n    $(\"ba-err-boites\").hidden=!invalide; $(\"ba-boites\").setAttribute(\"aria-invalid\", invalide?\"true\":\"false\");\r\n    var d3=e.logement && BA_CONFIG.durees[e.logement].f3;\r\n    $(\"ba-f3\").disabled = !!e.logement && !d3;\r\n    if(e.logement && !d3 && e.formule===\"f3\"){ $(\"ba-f2\").checked=true; e.formule=\"f2\"; }\r\n    var html, barTxt=\"\u2014\";\r\n    if(invalide){\r\n      html='<span class=\"ba-lbl\">Estimate<\/span><div class=\"ba-amount ba-wait\">Check the number of boxes (between 0 and 300).<\/div>';\r\n      dernier=null;\r\n    } else {\r\n      var r=baCalculer(e); dernier=r; dernierE=e;\r\n      var ld=r.type===\"longue-distance\";\r\n      $(\"ba-note-ld\").hidden=!ld;\r\n      $(\"ba-fs-acces\").classList.toggle(\"ba-dim\", ld);\r\n      var extras=(r.extras||[]).map(function(x){ return '<div><span>+ '+x.libelle+'<\/span><span>'+x.texte+'<\/span><\/div>'; }).join(\"\");\r\n      var alerts=(r.avertissements||[]).map(function(a){ return '<div class=\"ba-alert\"><b>\u2605<\/b> '+a+'<\/div>'; }).join(\"\");\r\n      var cta='<button type=\"button\" class=\"ba-btn\" id=\"ba-cta\">Request my quote<\/button><div class=\"ba-phone\">or by phone: <span>514-703-6147<\/span><\/div>';\r\n      if(r.type===\"incomplet\"){\r\n        html='<span class=\"ba-lbl\">Estimate<\/span><div class=\"ba-amount ba-wait\">Choose both cities and your type of home.<\/div>';\r\n      } else if(r.type===\"soumission\" || r.type===\"formule-indisponible\"){\r\n        html='<span class=\"ba-lbl\">Estimate<\/span><div class=\"ba-amount\">Quote required<\/div><p class=\"ba-sub\" style=\"margin:0\">'+r.raison+'<\/p>'+(extras?'<div class=\"ba-extras\">'+extras+'<\/div>':'')+alerts+cta;\r\n        barTxt=\"Quote required\";\r\n      } else {\r\n        var montant = r.min===r.max ? fmt(r.min) : fmt(r.min)+\" to \"+fmt(r.max);\r\n        barTxt=montant;\r\n        var detail;\r\n        if(r.type===\"local\"){\r\n          var h1=r.heuresTravail[0], h2=r.heuresTravail[1];\r\n          detail='<dl class=\"ba-detail\"><dt>Option<\/dt><dd>'+r.formule+'<\/dd><dt>Rate<\/dt><dd>$'+r.tarif+'\/h<\/dd><dt>Work<\/dt><dd>'+(h1===h2?fh(h1)+' h':fh(h1)+' to '+fh(h2)+' h')+(r.minAppliqu\u00e9?' <span class=\"ba-pill\">minimum applied<\/span>':'')+'<\/dd><dt>Travel<\/dt><dd>+ 1 h<\/dd><\/dl>';\r\n        } else {\r\n          detail='<dl class=\"ba-detail\"><dt>Route<\/dt><dd>Montr\u00e9al \u2192 '+e.arrivee+'<\/dd><dt>Option<\/dt><dd>2 movers + 20-foot truck<\/dd><\/dl><div class=\"ba-sub\"><a href=\"\/en\/services\/long-distance-moving\/\">See our long-distance flat rates<\/a><\/div>';\r\n        }\r\n        var cmp = r.comparaison ? '<div class=\"ba-sub\">With '+r.comparaison.formule.toLowerCase()+': <b>'+(r.comparaison.min===r.comparaison.max?fmt(r.comparaison.min):fmt(r.comparaison.min)+' to '+fmt(r.comparaison.max))+'<\/b><\/div>' : '';\r\n        html='<span class=\"ba-lbl\">'+(ld?'Published long-distance flat rate':'Estimate')+'<\/span><div class=\"ba-amount\">'+montant+' <small>before taxes<\/small><\/div>'+detail+(extras?'<div class=\"ba-extras\">'+extras+'<\/div>':'')+alerts+cmp+cta+'<div class=\"ba-sub\"><a href=\"\/en\/our-prices\/\">See all our rates<\/a><\/div>';\r\n      }\r\n      if(interaction && !estimationSuivie && r.type!==\"incomplet\"){ estimationSuivie=true; track(\"calculateur_estimation\",{type_resultat:r.type, logement:e.logement||\"\"}); }\r\n    }\r\n    $(\"ba-result\").innerHTML=html+'<p class=\"ba-disc\">'+DISC+'<\/p>';\r\n    $(\"ba-bar-amount\").textContent=barTxt;\r\n    var c=$(\"ba-cta\"); if(c) c.addEventListener(\"click\", demander);\r\n  }\r\n\r\n  \/\/ Pr\u00e9remplissage du formulaire de soumission existant (Fluent Forms)\r\n  var NIV={}; BA_NIVEAUX.forEach(function(n){ NIV[n[0]]=n[1]; });\r\n  function resume(e,r){\r\n    var lg=BA_CONFIG.durees[e.logement]?BA_CONFIG.durees[e.logement].libelle:\"\";\r\n    var dt=e.date?e.date.split(\"-\").reverse().join(\".\"):\"not specified\";\r\n    var ville=function(v){ return v===\"__autre__\"?\"Other city (to be specified)\":v; };\r\n    var objets=[]; if(e.piano) objets.push(\"piano\"); if(e.billard) objets.push(\"pool table\"); if(e.autresLourds) objets.push(\"other heavy items\");\r\n    var est;\r\n    if(r.type===\"local\"||r.type===\"longue-distance\"){\r\n      est=(r.min===r.max?fmt(r.min):fmt(r.min)+\" to \"+fmt(r.max))+\" before taxes\";\r\n      (r.extras||[]).forEach(function(x){ est+=\", + \"+x.libelle.toLowerCase()+\" \"+x.texte; });\r\n      if((r.avertissements||[]).length) est+=\" (rate to be confirmed depending on the date)\";\r\n    } else { est=\"Quote required\"; }\r\n    var equipe = r.type===\"longue-distance\" ? \"2 movers + 20-foot truck (published long-distance flat rate)\" : BA_CONFIG.formules[e.formule].libelle+\" ($\"+BA_CONFIG.formules[e.formule].tarif+\"\/h)\";\r\n    var asc=function(b){ return b?\"with elevator\":\"without elevator\"; };\r\n    return [\"Bon Avenir calculator estimate\",\r\n      \"Route: \"+ville(e.depart)+\" \u2192 \"+ville(e.arrivee),\r\n      \"Date: \"+dt,\r\n      \"Home: \"+lg,\r\n      \"Crew: \"+equipe,\r\n      \"Floor at departure: \"+(NIV[e.etagesDepart]||\"\")+\", \"+asc(e.ascenseurDepart),\r\n      \"Floor at arrival: \"+(NIV[e.etagesArrivee]||\"\")+\", \"+asc(e.ascenseurArrivee),\r\n      \"Number of boxes: \"+(e.nbBoites===\"\"?\"not specified\":e.nbBoites),\r\n      \"Special items: \"+(objets.length?objets.join(\", \"):\"none\"),\r\n      \"Displayed estimate: \"+est,\r\n      \"(indicative estimate, final price to be confirmed by Bon Avenir)\",\r\n      \"\",\r\n      \"Your details: \"].join(\"\\n\");\r\n  }\r\n  function setVal(el,v){ if(!el) return; el.value=v; el.dispatchEvent(new Event(\"input\",{bubbles:true})); el.dispatchEvent(new Event(\"change\",{bubbles:true})); }\r\n  function cocher(name,value){ var r=document.querySelector('#fluentform_3 input[name=\"'+name+'\"][value=\"'+value+'\"]'); if(r && !r.checked){ r.click(); } }\r\n  var demandeFaite=false;\r\n  function demander(){\r\n    var e=dernierE, r=dernier; if(!e||!r) return;\r\n    track(\"calculateur_demande_soumission\",{type_resultat:r.type, logement:e.logement||\"\"});\r\n    \/* Suite de la demande sur la page Soumission gratuite, avec les informations du calculateur *\/\r\n    try{ sessionStorage.setItem(\"ba_soum\", JSON.stringify({v:1,t:Date.now(),src:\"calc\",e:e,resume:resume(e,r)})); }catch(x){}\r\n    location.href = location.pathname.indexOf(\"\/en\/\")===0 ? \"\/en\/free-quote\/\" : \"\/soumission-gratuite\/\";\r\n    return;\r\n    var f=document.getElementById(\"fluentform_3\");\r\n    if(!f){ location.href=\"\/en\/contact\/\"; return; }\r\n    var ville=function(v){ return v===\"__autre__\"?\"\":v; };\r\n    setVal(f.querySelector('[name=\"address_1[city]\"]'), ville(e.depart));\r\n    setVal(f.querySelector('[name=\"address_2[city]\"]'), ville(e.arrivee));\r\n    if(e.date){ var p=e.date.split(\"-\"); var dEl=f.querySelector('[name=\"datetime\"]');\r\n      if(dEl && dEl._flatpickr){ dEl._flatpickr.setDate(new Date(+p[0],+p[1]-1,+p[2]), true); } else { setVal(dEl, p[2]+\".\"+p[1]+\".\"+p[0]); } }\r\n    if(e.logement===\"maison\") cocher(\"input_radio\",\"House\");\r\n    cocher(\"input_radio_1\", (e.piano||e.billard||e.autresLourds) ? \"yes\" : \"no\");\r\n    setVal(f.querySelector('[name=\"description\"]'), resume(e,r));\r\n    demandeFaite=true;\r\n    f.scrollIntoView({behavior: matchMedia(\"(prefers-reduced-motion: reduce)\").matches ? \"auto\" : \"smooth\", block:\"start\"});\r\n    var nom=f.querySelector('[name=\"names[first_name]\"]'); if(nom) setTimeout(function(){ nom.focus({preventScroll:true}); }, 400);\r\n  }\r\n  if(window.jQuery){ window.jQuery(document).on(\"fluentform_submission_success\", function(ev, data){ if(demandeFaite) track(\"calculateur_soumission_envoyee\",{}); }); }\r\n\r\n  var form=$(\"ba-calc-form\");\r\n  form.addEventListener(\"input\", function(){ rendre(true); });\r\n  form.addEventListener(\"change\", function(){ rendre(true); });\r\n  form.addEventListener(\"submit\", function(ev){ ev.preventDefault(); });\r\n  form.addEventListener(\"change\", function(){ if(dernierE && dernier){ try{ sessionStorage.setItem(\"ba_soum\", JSON.stringify({v:1,t:Date.now(),src:\"calc\",e:dernierE,resume:resume(dernierE,dernier)})); }catch(x){} } });\r\n  rendre(!!location.hash);\r\n\r\n  \/\/ Barre d'estimation fixe sur mobile\r\n  if(\"IntersectionObserver\" in window){\r\n    var bar=$(\"ba-calc-bar\"), formVis=false, resVis=false;\r\n    var maj=function(){ bar.classList.toggle(\"ba-on\", formVis && !resVis); };\r\n    new IntersectionObserver(function(en){ en.forEach(function(x){ formVis=x.isIntersecting; }); maj(); }).observe(form);\r\n    new IntersectionObserver(function(en){ en.forEach(function(x){ resVis=x.isIntersecting; }); maj(); }).observe($(\"ba-result\"));\r\n    $(\"ba-bar-btn\").addEventListener(\"click\", function(){ $(\"ba-result\").scrollIntoView({behavior:\"smooth\", block:\"start\"}); });\r\n  }\r\n}\r\nif(document.readyState===\"loading\") document.addEventListener(\"DOMContentLoaded\", init); else init();\r\n})();\r\n<\/script>\n<div class=\"ba-calc-infos\">\n<div class=\"ba-calc-info\">\n<h2>How the estimate is calculated<\/h2>\n<p>The calculator starts from the published duration for your type of home, applies the minimum number of hours for the selected option (2 h for 2 movers, 4 h for 3 movers), adds one hour of travel, then multiplies the total by the hourly rate.<\/p>\n<\/div>\n<div class=\"ba-calc-info\">\n<h2>What affects your estimate<\/h2>\n<p>The floor of each home, the presence of an elevator and the number of boxes place your move within the published duration. They add no extra fees: a ground-floor home with few boxes simply falls at the low end of the range. To learn more about our service, see our <a href=\"\/en\/services\/residential-moving\/\">Residential moving<\/a> page.<\/p>\n<\/div>\n<div class=\"ba-calc-info\">\n<h2>Long-distance moving<\/h2>\n<p>For Qu\u00e9bec, Gatineau, Ottawa, Mont-Tremblant, Sherbrooke, Trois-Rivi\u00e8res, Gasp\u00e9 and Toronto, the calculator shows our published flat rates from Greater Montreal. For any other destination, or for a move in the opposite direction, a quote is required. See our <a href=\"\/en\/services\/long-distance-moving\/\">long-distance flat rates<\/a>.<\/p>\n<\/div>\n<div class=\"ba-calc-info\">\n<h2>Piano, pool table and heavy items<\/h2>\n<p><a href=\"\/en\/services\/piano-moving\/\">Piano moving<\/a> starts at $350 and moving a <a href=\"\/en\/services\/pool-table-moving\/\">pool table<\/a> starts at $450. The final rate depends on the model, the stairs and the access. For other heavy items, the rate is confirmed upon quote.<\/p>\n<\/div>\n<div class=\"ba-calc-info\">\n<h2>Peak season<\/h2>\n<p>From June 15 to July 10, the busiest period of the year, the rate is to be confirmed depending on the date. Book as early as possible.<\/p>\n<\/div>\n<div class=\"ba-calc-info\">\n<h2>Get a confirmed price<\/h2>\n<p>Happy with your estimate? Click \u201cRequest my quote\u201d: the <a href=\"\/en\/free-quote\/\">Free quote<\/a> page automatically picks up the information entered in the calculator. All you have to add is your contact details, the exact addresses and, if you wish, a few photos. Prefer to write or call us? Visit our <a href=\"\/en\/contact\/\">Contact<\/a> page or call 514-703-6147.<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Moving price calculator \u2013 Greater Montreal, South Shore and North Shore How much will your move cost? Our calculator gives you an instant estimate based on your route, your type of home, the floor of each home, the number of boxes and the crew you choose. It only uses the rates published on our Our [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-2570","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Moving Price Calculator \u2013 Montreal | Bon Avenir<\/title>\n<meta name=\"description\" content=\"Estimate the price of your move in Montreal, on the South Shore and the North Shore in seconds, based on our published rates. Free quote.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Moving Price Calculator \u2013 Montreal | Bon Avenir\" \/>\n<meta property=\"og:description\" content=\"Estimate the price of your move in Montreal, on the South Shore and the North Shore in seconds, based on our published rates. Free quote.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/\" \/>\n<meta property=\"og:site_name\" content=\"D\u00e9m\u00e9nagement Bon Avenir\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/p\/D%c3%a9m%c3%a9nagement-Bon-Avenir-Inc-100064960785566\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-24T23:37:05+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/\",\"url\":\"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/\",\"name\":\"Moving Price Calculator \u2013 Montreal | Bon Avenir\",\"isPartOf\":{\"@id\":\"https:\/\/www.bonavenir.ca\/#website\"},\"datePublished\":\"2026-10-19T15:47:26+00:00\",\"dateModified\":\"2026-10-24T23:37:05+00:00\",\"description\":\"Estimate the price of your move in Montreal, on the South Shore and the North Shore in seconds, based on our published rates. Free quote.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.bonavenir.ca\/en\/accueil\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Moving price calculator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.bonavenir.ca\/#website\",\"url\":\"https:\/\/www.bonavenir.ca\/\",\"name\":\"D\u00e9m\u00e9nagement Bon Avenir\",\"description\":\"Nous vous d\u00e9m\u00e9nageons vers un bon avenir\",\"publisher\":{\"@id\":\"https:\/\/www.bonavenir.ca\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.bonavenir.ca\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.bonavenir.ca\/#organization\",\"name\":\"D\u00e9m\u00e9nagement Bon Avenir\",\"url\":\"https:\/\/www.bonavenir.ca\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.bonavenir.ca\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.bonavenir.ca\/wp-content\/uploads\/2026\/10\/logo-bon-avenir-maison-bleue-camion.png\",\"contentUrl\":\"https:\/\/www.bonavenir.ca\/wp-content\/uploads\/2026\/10\/logo-bon-avenir-maison-bleue-camion.png\",\"width\":420,\"height\":382,\"caption\":\"D\u00e9m\u00e9nagement Bon Avenir\"},\"image\":{\"@id\":\"https:\/\/www.bonavenir.ca\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/p\/D\u00e9m\u00e9nagement-Bon-Avenir-Inc-100064960785566\/\",\"https:\/\/www.instagram.com\/demenagementbonavenir\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Moving Price Calculator \u2013 Montreal | Bon Avenir","description":"Estimate the price of your move in Montreal, on the South Shore and the North Shore in seconds, based on our published rates. Free quote.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/","og_locale":"en_US","og_type":"article","og_title":"Moving Price Calculator \u2013 Montreal | Bon Avenir","og_description":"Estimate the price of your move in Montreal, on the South Shore and the North Shore in seconds, based on our published rates. Free quote.","og_url":"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/","og_site_name":"D\u00e9m\u00e9nagement Bon Avenir","article_publisher":"https:\/\/www.facebook.com\/p\/D%c3%a9m%c3%a9nagement-Bon-Avenir-Inc-100064960785566\/","article_modified_time":"2026-10-24T23:37:05+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/","url":"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/","name":"Moving Price Calculator \u2013 Montreal | Bon Avenir","isPartOf":{"@id":"https:\/\/www.bonavenir.ca\/#website"},"datePublished":"2026-10-19T15:47:26+00:00","dateModified":"2026-10-24T23:37:05+00:00","description":"Estimate the price of your move in Montreal, on the South Shore and the North Shore in seconds, based on our published rates. Free quote.","breadcrumb":{"@id":"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.bonavenir.ca\/en\/moving-price-calculator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.bonavenir.ca\/en\/accueil\/"},{"@type":"ListItem","position":2,"name":"Moving price calculator"}]},{"@type":"WebSite","@id":"https:\/\/www.bonavenir.ca\/#website","url":"https:\/\/www.bonavenir.ca\/","name":"D\u00e9m\u00e9nagement Bon Avenir","description":"Nous vous d\u00e9m\u00e9nageons vers un bon avenir","publisher":{"@id":"https:\/\/www.bonavenir.ca\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.bonavenir.ca\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.bonavenir.ca\/#organization","name":"D\u00e9m\u00e9nagement Bon Avenir","url":"https:\/\/www.bonavenir.ca\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.bonavenir.ca\/#\/schema\/logo\/image\/","url":"https:\/\/www.bonavenir.ca\/wp-content\/uploads\/2026\/10\/logo-bon-avenir-maison-bleue-camion.png","contentUrl":"https:\/\/www.bonavenir.ca\/wp-content\/uploads\/2026\/10\/logo-bon-avenir-maison-bleue-camion.png","width":420,"height":382,"caption":"D\u00e9m\u00e9nagement Bon Avenir"},"image":{"@id":"https:\/\/www.bonavenir.ca\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/p\/D\u00e9m\u00e9nagement-Bon-Avenir-Inc-100064960785566\/","https:\/\/www.instagram.com\/demenagementbonavenir\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.bonavenir.ca\/en\/wp-json\/wp\/v2\/pages\/2570","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bonavenir.ca\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.bonavenir.ca\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.bonavenir.ca\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bonavenir.ca\/en\/wp-json\/wp\/v2\/comments?post=2570"}],"version-history":[{"count":4,"href":"https:\/\/www.bonavenir.ca\/en\/wp-json\/wp\/v2\/pages\/2570\/revisions"}],"predecessor-version":[{"id":3242,"href":"https:\/\/www.bonavenir.ca\/en\/wp-json\/wp\/v2\/pages\/2570\/revisions\/3242"}],"wp:attachment":[{"href":"https:\/\/www.bonavenir.ca\/en\/wp-json\/wp\/v2\/media?parent=2570"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}