An AI assistant that runs on the tour paperwork
We built Claude-powered AI into the EMH Productions operations dashboard: plain-English questions about shows, plus travel PDFs and invoices read automatically.

Overview
EMH Productions runs concerts and tours. Behind every show is a stack of paperwork: artist contracts, payment schedules, e-tickets, travel-agency invoices, hotel confirmations and passport scans. All of it lived in PDFs and email, and the team typed the important parts into their operations dashboard by hand.
We had already built that dashboard for them. This project made it do the reading. We used Anthropic's Claude models through the API and kept a person in charge of every record that gets saved.
What the AI does
Answers questions in plain English
Staff type questions the way they would ask a colleague:
- "How many shows do we have in December?"
- "Which contracts are still waiting to be signed?"
- "What's the total of overdue payments?"
- "Which artists have the most shows this year?"
Claude never writes database code itself. It picks from five query tools we built (shows, contracts, payments, artists and companies), fills in the filters, and our code runs a safe, read-only query. Claude then writes the answer in plain language. See our AI chatbot and AI agent work.
- Step 01
Question
A staff member asks in plain English, like "Which payments are overdue?"
- Step 02
Claude picks a tool
Claude chooses one of five query tools and fills in the filters.
- Step 03
Safe query
Our code runs a read-only database query. No raw SQL from the AI.
- Step 04
Plain answer
Claude turns the results into a short answer with the numbers.
Reads travel documents into the tour
Each tour has a Google Drive folder of e-tickets and confirmations from the travel agency. The dashboard reads every PDF in the folder. Claude reads the PDF directly, layout and all, and pulls out the agency reference, the airline booking code (PNR) and each passenger's ticket number. The dashboard then fills those in on the flights the tour manager already entered, and files a copy of each document in that passenger's own Drive folder.
Matching names is the risky part. A ticket might say "Smith/John Mr", while the dashboard has "John Robert SMITH". So the system only fills empty fields, never replaces a value that disagrees, and lists every mismatch in a report for a person to resolve. A run can be incomplete, but it can't be quietly wrong.
- Step 01
Drive folder
The travel agency's e-tickets and confirmations land in the tour's folder.
- Step 02
Claude reads PDFs
Booking references, airline codes and ticket numbers are pulled out.
- Step 03
Careful matching
Passengers and flights are matched. Only empty fields are filled.
- Step 04
Report for review
Every mismatch is listed for the team. Nothing is overwritten.
Itinerary screenshots work too: the tour manager can upload one and Claude turns it into travel legs to review.
Turns invoices into line items
Travel-agency invoices, credit notes and airline receipts are read into their printed lines. This is plain transcription, so it runs on Claude Haiku, the smaller and cheaper model.
Writes show descriptions
For each show, Claude drafts a description of about 300 words from the artist, venue, city and date, ready for the media page.
Finds the face on passport scans
When the team needs passport photos for visas and credentials, the crop tool opens already centered on the holder's face. Someone confirms the crop before it is saved.
Problems we hit, and how we solved them
Getting AI to read a document is the easy part. Making it safe to trust in daily operations took most of the work.
01Names never match exactly
Problem
A ticket prints "Smith/John Mr" while the crew record says "John Robert SMITH". A strict comparison finds nothing, and a loose one can attach a ticket to the wrong person.
Our fix
Match on cleaned-up surname plus first name, only within that tour's crew. If two people could match, don't guess: list it in the report for a person.
02AI can misread a number
Problem
An invoice misread by one digit is worse than no invoice, because the totals look real.
Our fix
Check that the lines add up to the printed total and flag any invoice that doesn't. That check is what lets the cheaper Claude Haiku do this job.
03A model upgrade cut answers short
Problem
A newer Claude Sonnet model "thinks" before answering by default. On long documents that used up the space for the answer, and the data came back cut off.
Our fix
Turn thinking off for pure data extraction, and set each model option on purpose per job so upgrades don't quietly change results.
04PDFs turned into images lost the layout
Problem
E-tickets are tables. Converting them to images loses which number belongs to which column.
Our fix
Send the original PDF. Claude reads it natively, layout included: faster, cheaper and more accurate.
05iPhone photos nothing could read
Problem
Some passports were uploaded as iPhone HEIC photos, a format neither Claude nor most browsers can read.
Our fix
Skip those files and ask for a manual upload, so one odd file never blocks the rest.
How we built it
- A person checks the output. Parsed documents and photo crops are suggestions; a staff member confirms them.
- The right model for each job. Reasoning tasks use Claude Sonnet or Opus; plain transcription uses Claude Haiku to keep costs down.
- No new infrastructure. Everything runs inside the existing Rails app and PostgreSQL database, with no vector database to run.
- Safe by design. The assistant can only call our own query tools, so it can't change or leak data outside them.
This is the same approach we use in our AI document processing and custom AI integration services.
What we did
- Claude API integration
- Natural-language data queries
- Document processing
- Content generation
- Image analysis