Integrations
HubSpot
Contacts, notes and deals from Light AI leads and quotes through n8n and HubSpot's CRM API, which works on every HubSpot tier, Free included.
| Direction | Path | How |
|---|---|---|
| Leads → Light AI | via n8n · via Zapier | A HubSpot trigger (form submission or new contact) in Zapier, or n8n's HubSpot Trigger (needs a HubSpot developer app) → POST /v1/leads with source: hubspot and external_ref: { system: "hubspot", id: <contact id> }. A workflow Send a webhook action also works but needs Data Hub Professional or Enterprise. |
| Light AI → HubSpot | via n8n | Contact (and a note) on lead.created; deal on quote.published keyed on project.id; closed-won on quote.approved; closed-lost on quote.declined / quote.expired. The template creates a closed-won deal on approval. |
Lead → contact and note#
| HubSpot | Light AI |
|---|---|
firstname, lastname, email, phone | contact.first_name, contact.last_name, contact.email, contact.phone |
address, city, state, zip, country | address.line1, address.city, address.region, address.postal_code, address.country |
A custom property (e.g. light_ai_source) | source, source_detail (HubSpot sets its own original-source fields) |
Note (hs_note_body) on the contact | message, service_interest, form answers (lead.form_answers, see Website request forms) and project.app_url |
Quote → deal#
| HubSpot | Light AI |
|---|---|
dealname | Customer name and site address |
amount | totals.total.decimal |
pipeline, dealstage | default; closedwon / closedlost (custom pipelines have their own stage ids) |
closedate | approved_at or declined_at |
Line items: name, quantity, price | line_items[]: name, quantity, unit_price_cents / 100 |
description | links.app_url |
Notes#
- Credential: a legacy private app token or a service key (public beta since February 2026; REST calls only, no webhooks). Both are Bearer tokens for n8n's HubSpot App Token credential. Scopes:
crm.objects.contacts.write,crm.objects.deals.write, pluscrm.objects.line_items.writefor line items. - Write the deal id back on the project so later events update the same deal.
unit_price_centsisnullfor lines priced as a whole (e.g. mini lights by the set): send quantity 1 andtotal_centsinstead.- Photos and instant previews: webhook payloads carry only asset ids (
assets.photos[],assets.mockups[]withurl: null). FetchGET /v1/leads/{id}for links that expire after 60 minutes and download the files if the CRM can store them; otherwise storeproject.app_url(sign-in required). Never save a 60-minute link in a CRM.