Inspiration

What it does

How we built it## Inspiration

I started by reading what Toyota Financial Services customers actually say. Across 77 recent U.S. reviews on ConsumerAffairs and Trustpilot, 42% said it was hard to reach a person, 31% mentioned payment errors, and 22% were confused about their payoff. One customer was charged $779 for a missing wheel cap at lease end, sent to collections, and said they'd never buy a Toyota again.

Then I looked at the business side. In Toyota Motor Credit's FY2026 report, new lease contracts dropped 26% in one year (434,000 → 320,000). With fewer new leases coming in, keeping current customers matters a lot more.

What connected the two was lease end. Many lessees have equity in their car (it's worth more than the buyout price) and don't know it. Carvana, CarMax and other brands are happy to tell them. TFS already has a mileage calculator, a payoff quote and lease-end options, but they're in separate places. Nobody puts it together into one simple answer.

What it does

Next Move is a new card in the Toyota App that shows up when a customer is 9 months from the end of their lease.

Our example customer, Maria, leases a 2023 RAV4 with 7 months left:

  • The card tells her she has about $2,100 in equity and is on track for a $603 mileage fee.
  • "See my options" shows the answer first (trade up), then all four options in dollars: trade up and keep $2,100, buy it for about $435/month, pay cash and save about $4,075 in interest, or return it for $953.
  • A "what if I drive less?" slider updates the fee and the recommendation live.
  • "Explain it simply" gives a plain-English explanation from Gemini, using only her numbers.
  • One tap books a lease-end inspection or a dealer visit.

Carlos has the same car and numbers but 3 late payments. Next Move doesn't try to sell him a new car. It connects him to a Loyalty Advocate.

I also built the Retention Radar, the view for TFS. It runs the same calculator across every customer. In my synthetic portfolio, 149 customers are within 9 months of lease end, and 92 of them have a combined $182K in equity. The Radar ranks who to contact first and flags who needs a person instead of an offer.

How I built it

1. Synthetic data. A generator creates 200 lessees with a fixed seed (42), so the data is the same every run. It uses TFS's published rates: \$0.15 per extra mile and a \$350 disposition fee.

2. Calculator (plain TypeScript, no AI). For each customer:

$$\text{Projected miles} = \text{odometer} + \text{months left} \times \text{miles per month}$$

$$\text{Mileage fee} = \max(0,\ \text{projected} - \text{allowed}) \times 0.15$$

$$\text{Equity} = \text{market value} - \text{buyout price}$$

$$\text{Return cost} = \text{mileage fee} + 350$$

For Maria: $39{,}500 + 7 \times 1{,}360 = 49{,}020$ miles. That's $4{,}020$ over her $45{,}000$ allowance, so the fee is $4{,}020 \times 0.15 = \$603$. Her equity is $\$24{,}100 - \$22{,}000 = \$2{,}100$.

The buyout loan payment uses the standard amortization formula (6.9% APR, 60 months):

$$M = P \cdot \frac{r}{1 - (1 + r)^{-n}}, \quad r = \frac{0.069}{12},\ n = 60$$

which gives about \$435/month on a \$22,000 buyout.

3. Decision rules. Five rules, checked in order, pick the recommendation:

  1. More than 9 months left → remind later
  2. 3 or more late payments → talk to a Loyalty Advocate
  3. Equity and more than 15,000 miles a year → trade up
  4. Equity → buy it
  5. Otherwise → return it

4. Gemini API. A Next.js server route (/api/explain) calls Gemini through Google's @google/genai SDK, so the API key never reaches the phone. Gemini only gets the calculator's results and the customer's question. Temperature is 0, and the instructions tell it to use only our numbers, not change the recommendation, and ignore any instructions inside the question.

5. Number check. Before the customer sees anything, every number in Gemini's answer is checked against the calculator. If a number doesn't match, or Gemini times out, the app shows a safe pre-written answer instead. The response includes "source": "gemini" or "source": "template", so it's always clear which one was used.

6. Testing and tools. 40 automated tests in Vitest, including fixed test customers with known answers. I built the app in Next.js, React and TypeScript, using Cursor as my main coding tool.

Challenges I ran into

  • No real customer data. I couldn't use real TFS accounts, so I built synthetic customers that follow TFS's published fee rules and still lead to realistic decisions.
  • Keeping AI from making up numbers. In lending, a wrong number isn't a small bug; it's a compliance problem. Getting Gemini to sound natural without ever inventing a figure is why I added the number check and the fallback answers.
  • Knowing when not to sell. The easy version recommends a trade-up to everyone with equity. Carlos made me add a rule that puts struggling customers in front of a person first.
  • Not rebuilding what already exists. The TFS app already has lease-end options, so I focused on what's missing: equity, a mileage projection, a clear recommendation and a plain explanation, all in one place.

What I learned

  • The most trustworthy AI feature in finance is often the most limited one. Letting code do the math and AI do the explaining made the product easier to trust and much easier to test.
  • Reading real customer reviews first changed the project. I went from a general "car finance assistant" idea to one specific, expensive moment: the end of a lease.

What's next

  • Connect to real (test) TFS account data through the Toyota App
  • Extend it to loan customers approaching payoff
  • Early support for customers who start falling behind on payments
  • A pilot: send Next Move to half of customers near lease end and compare re-lease rates, call volume and offer acceptance against the other half

All customer data in this project is synthetic. No real TFS data was used. This is a student hackathon project and is not affiliated with Toyota.

Built With

Share this project:

Updates

Submission history