← Back to blog

Extract Vendor Details from Invoices into HubSpot

Make.com: Drive → Cryvis Invoice API → HubSpot Create/Update Company from seller.name, tax_id, and related invoice fields.

What we're building

Invoices are a clean source of vendor master data. This scenario watches a Drive folder, extracts the invoice with Cryvis, and creates or updates a HubSpot Company from data.seller so CRM vendor records stay aligned with what finance actually receives.

Google Drive: Watch Files (/Vendors/Invoices)
        |
        v
Google Drive: Download a File
        |
        v
HTTP: POST https://api.cryvis.com/v1/documents/invoice
  Bearer auth + multipart file
        |
        v
JSON: Parse JSON
        |
        v
Filter: seller.name is not empty
        |
        v
HubSpot: Search Companies (by name or tax id)
        |
        +--[found]----> HubSpot: Update a Company
        |
        +--[not found]-> HubSpot: Create a Company
        |
        v
(optional) HubSpot: Create a Note / Engagement
           "Invoice {{invoice_number}} for {{amount_due}}"

What you need

  • Make.com with Google Drive + HubSpot CRM connections (Companies write scope)
  • Drive inbox folder for vendor invoices
  • HubSpot Company properties you are allowed to write (name, plus custom tax ID if you use one)
  • Cryvis API key — Invoice API
  • Sample invoices from at least two vendors

Credits: 1 per PDF page or image.

Create the scenario

  1. Google Drive — Watch Files
  2. Google Drive — Download a File
  3. HTTP — Make a Request
  4. JSON — Parse JSON
  5. Filterdata.seller.name exists
  6. HubSpot — Search / List Companies (or Search CRM)
  7. Router
    • Route A: company found → Update a Company
    • Route B: not found → Create a Company
  8. Optional: HubSpot — Create a Note associated to the company
  9. Optional: Google Sheets — Add a Row audit log

Exact HubSpot module names vary slightly by Make app version; the pattern is Search → Create or Update.

Configure source

Watch a folder that only finance uses for new vendor paperwork or all inbound invoices — your choice.

If the folder mixes customer invoices (you are the seller) and vendor bills (you are the buyer), Filter on data.buyer.name matching your legal entity before treating seller as a HubSpot Company. Wrong-way invoices will create customer companies under the vendor pipeline.

Configure Cryvis HTTP

SettingValue
URLhttps://api.cryvis.com/v1/documents/invoice
MethodPOST
Body typeMultipart/form-data
Field fileDrive binary
HeaderAuthorization: Bearer <API_KEY>

Reference: extractInvoice.

Seller object (typical):

"seller": {
  "name": "Acme Cloud Services",
  "tax_id": "US12-3456789"
}

Also keep invoice_number, invoice_date, currency, amount_due for the optional Note / audit row. You are not required to sync line_items into HubSpot for this workflow.

Process response

UsePath
Company namedata.seller.name
Tax ID / VATdata.seller.tax_id
Match key preferencetax_id if present, else normalized name
Note bodyinvoice_number, amount_due, currency, due_date
Skipempty seller.name

Normalize names before search: trim whitespace, collapse double spaces. HubSpot search is sensitive to “Acme Cloud” vs “Acme Cloud Services Ltd”.

Match strategy that works in practice

  1. If data.seller.tax_id is non-empty → search custom property tax_id (exact).
  2. Else search Company name (equals, then contains as a second attempt if you add another route).
  3. If still nothing → Create.
  4. If multiple hits on name search → Slack #crm-data with invoice file + candidate IDs; skip auto-update.

Do not key HubSpot companies off invoice_number. Invoice numbers identify documents, not vendors.

Configure destination

Search Companies where:

  • Custom property tax_id equals data.seller.tax_id (if tax_id present), else
  • Name equals / contains data.seller.name

Create a Company (Route B)

HubSpot propertyMapping
Company namedata.seller.name
Tax ID (custom)data.seller.tax_id
Type / LifecycleVendor (constant) if you use that property
DescriptionSource: Cryvis invoice {{invoice_number}}

Update a Company (Route A)

Update tax_id when incoming is non-empty and stored is empty. Avoid blindly overwriting a human-curated legal name with a short trading name from a PDF — prefer filling blanks only, or write to a custom property invoice_trade_name.

Optional Note

Associate to Company ID from Create/Update:

Invoice {{data.invoice_number}}
Date {{data.invoice_date}} | Due {{data.due_date}}
Amount due {{data.currency}} {{data.amount_due}}
File {{drive.filename}}

Filters and error handling

  • MIME Filter before HTTP.
  • Filter seller.name not empty before HubSpot.
  • Router: length(search_results) > 0 → Update; else Create.
  • Ambiguous search (multiple companies): do not auto-update — Error Handler / Slack with candidates, or take the first only if you accept risk.
  • HTTP failures: error handling patterns; do not create empty HubSpot companies.
  • HubSpot rate limits: space Watch intervals; backfill with a manual Run once queue.

Test

  1. New vendor PDF → Company created, properties match seller.*.
  2. Second invoice same vendor → Search hits, Update path, no duplicate company.
  3. Invoice missing seller name → Filter stops; no HubSpot write.
  4. Two HubSpot companies with similar names → confirm your search rule (tax_id first) picks the right one.
  5. Credits: one page PDF → one credit; HubSpot operations do not change Cryvis billing.

CRM hygiene checklist

  • Set Company Type (or a custom vendor_flag) on create so sales views can exclude them.
  • Write last_invoice_date / last_invoice_amount custom properties from invoice_date / amount_due on every successful run — useful for vendor activity without opening Sheets.
  • Never map buyer.* into Company name; that is usually your own legal entity.
  • If you also sync contacts, do that in a separate scenario from email signatures — invoice seller blocks rarely include a reliable person email.

For the HTTP multipart mechanics shared by all of these flows, see Send multipart/form-data and Add Bearer authentication.

Production considerations

  • Ownership: Companies created by Make should use a dedicated HubSpot owner (AP bot) so sales pipelines stay clean.
  • GDPR / data minimization: tax IDs are sensitive — restrict HubSpot property permissions.
  • Pair with AP Slack routing if high-value vendors need human review before CRM write.
  • Idempotent Drive archive after success so Watch Files does not re-create Notes forever.
  • Soft-delete / merge: if HubSpot already has duplicates, fix them in CRM first. Automation that Creates on every fuzzy miss will make merges worse.
  • Property history: HubSpot tracks changes — Prefer Update-empty-only for legal name so you can see who last changed tax_id (bot vs human).

When the same vendor invoices under slightly different letterheads, tax_id matching is the only reliable join. If tax_id is absent on both the PDF and HubSpot, schedule a monthly human review of Companies created that month with Type = Vendor.

Next steps

Full AP inbox in Airtable: Automate invoice processing. Header → Sheets: Extract invoice data. Field mapping patterns: Map API JSON fields.

Invoice product · extractInvoice · Make.com document extraction hub.