Skip to main content
    All case studies
    Case study · Multi-partner automation
    Meridian Operations · multi-partner logistics notifications

    Ticket arrival → finished release document: 90 seconds

    One extraction prompt handles twelve partners. No per-partner parsers. The model generalizes across partners it has seen and flags the ones it hasn't — and the few-shots accumulate without replacement.

    0 sec
    Ticket arrival to finished release document
    0%
    Auto-completion rate — no human touched it
    0
    Logistics partners handled with one extraction prompt
    Built with
    Zoho DeskZohoDeskClaude by AnthropicClaudeMicrosoft AzureAzurePostgreSQLPostgresMicrosoft TeamsTeams
    The problem

    Twelve partners, twelve layouts, one critical field always somewhere different

    Every morning the team scanned partner emails by eye. The terminal code was sometimes labeled, sometimes adjacent to lookalike fields, sometimes on page 3 in fine print. After identifying the shipment, three browser tabs to find the submission record. After-hours notifications waited until morning. The Monday queue was the week's worst.

    • Format roulette every morning
      Each logistics partner emailed delivery-trigger notifications in their own layout. One used a labeled HTML address table. Another sent a plain-text grid. A third embedded the data inside a forwarded chain. No two agreed on column headers, and the format changed without notice.
    • Terminal code buried, unlabeled, or missing
      The terminal code — one letter, three or four digits — is the critical field for the release document. One partner printed it on page 3 in fine print. Another printed it unlabeled, adjacent to container numbers and port codes that share the same shape. The team had learned to scan each PDF by eye.
    • Submission lookup was a three-tab exercise
      Once the shipment was identified, the operator had to open the upstream system, locate the submission record by reference, and pull the XML data needed for the release document. Doing this for ten rows per notification took longer than reading the email.
    • After-hours pileup
      Notifications that landed after 5pm sat in the shared queue until morning. The Monday queue was the week's worst. Customers waiting for release authorization documents — and the partners who needed to move cargo — noticed.
    Same field · 12 partners · 12 places
    format roulette
    Partner 01labeled HTML tableterminal code: page 1, header
    Partner 02plain-text gridterminal code: page 2, fine print
    Partner 03forwarded chainterminal code: embedded in body text
    Partner 04labeled HTML tableterminal code: page 3, unlabeled
    Partner 05scanned PDFterminal code: footer, low contrast
    Partner 06XLSX exportterminal code: row 47, cell C
    Six more partners with their own quirksFormat changes without notice
    The pipeline

    From inbox to verified record in one pass

    Six steps from partner email to draft reply. Step 5 is the hard one — the model disambiguates a 4-digit code from neighboring fields that share the same shape.

    01Trigger
    Partner email lands as a ticket
    Logistics partner emails a delivery-trigger notification. Zoho Desk receives it and fires a webhook; Azure Functions picks up the event within seconds.
    Zoho Desk
    02Parse
    Email body parsed across partner formats
    Claude reads the email HTML, adapting to variable column headers and layout differences partner by partner. Output: a structured list of shipment rows.
    Claude
    03Match
    Submission ticket matched against the local mirror
    For each shipment row, a 4-character partner code is extracted. The local PostgreSQL mirror — no live API call — finds the matching submission ticket.
    PostgreSQL
    04Fetch
    Submission record pulled from upstream system
    The submission record is retrieved from the upstream third-party system as XML. Per-shipment rate limit, not global — multiple shipments fetch back-to-back.
    05Extract
    Terminal code disambiguated from PDF
    Claude reads the attached delivery-trigger PDF. Disambiguates the terminal code from container numbers and port codes that share the same alphanumeric shape. Per-partner few-shots improve precision; low-confidence extractions are flagged.
    Claude
    06Generate
    Release document assembled and uploaded
    Release authorization PDF assembled from three sources (submission XML, parsed address table, extracted terminal code). Uploaded to the submission ticket; draft reply staged for the operator.
    Azure Blob
    Auto-completion path
    Release document on the ticket within ninety seconds
    Release authorization PDF uploaded to the submission ticket within 90 seconds of ticket arrival. The operator receives a Microsoft Teams card summarizing the shipment and can hit Send on the prepared draft.
    Exception path
    Routed to the exception-handler specialist with full context
    No submission match, ambiguous delivery address, missing terminal code, conflicting codes across pages, or unknown partner format routes the shipment to the exception-handler specialist for interactive resolution. The specialist sees the full context: parsed rows, match attempt, extracted candidates.
    Step 04 — Extraction

    What Claude saw → what the system received

    Scroll triggers the live extraction. Each region Claude reads on the document maps into the structured form on the right.

    Source attachment
    partner-notification-MO-50118.pdf
    Target schema
    Shipment row
    ✓ extracted
    PTRN-4419022
    ✓ extracted
    SHP-7734819
    ✓ extracted
    2026-05-08
    ✓ extracted
    2441 Industrial Pkwy, Savannah GA 31408
    ✓ extracted
    G114
    0 / 5 fields populated✓ ready for review
    Step 06 — Accuracy review

    The system tells you when it's unsure

    A second Claude pass scores every field against the source spans. High-confidence results post automatically. Anything ambiguous routes to a human with the reasoning attached.

    Field-level confidence
    Pass 2 — Claude self-review
    Partner referencePTRN-4419022
    99%High
    Shipment referenceSHP-7734819
    98%High
    ETA at destination2026-05-08
    97%High
    Delivery address2441 Industrial Pkwy, Savannah GA 31408
    94%High
    Terminal codeG114
    61%Low
    Routed to human review. Partner-by-partner polymorphism is the hard problem. One partner hides the code on page 3; another prints it unlabeled adjacent to container numbers that share the same shape. Model proposes the most likely code but flags low confidence — these rows go to the exception queue.
    4 of 5 fields cleared the 0.85 threshold
    model: Claude
    The stack

    Boring tech, glued together well

    Each vendor handles what it's best at. Aisyst owns the orchestration layer in between.

    Zoho DeskZohoDesk
    Zoho Desk
    Source ticket system; release document uploaded back to the submission ticket
    Claude by AnthropicClaude
    Claude
    Parses email HTML across partner formats and extracts terminal codes from PDFs
    Microsoft AzureAzure
    Azure Functions + Blob
    Webhook handler, orchestration, release-document PDF storage
    PostgreSQLPostgres
    PostgreSQL
    Local Zoho mirror for submission lookups without a live API call per match
    Microsoft TeamsTeams
    Microsoft Teams
    Operator card with shipment summary and a one-click reply on auto-completion

    Third-party logos are trademarks of their respective owners and appear here only to indicate integration.

    Outcomes

    What changed when the parser became a few-shot prompt

    Per-partner parsers would have needed maintenance on every format change. Per-partner few-shots accumulate. The model generalizes across what it has seen and flags what it hasn't.

    0 sec
    Ticket arrival to finished document
    0%
    Auto-completion rate
    0
    Partners handled with one prompt
    0
    Incorrectly issued release documents
    Watch per-partner auto-completion rate, not just the aggregate

    If one partner's rate drops from 85% to 40%, that partner changed their format — new column layout, new template, terminal code on a different page. The aggregate won't catch it; the per-partner breakdown will. The fix is a new few-shot example for that partner added to the extraction prompt. No parser rewrite needed.

    If you process notifications from many partners who all format the same fields differently, this pattern fits

    One extraction model with per-partner few-shots, not twelve parsers. The few-shots accumulate; the parsers would need replacement on every format change.