Skip to content
All work

Case study 05 / 11

Immigration

Live

NextMovePath: An AI Strategy Engine for Canadian Immigration

NextMovePath is a live platform for people applying for Canadian permanent residence. I built the first version of its paid AI Strategy Report end to end: gathering the right facts, streaming the report live, checking it, producing the PDF and setting up the cloud. I also built most of the platform around it. It launched eight days after work began.

  1. System

    Tested calculations: points, eligibility, gains

  2. Output

    Fixed facts the AI must not contradict

  3. AI

    AI writes the strategy and plan

  4. System

    Checked, saved, streamed live and as a PDF

The AI never calculates anything that can be calculated.

The problem

Canada's Express Entry system ranks applicants by a points score, and invitations go to whoever clears each round's cutoff. Applicants are anxious and flooded with conflicting advice, and the honest answer to "what should I do next?" depends on many things at once: points lost with age, changing category rounds, provincial programs by occupation, licensing timelines, language test results and new policy changes.

A generic chatbot fails in two ways. It gets the maths wrong, confidently inventing points. And it gives you a wall of text, not a product: a paid report has to be consistent, structured, printable and comparable over time. So the real question was: how do you get AI to write a personal strategy without letting it make up the facts?

What I built

  • The AI Strategy Report. It takes a person's profile, score, recent draw results and occupation data, and turns them into a personal roadmap: a score projection, a comparison of provinces, risks, and a month-by-month action plan.
  • Live report delivery. A full report takes a little while to write, and a long loading spinner right after payment destroys trust. The report streams onto the screen as it's written, then it's checked, saved and turned into a downloadable PDF.
  • The business around it. Secure payments, a marketplace for booking licensed immigration consultants, an assistant that fills in a government visa form one question at a time, a study-placement pipeline connected to the company's CRM, a reusable immigration profile, and a mobile app.
  • Search visibility. Free calculators, structured content and technical SEO built to rank on Google and be cited by AI assistants, which is the platform's main source of users.

How it works: facts first, AI second

I never let the AI calculate anything that can be calculated.

StepWhat it doesDone by
Points calculatorScores the profile across every factorTested code
Eligibility checkWorks out which category rounds the person qualifies forTested code
Improvement optionsCalculates exact point gains for each possible moveTested code
Occupation dataLicensing, regulation and demand by provinceDatabase
AITurns all of that into a strategy, timeline and planAI

The calculated facts go to the AI as fixed truths it must not contradict. The AI does what it's good at, interpreting and planning, instead of arithmetic and legal lookups, where it makes mistakes. The same points calculator runs on the website, in the mobile app and on the server, so everyone sees the same number.

Key decisions

  • The report follows a strict structure. About forty defined sections map directly to the report's screens and PDF, with minimum depth rules so a paid report is never thin, and real policy rules built in. For example, a score only rises when an official result arrives, so projections show realistic steps instead of a smooth, misleading curve.
  • Nothing broken gets saved. Every report is checked and repaired if needed. If it can't be fixed, the user gets a clear message and can try again.
  • Every report is reproducible. Each one is saved with the exact inputs that produced it, so it can be audited, and users can see how their strategy changed over time.
  • AI costs are controlled. Paid access is confirmed through verified payment, generation is rate-limited and capped per user, and the free preview uses no AI at all.
  • Built to switch AI providers. I designed one common way to talk to AI models. A teammate later used it to move production to Anthropic's Claude on Amazon Bedrock and add model switching for admins, while local development runs free.

Built for trust

Strict security headers, an approved list of origins, bot protection, verified admin access, strict input checks, an audit log of admin actions, and safe read-only access for support staff that can never trigger a paid report.

From first line of code to launch

I set up the AWS environment as code with Terraform, then we right-sized it for the stage and budget: a fast static website served worldwide, the application on a managed server, and a managed database with backups. I did the first production launch eight days after work began. Deployments run automatically without stored passwords, and after each release the system checks that the site and every article are working.

What I'd improve next

Stricter structured output from the AI, showing each report section as soon as it's ready, cost and speed tracking per report, shared caching before scaling to more servers, and a set of test profiles that every AI change must pass.

Under the hoodShow technical details
  • Streaming: NestJS async generators and Server-Sent Events, read in the browser with an authenticated fetch stream, line buffering and a stop button.
  • Reliable output: layered checks including format enforcement, cleanup, repair of cut-off responses, required-field validation and graceful fallbacks, because the AI service used has no built-in strict JSON mode.
  • AI: Claude on Amazon Bedrock in production and Ollama locally, behind one provider interface.
  • Platform: Stripe with verified, duplicate-safe payment events; Cal.com with signed booking events; PDFs rendered with headless Chrome and stored on S3.
  • Cloud: Next.js on S3 and CloudFront, NestJS on EC2 behind nginx, PostgreSQL on RDS, email through SES, secrets in Secrets Manager, and CI with GitHub Actions and OIDC, later hardened by the team.