Skip to content
ProceloBook a 15-min scope callBook a call
Case study · AI automation

From a WhatsApp photo to a staged visa job, with a person approving every passport.

How we automated Umrah visa paperwork for a visa office: AI reads passport photos sent on WhatsApp, two independent readers must agree, and staff approve before anything goes near the government portal.

Client
A visa office (Umrah)
Users
Staff who process pilgrims' passports
What we built
WhatsApp-to-portal automation
Stack
Next.js · FastAPI · PostgreSQL · Claude vision · Docker
A stamped passport page
The problem

Every passport was typed twice.

Umrah visa processing is a paperwork business run over WhatsApp. Agents received passport photos in chat, retyped the details into spreadsheets, and then retyped them again into the Saudi Nusuk portal.

The photos are taken in queues and living rooms, on any phone, with every problem a camera can add. And the data feeds a government visa application, so a confident wrong digit is worse than no answer at all.

Every retype is a chance for a typo, and a typo can cost a pilgrim their trip.
From the UmrahFlow write-up
What we built

A chain of five services, each doing one job.

Nothing goes from the AI to the government portal on its own.

  1. 1 · Intake

    WhatsApp in

    Messages are stored first. The agent waits for a photo album to finish arriving, then handles it as one submission.

  2. 2 · Read

    Two readers

    A strict MRZ parse with check digits, plus a Claude vision pass (OpenAI as fallback), merged field by field.

  3. 3 · Approve

    Staff review

    Fields shown next to the original photo. Only an explicit approval moves a passport on.

  4. 4 · Stage

    Submission plan

    Built with the visa console's own plan builder, so it matches what the office already uses.

  5. 5 · Submit

    Operator's keystroke

    An operator logs in and runs the final submission by hand.

The decisions that mattered

Trust the maths. Flag the doubt. Keep a human on the last step.

Two readers that must agree

When the MRZ (the machine-readable lines at the bottom of a passport) passes its check digits, it wins. The vision model only fills the gaps. Where the two disagree, the field is flagged for a person instead of being resolved silently.

“A wrong but confident digit is worse than a hard failure, because nothing downstream looks broken.”

The final step stays manual

The system builds and stages the submission, but submitting to a government portal is irreversible, so it stays behind a human keystroke.

The pipeline is modelled as states, not API calls, so every step can be resumed and inspected if something fails halfway.

How we know it works

11 end-to-end checks on every change.

A pipeline like this fails at the seams, not in the middle of a service. So the project ships a smoke script that tests the joins.

✓  Every service answers its health check.

✓  A message goes in, a passport comes out, and a reply is sent.

✓  An approved passport is staged as a submission job.

What changed

Staff check and approve, instead of typing.

Before

Typed twice, by hand

Photo in WhatsApp → spreadsheet → Nusuk portal. Every field typed by a person, twice.

After

Read by AI, approved by a person

Fields arrive pre-filled next to the photo, doubtful ones flagged. Approved passports are staged for submission.

Client numbers · placeholder

[X]

[minutes saved per passport, or passports handled per week], confirmed by the client.

Client quote · placeholder

“One real sentence from the client.”

Name, role, with written permission.

Your team retypes something every day.

Show us what it is. We'll tell you, in 15 minutes, whether it can be automated safely.