Skip to content

Jobber Integration

The Jobber integration connects your Jobber account to Adva via OAuth and the Jobber GraphQL API. Once connected, Adva syncs your Jobber data automatically and maps it to the Adva data model.

Jobber EntityAdva EntityDirection
ClientsCustomersJobber → Adva
PropertiesLocationsJobber → Adva
QuotesProposals + Line ItemsJobber → Adva
JobsJobsJobber → Adva
InvoicesInvoicesJobber → Adva
Team MembersTeam MembersJobber → Adva
Line ItemsProducts (derived)Jobber → Adva

Sync is currently one-way: Jobber to Adva. Changes made in Adva are not pushed back to Jobber.

  • A Jobber account with admin access
  • Your Adva business must be on a plan that supports integrations

Navigate to Settings > Integrations in the Adva web app. Click Connect next to Jobber. This redirects you to Jobber’s authorization page.

Sign in to your Jobber account if prompted, then click Allow to grant Adva read access to your data. Jobber redirects you back to Adva automatically.

After authorization, Adva runs an initial full sync of all your Jobber data. This typically takes a few minutes depending on the size of your account. You can monitor progress on the Integrations settings page.

A full sync pulls all records from Jobber using cursor-based pagination. It runs:

  • Automatically after the initial connection
  • When you click Sync Now on the Integrations page
  • On a configurable schedule (default: daily)

After the initial full sync, Adva listens for Jobber webhooks to pick up changes in real time. When Jobber notifies Adva of a change, only the affected record is re-fetched and updated.

If the same record is modified in both Jobber and Adva between syncs, the Jobber version takes precedence during the next sync (last-write-wins from Jobber’s perspective).

Jobber FieldAdva FieldNotes
firstNamefirst_name
lastNamelast_name
companyNamecompany_name
isCompanycustomer_typetruecommercial, falseresidential
emails[0]emailPrimary email
phones[0]phonePrimary phone
billingAddressAddress fieldsMapped to street_line_1, city, state, postal_code, country
Jobber FieldAdva FieldNotes
addressAddress fieldsFull address breakdown
client.idcustomer_external_idLinks location to the customer
Jobber FieldAdva FieldNotes
quoteNumberproposal_number
titleproject_type
quoteStatusstatusSee status mapping below
client.idcustomer_external_id
amounts.totalfinal_price
lineItems[]Proposal ItemsEach line item becomes a proposal_item

Quote Status Mapping:

Jobber StatusAdva Status
DRAFTdraft
AWAITING_RESPONSEsent
APPROVEDapproved
CONVERTEDapproved
REJECTEDrejected
ARCHIVEDexpired
Jobber FieldAdva FieldNotes
jobNumberjob_number
titlename
jobStatusstatusSee status mapping below
client.idcustomer_external_id
quote.idproposal_external_idLinks job to original quote
startAtscheduled_date + scheduled_start_timeSplit into date and time
endAtscheduled_end_time

Job Status Mapping:

Jobber StatusAdva Status
IN_PROGRESSin_progress
ACTIVEin_progress
LATEin_progress
REQUIRES_INVOICINGcompleted
ON_HOLDpending
UNSCHEDULEDpending
ARCHIVEDcancelled
Jobber FieldAdva FieldNotes
invoiceNumberinvoice_number
subjectnotes
client.idcustomer_external_id
amounts.subtotalsubtotal
amounts.totaltotal_amount
amounts.depositAmountdiscountMapped as deposit credit
Jobber FieldAdva FieldNotes
name.firstfirst_name
name.lastlast_name
emailemail
phonephone
roleroleSee role mapping below

Role Mapping:

Jobber RoleAdva Role
ADMINadmin
MANAGERmanager
WORKERproduction
VIEWERsales_rep
CONTRACTORproduction

Adva derives products from Jobber quote line items. Unique product names across all quotes are extracted and created as products in Adva with the most recent pricing.

Terminal window
# List all integration connections
GET /api/v1/integrations
# Create a new connection (returns OAuth redirect URL)
POST /api/v1/integrations
{
"provider": "jobber"
}
# Get connection status
GET /api/v1/integrations/:id
# Trigger a full sync
POST /api/v1/integrations/:id/sync
# Disconnect
DELETE /api/v1/integrations/:id

The OAuth callback endpoint is called by Jobber after the user authorizes the connection:

GET /api/v1/integrations/oauth/jobber/callback?code=AUTH_CODE&state=ENCODED_STATE

This endpoint is unauthenticated — it validates the state parameter to prevent CSRF.

Jobber sends webhooks to notify Adva of data changes:

POST /api/v1/webhooks/jobber

This endpoint is unauthenticated — it validates the webhook signature using HMAC-SHA256.

The following environment variables are required for the Jobber integration:

VariableDescription
JOBBER_CLIENT_IDOAuth client ID from Jobber Developer Center
JOBBER_CLIENT_SECRETOAuth client secret
JOBBER_REDIRECT_URIOAuth callback URL (e.g., https://api.getadva.ai/api/v1/integrations/oauth/jobber/callback)
JOBBER_WEBHOOK_SECRETWebhook signing secret for HMAC verification
INTEGRATION_ENCRYPTION_KEY32-byte hex key for encrypting stored OAuth tokens
  1. Go to Jobber Developer Center
  2. Create a new app
  3. Set the redirect URI to your Adva instance’s OAuth callback URL
  4. Copy the Client ID and Client Secret to your environment
  5. Configure webhooks to point to your Adva webhooks endpoint
  • Verify JOBBER_CLIENT_ID and JOBBER_CLIENT_SECRET are correct
  • Ensure the redirect URI in Jobber Developer Center exactly matches JOBBER_REDIRECT_URI
  • Check that the Jobber user has admin access
  • Only entity types with data in Jobber will appear in Adva
  • Properties require a linked client — orphaned properties are skipped
  • Quotes without a client are skipped
  • Webhook delivery can be delayed — try clicking Sync Now for immediate results
  • Verify the webhook endpoint is accessible from Jobber’s servers
  • Check the sync log on the Integrations settings page for errors