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

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.
A chain of five services, each doing one job.
Nothing goes from the AI to the government portal on its own.
- 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 · Read
Two readers
A strict MRZ parse with check digits, plus a Claude vision pass (OpenAI as fallback), merged field by field.
- 3 · Approve
Staff review
Fields shown next to the original photo. Only an explicit approval moves a passport on.
- 4 · Stage
Submission plan
Built with the visa console's own plan builder, so it matches what the office already uses.
- 5 · Submit
Operator's keystroke
An operator logs in and runs the final submission by hand.
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.
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.
Staff check and approve, instead of typing.
Typed twice, by hand
Photo in WhatsApp → spreadsheet → Nusuk portal. Every field typed by a person, twice.
Read by AI, approved by a person
Fields arrive pre-filled next to the photo, doubtful ones flagged. Approved passports are staged for submission.
[X]
[minutes saved per passport, or passports handled per week], confirmed by the client.
“One real sentence from the client.”
Name, role, with written permission.
Technical write-ups
Have a paperwork workflow?
Your team retypes something every day.
Show us what it is. We'll tell you, in 15 minutes, whether it can be automated safely.