---
title: "Jobber"
url: https://docs.light-ai.app/integrations/jobber.md
canonical_url: https://docs.light-ai.app/integrations/jobber
last_updated: 2026-10-13
summary: "Light AI leads become Jobber requests and approved quotes become Jobber clients and quotes, through Zapier's Jobber app or n8n with Jobber's GraphQL API."
api_status: beta
related:
  - https://docs.light-ai.app/integrations
  - https://docs.light-ai.app/inbound
  - https://docs.light-ai.app/webhooks
  - https://docs.light-ai.app/external-refs
---

# Jobber

> Light AI leads become Jobber requests and approved quotes become Jobber clients and quotes, through Zapier's Jobber app or n8n with Jobber's GraphQL API.

| Direction | Path | How |
| --- | --- | --- |
| Leads → Light AI | **via Zapier** · **via n8n** | Zapier: Jobber **New Request Created** → Webhooks by Zapier → `POST /v1/leads` with `source: jobber` and the request id as `external_ref`. n8n: a Jobber `REQUEST_CREATE` webhook → fetch the request through GraphQL → the same call. |
| Light AI → Jobber | **via Zapier** · **via n8n** | `lead.created` → Zapier **Find or Create Client** + **Create Request**. `quote.approved` → `clientCreate` in n8n (template) or Zapier **Create Quote**, then write the Jobber id back. Approvals made in Jobber (Zapier **Quote Approved**) → `POST /v1/quotes/{id}/mark_approved`. |

## Set up (n8n)

1. Create an app in the Jobber Developer Center (OAuth 2.0) and connect it to the contractor's Jobber account. It can stay in Draft for your own clients.
2. Import the template, set the OAuth2 credential and set the GraphQL version header to a version that is still active (check Jobber's API changelog).
3. Filter events whose `origin.source_system` is `jobber` so your own writes do not echo back.

## Light AI → Jobber

| Jobber | Light AI |
| --- | --- |
| Client `firstName`, `lastName` | `contact.first_name`, `contact.last_name` (or `client.*` on quotes) |
| `emails[]`, `phones[]` | `email`, `phone` |
| `billingAddress`: `street1`, `street2`, `city`, `province`, `postalCode`, `country` | `address.line1`, `line2`, `city`, `region`, `postal_code`, `country` |
| Request title and details / note | `source_detail`, `message`, `service_interest`, form answers (`lead.form_answers`, see [Website request forms](https://docs.light-ai.app/forms)) and `project.app_url` |
| Quote line items: name, quantity, unit price | `line_items[]`: `name`, `quantity`, `unit_price_cents / 100` |

## Notes

- API access: a Developer Center app in Draft can connect to at most 5 paying Jobber accounts; beyond that Jobber must approve it. Jobber advertises a guided API walkthrough on its Plus plan and third-party guides report the API is limited to Plus; confirm the contractor's plan with Jobber before building on GraphQL.
- Zapier is the simpler path for one contractor: Jobber's Zapier app has the request, client, quote and note actions above. Webhooks by Zapier needs a paid Zapier plan.
- `unit_price_cents` is `null` for lines priced as a whole (e.g. mini lights by the set): send quantity 1 and `total_cents` instead.
- Photos and instant previews: webhook payloads carry only asset ids (`assets.photos[]`, `assets.mockups[]` with `url: null`). Fetch `GET /v1/leads/{id}` for links that expire after 60 minutes and download the files if the CRM can store them; otherwise store `project.app_url` (sign-in required). Never save a 60-minute link in a CRM.

## Download

- [quote-approved-to-jobber.json](https://docs.light-ai.app/downloads/n8n/quote-approved-to-jobber.json)

## Sources

- [Custom integrations (Draft apps)](https://developer.getjobber.com/docs/custom_integrations/)
- [App review process](https://developer.getjobber.com/docs/publishing_your_app/app_review_process/)
- [Queries and mutations](https://developer.getjobber.com/docs/using_jobbers_api/api_queries_and_mutations/)
- [Jobber on Zapier](https://zapier.com/apps/jobber/integrations)
