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
- Google Drive — Watch Files
- Google Drive — Download a File
- HTTP — Make a Request
- JSON — Parse JSON
- Filter —
data.seller.nameexists - HubSpot — Search / List Companies (or Search CRM)
- Router
- Route A: company found → Update a Company
- Route B: not found → Create a Company
- Optional: HubSpot — Create a Note associated to the company
- 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
| Setting | Value |
|---|---|
| URL | https://api.cryvis.com/v1/documents/invoice |
| Method | POST |
| Body type | Multipart/form-data |
Field file | Drive binary |
| Header | Authorization: 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
| Use | Path |
|---|---|
| Company name | data.seller.name |
| Tax ID / VAT | data.seller.tax_id |
| Match key preference | tax_id if present, else normalized name |
| Note body | invoice_number, amount_due, currency, due_date |
| Skip | empty 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
- If
data.seller.tax_idis non-empty → search custom propertytax_id(exact). - Else search Company name (equals, then contains as a second attempt if you add another route).
- If still nothing → Create.
- If multiple hits on name search → Slack
#crm-datawith invoice file + candidate IDs; skip auto-update.
Do not key HubSpot companies off invoice_number. Invoice numbers identify documents, not vendors.
Configure destination
Search
Search Companies where:
- Custom property
tax_idequalsdata.seller.tax_id(if tax_id present), else - Name equals / contains
data.seller.name
Create a Company (Route B)
| HubSpot property | Mapping |
|---|---|
| Company name | data.seller.name |
| Tax ID (custom) | data.seller.tax_id |
| Type / Lifecycle | Vendor (constant) if you use that property |
| Description | Source: 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.namenot 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
- New vendor PDF → Company created, properties match
seller.*. - Second invoice same vendor → Search hits, Update path, no duplicate company.
- Invoice missing seller name → Filter stops; no HubSpot write.
- Two HubSpot companies with similar names → confirm your search rule (tax_id first) picks the right one.
- 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_amountcustom properties frominvoice_date/amount_dueon 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.