+Number(estimate.total).toFixed(2)+' · '+estimate.status; p.append(summary); if(estimate.status==='sent'){ const approve=document.createElement('button');approve.type='button';approve.className='orbit-live-approve'; approve.textContent='Approve estimate';approve.setAttribute('aria-label','Approve '+(estimate.number||'estimate')); approve.addEventListener('click',async()=>{ if(!confirm('Approve '+(estimate.number||'this estimate')+' for } choices.replaceChildren(); if(data.status==='open' && Array.isArray(data.choices)){ data.choices.forEach(choice=>{ const button=document.createElement('button'); button.type='button'; button.className='orbit-choice'; button.textContent=choice.label; button.addEventListener('click',()=>sendMessage(String(choice.value||choice.label),button)); choices.append(button); }); } choices.hidden=!choices.childElementCount; log.scrollTop=log.scrollHeight; status.textContent=''; setChatMode(true); }catch(e){ if(e.status===403||e.status===404){ chat=null;localStorage.removeItem(key);setChatMode(false);log.replaceChildren();appendIntro(); prechatStatus.textContent='Your previous chat expired. Start a new one.'; }else status.textContent=e.message; } } toggle.onclick=async()=>{ panel.hidden=!panel.hidden; toggle.setAttribute('aria-expanded',String(!panel.hidden)); if(!panel.hidden){await loadConfig();if(chat)await refresh();else{log.replaceChildren();appendIntro();setChatMode(false)}} }; close.onclick=()=>{panel.hidden=true;toggle.setAttribute('aria-expanded','false')}; prechat.onsubmit=async e=>{ e.preventDefault(); const button=prechat.querySelector('button[type=submit]'); const body=document.getElementById('orbit-first-message').value.trim();if(!body)return; const profile=config.authenticated&&config.profile?{ first_name:config.profile.first_name||'', last_name:config.profile.last_name||'', email:config.profile.email||'', company:config.profile.company?.name||'' }:{ first_name:document.getElementById('orbit-first-name').value.trim(), last_name:document.getElementById('orbit-last-name').value.trim(), email:document.getElementById('orbit-email').value.trim(), company:document.getElementById('orbit-company').value.trim() }; button.disabled=true;prechatStatus.textContent='Starting…'; try{ const data=await call(base,'POST',{body,store_id:storeId?Number(storeId):null,...profile}); chat={id:data.conversation_id,token:data.token}; localStorage.setItem(key,JSON.stringify(chat)); if(!config.authenticated)localStorage.setItem(profileKey,JSON.stringify(profile)); document.getElementById('orbit-first-message').value=''; prechatStatus.textContent=''; setChatMode(true); await refresh(); }catch(error){prechatStatus.textContent=error.message} finally{button.disabled=false} }; let sending=false; async function sendMessage(body,selectedButton=null){ if(!body||!chat||sending)return; sending=true; const button=form.querySelector('button[type=submit]'); button.disabled=true; choices.querySelectorAll('button').forEach(b=>b.disabled=true); status.textContent='Sending…'; try{ await call(base+'/'+chat.id+'/messages','POST',{body}); if(!selectedButton)input.value=''; await refresh(); }catch(error){status.textContent=error.message} finally{ sending=false;button.disabled=false; choices.querySelectorAll('button').forEach(b=>b.disabled=false); } } form.onsubmit=e=>{e.preventDefault();sendMessage(input.value.trim())}; input.addEventListener('keydown',e=>{ if(e.key==='Enter'&&!e.shiftKey&&!e.isComposing){ e.preventDefault();sendMessage(input.value.trim()); } }); loadConfig().then(()=>{if(chat)refresh();else appendIntro()}); setInterval(()=>{if(!panel.hidden&&chat&&!sending&&!input.matches(':focus'))refresh()},6000); })(); +Number(estimate.total).toFixed(2)+'?'))return; approve.disabled=true; try{await call(base+'/'+chat.id+'/estimates/'+estimate.id+'/approve','POST',{});await refresh()} catch(error){status.textContent=error.message;approve.disabled=false} }); p.append(approve); } } log.append(p); } choices.replaceChildren(); if(data.status==='open' && Array.isArray(data.choices)){ data.choices.forEach(choice=>{ const button=document.createElement('button'); button.type='button'; button.className='orbit-choice'; button.textContent=choice.label; button.addEventListener('click',()=>sendMessage(String(choice.value||choice.label),button)); choices.append(button); }); } choices.hidden=!choices.childElementCount; log.scrollTop=log.scrollHeight; status.textContent=''; setChatMode(true); }catch(e){ if(e.status===403||e.status===404){ chat=null;localStorage.removeItem(key);setChatMode(false);log.replaceChildren();appendIntro(); prechatStatus.textContent='Your previous chat expired. Start a new one.'; }else status.textContent=e.message; } } toggle.onclick=async()=>{ panel.hidden=!panel.hidden; toggle.setAttribute('aria-expanded',String(!panel.hidden)); if(!panel.hidden){await loadConfig();if(chat)await refresh();else{log.replaceChildren();appendIntro();setChatMode(false)}} }; close.onclick=()=>{panel.hidden=true;toggle.setAttribute('aria-expanded','false')}; prechat.onsubmit=async e=>{ e.preventDefault(); const button=prechat.querySelector('button[type=submit]'); const body=document.getElementById('orbit-first-message').value.trim();if(!body)return; const profile=config.authenticated&&config.profile?{ first_name:config.profile.first_name||'', last_name:config.profile.last_name||'', email:config.profile.email||'', company:config.profile.company?.name||'' }:{ first_name:document.getElementById('orbit-first-name').value.trim(), last_name:document.getElementById('orbit-last-name').value.trim(), email:document.getElementById('orbit-email').value.trim(), company:document.getElementById('orbit-company').value.trim() }; button.disabled=true;prechatStatus.textContent='Starting…'; try{ const data=await call(base,'POST',{body,store_id:storeId?Number(storeId):null,...profile}); chat={id:data.conversation_id,token:data.token}; localStorage.setItem(key,JSON.stringify(chat)); if(!config.authenticated)localStorage.setItem(profileKey,JSON.stringify(profile)); document.getElementById('orbit-first-message').value=''; prechatStatus.textContent=''; setChatMode(true); await refresh(); }catch(error){prechatStatus.textContent=error.message} finally{button.disabled=false} }; let sending=false; async function sendMessage(body,selectedButton=null){ if(!body||!chat||sending)return; sending=true; const button=form.querySelector('button[type=submit]'); button.disabled=true; choices.querySelectorAll('button').forEach(b=>b.disabled=true); status.textContent='Sending…'; try{ await call(base+'/'+chat.id+'/messages','POST',{body}); if(!selectedButton)input.value=''; await refresh(); }catch(error){status.textContent=error.message} finally{ sending=false;button.disabled=false; choices.querySelectorAll('button').forEach(b=>b.disabled=false); } } form.onsubmit=e=>{e.preventDefault();sendMessage(input.value.trim())}; input.addEventListener('keydown',e=>{ if(e.key==='Enter'&&!e.shiftKey&&!e.isComposing){ e.preventDefault();sendMessage(input.value.trim()); } }); loadConfig().then(()=>{if(chat)refresh();else appendIntro()}); setInterval(()=>{if(!panel.hidden&&chat&&!sending&&!input.matches(':focus'))refresh()},6000); })();

Shopping cart

Empty Cart

Your Cart is empty

Go to Shop
Sun, November 8, 2026 LIVE
• Open now: 2026 Chicago Toy & Game Fair Tickets — Rosemont, IL • Open now: Adana Agriculture Fair — Adana, Türkiye • Open now: Adana Agriculture Fair — Adana, Türkiye • Open now: Adana Greenhouse And Garden Fair — Adana, Türkiye • Open now: Adana Greenhouse And Garden Fair — Adana, Türkiye • Open now: Affordable Art Fair - Hamburg — Hamburg, Germany • Upcoming: Accounting & Business Expo KSA — Riyadh, Saudi Arabia • Upcoming: Accounting & Business Expo KSA — Riyadh, Saudi Arabia • Upcoming: Aesthetic Beauty Education Expo — Bristol, United Kingdom • Upcoming: Aesthetic Beauty Education Expo — Bristol, United Kingdom • Upcoming: Banking Transformation Summit USA — Charlotte, NC • Upcoming: Banking Transformation Summit USA — Charlotte, NC • Upcoming: Beauty Elements Exhibition (BEE) — Muscat, Oman • Upcoming: Beauty Elements Exhibition (BEE) — Muscat, Oman • Upcoming: BIO-Europe — Cologne, Germany • Upcoming: BIO-Europe — Cologne, Germany • Upcoming: Cérémonie de Remise des Diplômes de L'ithq — Montreal, Quebec, Canada • Upcoming: Choose Your Own Health Adventure with Snowflake — Dallas, TX • Upcoming: Choose Your Own Health Adventure with Snowflake — Dallas • Upcoming: Connected World KSA — Riyadh, Saudi Arabia
VIEW ALL →
AALSETTIntelligence for What's Next
Login Join

RELENTLESS DIGITAL

Website
2Events
About

At Relentless Digital, we don’t just get you leads—we get your HVAC, Plumbing, or Electrical business booked jobs and repeat customers, all on autopilot. We fill your pipeline with high-quality leads, automatically follow up with every lead through our marketing automation suite, and make sure no opportunity slips through the cracks. But we don’t stop there—our system nurtures your customers after the job, driving more 5-star reviews, repeat business, and service plan sign-ups—growing the lifetime value of your customers. The result? More booked jobs, higher revenue per customer, and a business that grows while you focus on running it.

Send a message
Your experience on this site will be improved by allowing cookies Cookie Policy