Contract Scraper → CRM + Upsell Signal Engine (L4)

Self-hosted n8n workflow extracts line items from every closed-won PDF (OCR + image + text into Opus), runs a deterministic JS auditor, escalates only low-confidence cases to a human, then writes structured plan data to Salesforce. ~45 min saved per renewal. Built by Egan at Sendoso, shown on the GTM AI Podcast.

WORKFLOW1Ingest PDFs three ways fo… the modelSelf-hosted service2Use a deterministic JS au…itor, not just AIn8n + JavaScript3Loop low-confidence cases…back through with contextn8n4Human-in-loop only on the…residualSlack notification5Layer upsell signals on t…pSalesforce + agent
5 steps, in order, with the tool that owns each one.
Adoption ladderSix levels from Starter to Rebuilt. This item sits at level 4.L1 StarterOne tool, no workflow changeL2 AssistedAI drafts, humans approveL3 IntegratedWired into CRM and SlackL4 OrchestratedMulti-step, owned, measuredL5 AutonomousAgent runs, human auditsL6 RebuiltThe process itself changes
This playbook belongs at L4 Orchestrated. Running it above your level is how pilots stall.
Measures of successminutes saved per renewal; NRR (net revenue retention); # of upsell opportunities surfaced from contract terms; contract-to-Salesforce accuracy %PROVE IT WORKEDminutes saved per renewalNRR (net revenue retention)# of upsell opportunities surfacedfrom contract termscontract-to-Salesforce accuracy %

The steps

  1. 01

    Ingest PDFs three ways for the model

    Tool: Self-hosted service

    For every closed-won contract: extract raw text + run OCR + render to PNG. Send all three to the model. Opus reads the image, the text, the OCR, accuracy goes up dramatically vs any single input.

  2. 02

    Use a deterministic JS auditor, not just AI

    Tool: n8n + JavaScript

    Hard rules catch hallucinations cheaply. Example: if licenses = unlimited then seat_count must be null. If contract_value ≠ sum(line_items), flag. Anti-pattern called out in episode: stuffing PDFs into an agent and hoping.

  3. 03

    Loop low-confidence cases back through with context

    Tool: n8n

    When the auditor finds a mismatch, push the error message + scraped data back to the agent: "X doesn't reconcile with Y, re-evaluate." Only if it still fails does it route to a human.

  4. 04

    Human-in-loop only on the residual

    Tool: Slack notification

    Last audit before Salesforce write happens with a human, but only on the ~5% the auditor couldn't resolve. Push validated structured data into Salesforce custom fields.

  5. 05

    Layer upsell signals on top

    Tool: Salesforce + agent

    Once contract terms are structured, an agent watches calls + product usage. "Mentioned HRIS hub on the call 2 weeks ago, not in their plan" → tee up for AM. This is where NRR moves.

Tools in this playbook

  • Self-hosted service
  • n8n + JavaScript
  • n8n
  • Slack notification
  • Salesforce + agent

Next playbooks

Unfamiliar terms are defined in the AI and Revenue Dictionary. Related frameworks live in the framework library.

Share this playbook

Posting to Instagram or TikTok? Copy the link, it carries the title, summary and share image.

Arrives weekly by email. Free. Unsubscribe anytime. By subscribing you agree to our Privacy policy and Terms. We never sell or share the list.