CASH OFFER AI

Survival goes to those who can do more with less.



Founding Dealer Plan (Limited to 50)

  • $500 setup (tailors your AI to your brand & buy box)

  • $500/month (month-to-month, cancel anytime)

  • Delivery: up to 4 weeks (most live sooner)


Included

  • Custom system prompt trained on your inventory targets & rules

  • Cash-offer conversation: VIN → miles → title/loan → zip → condition → photos (optional)

  • Continuous learning from your deals, website, and FAQs

  • Alerts via Slack/Email + CSV/CRM export

  • Ongoing updates by me—just tell me what to improve

Notes

  • Setup fee funds your initial training and is non-refundable

  • Includes 1 rooftop; add’l rooftops +$150/mo each

  • Light CRM integrations included (CSV/Webhook/Zapier)

  • Early adopter feature priority

CASH OFFER AI agent — Conversational UI (MVP)
Step 1 of 7
Hi! I’m the CASH OFFER AI agent. Let’s start with your VIN so I can decode year, make, and model.
TODO: Add photo upload + ICE flow
© 2025 CASH OFFER AI · Demo. Privacy/Terms placeholders.
(function(){ const messages = document.getElementById('messages'); const input = document.getElementById('input'); const tipsBtn = document.getElementById('tipsBtn'); const suggestBox = document.getElementById('suggestBox'); const chips = document.getElementById('chips'); const continueBtn = document.getElementById('continueBtn'); const backBtn = document.getElementById('backBtn'); const tryVin = document.getElementById('tryVin'); const resetBtn = document.getElementById('resetBtn'); const pg = document.getElementById('pg'); const stepLabel = document.getElementById('stepLabel'); const leadJsonEl = document.getElementById('leadJson'); const copyBtn = document.getElementById('copyBtn'); const downloadBtn = document.getElementById('downloadBtn'); const sendBtn = document.getElementById('sendBtn'); const consentChk = document.getElementById('consentChk'); const readyBadge = document.getElementById('readyBadge'); document.getElementById('yr').textContent = new Date().getFullYear(); const stepsOrder = ["vin","miles","zip","titleStatus","contact","delivery","review"]; let currentStep = "vin"; let computedSteps = stepsOrder.slice(); let messagesState = []; let lead = {}; const YEAR_CODE = { "A":1980,"B":1981,"C":1982,"D":1983,"E":1984,"F":1985,"G":1986,"H":1987,"J":1988,"K":1989,"L":1990,"M":1991,"N":1992,"P":1993,"R":1994,"S":1995,"T":1996,"V":1997,"W":1998,"X":1999,"Y":2000, "1":2001,"2":2002,"3":2003,"4":2004,"5":2005,"6":2006,"7":2007,"8":2008,"9":2009,"A2":2010,"B2":2011,"C2":2012,"D2":2013,"E2":2014,"F2":2015,"G2":2016,"H2":2017,"J2":2018,"K2":2019,"L2":2020,"M2":2021,"N2":2022,"P2":2023,"R2":2024,"S2":2025 }; function mockDecodeVin(vin){ if (vin.length !== 17) return {}; const wmi = vin.slice(0,3).toUpperCase(); let make = ""; if (["5YJ","7SA","7S2","LRW"].includes(wmi)) make = "Tesla"; else if (["1N4","3N1"].includes(wmi)) make = "Nissan"; else make = "Unknown"; const modelMap = {"5YJ":"Model S/3/X/Y","LRW":"Model 3/Y","7SA":"R1T/R1S","7S2":"R2","1N4":"Leaf or Sedan","3N1":"Versa/Leaf"}; const model = modelMap[wmi] || "EV"; const tenth = vin[9].toUpperCase(); let year; if (YEAR_CODE[tenth+"2"]) year = YEAR_CODE[tenth+"2"]; else if (YEAR_CODE[tenth]) year = YEAR_CODE[tenth]; return {make, model, year}; } function getSuggestions(step){ switch(step){ case "vin": return [ {q:"Where do I find my VIN?", a:"Common places: windshield (driver side lower corner), driver door jamb sticker, insurance card, or the title/registration."}, {q:"Why do you need my VIN?", a:"VIN lets us auto-fill year/make/model and helps dealers price your car accurately in minutes."}, ]; case "miles": return [ {q:"Can I estimate miles?", a:"Use the current odometer. Accurate miles reduce back-and-forth and gets you a firm offer."}, {q:"Do photos help?", a:"Yes—after miles we’ll ask for optional photos to help dealers bid with confidence (coming soon)."}, ]; case "zip": return [ {q:"Why do you need ZIP?", a:"Dealers factor transport; your ZIP helps surface buyers near you for faster pickup and better offers."}, {q:"Can you pick up at work?", a:"Yes—buyers can meet at your home or work. We’ll confirm exact address after you accept an offer."}, ]; case "titleStatus": return [ {q:"What if I still have a loan?", a:"No problem. Buyers can pay off your lender directly and pay you the difference at pickup."}, {q:"How long does payoff take?", a:"Usually 1–5 business days depending on the bank. We track it and keep you posted."}, ]; case "loanDetails": return [ {q:"Where do I find payoff?", a:"Log into your lender portal or call them for a 10‑day payoff amount. A screenshot works great."}, {q:"Is my info secure?", a:"We only share what buyers need to generate an offer and schedule pickup. See privacy in footer (add later)."}, ]; case "contact": return [ {q:"Will you spam me?", a:"No. You’ll only get updates about your offers and scheduling. You can opt out anytime."}, {q:"Can I get SMS instead?", a:"Yep—choose SMS for faster updates. We’ll text offers and pickup details."}, ]; default: return [ {q:"How fast do I get offers?", a:"Often same‑day. Many buyers respond within minutes during business hours."}, {q:"Do you charge sellers?", a:"Listing is free for this demo. Final pricing/fees can be configured per campaign."}, ]; } } function setProgress(){ const idx = computedSteps.indexOf(currentStep); const total = computedSteps.length; const pct = Math.max(0, (idx / Math.max(1,total-1)) * 100); pg.style.width = pct + "%"; stepLabel.textContent = "Step " + (idx+1) + " of " + total; updatePlaceholder(); } function updatePlaceholder(){ const map = { vin: "Enter 17-character VIN", miles: "Enter odometer miles (e.g., 28,450)", zip: "Enter 5-digit ZIP", titleStatus: "Yes (title) or No (loan)", loanDetails: "Bank, payoff (e.g., Tesla Finance, 23250)", contact: "Name, email, phone", delivery: "SMS or Email", review: "Type a message" }; input.placeholder = map[currentStep] || "Type a message"; } function append(role, text){ messagesState.push({role, text}); const div = document.createElement('div'); div.className = 'bubble ' + (role === 'assistant' ? 'assistant' : 'user'); div.textContent = text; messages.appendChild(div); messages.scrollTop = messages.scrollHeight; } function showSuggestions(){ const list = getSuggestions(currentStep); chips.innerHTML = ""; list.forEach((s) => { const b = document.createElement('button'); b.className = 'chip'; b.textContent = s.q; b.addEventListener('click', () => { append('user', s.q); append('assistant', s.a); }); chips.appendChild(b); }); suggestBox.classList.remove('hidden'); } function hideSuggestions(){ suggestBox.classList.add('hidden'); } function refreshLeadView(){ leadJsonEl.textContent = JSON.stringify(lead, null, 2); const ready = !!(lead.vin && lead.zip && lead.contact && lead.delivery && lead.delivery.consent); sendBtn.disabled = !ready; readyBadge.classList.toggle('hidden', !ready); } function handleUserSubmit(){ const v = input.value.trim(); if (!v) return; append('user', v); if (currentStep === 'vin'){ if (v.length !== 17){ append('assistant', 'VINs are 17 characters. Double-check and try again.'); return; } const decoded = mockDecodeVin(v.toUpperCase()); lead.vin = v.toUpperCase(); lead.decoded = decoded; const car = (decoded.year || '') + ' ' + (decoded.make || '') + ' ' + (decoded.model || ''); append('assistant', (decoded.make ? ('Got it. I decoded: ' + car.trim() + '. How many miles are on the odometer?') : 'Thanks! VIN received. How many miles are on the odometer?')); currentStep = 'miles'; input.value = ''; refreshLeadView(); setProgress(); return; } if (currentStep === 'miles'){ const miles = Number(v.replace(/[,\s]/g,'')); if (!isFinite(miles) || miles < 0){ append('assistant','Enter miles as a number (no decimals needed).'