Short answer: the Meta Pixel on your website sees a form fill. It never sees the dispatcher book the visit or the customer sign the estimate. The Meta Conversions API (CAPI) is how your CRM tells Facebook and Instagram ads which of those leads became booked jobs and sales, so Meta can look for more people like your paying customers instead of more people who like filling in forms. The old Offline Conversions API is gone: Meta said it “will be discontinued in May 2025” (Meta, Graph API v20.0 changelog). Offline sales now go through the Conversions API.
The one rule that catches most contractors: Meta only accepts an event if it happened in the last 7 days. If one event in an upload is older, “we return an error for the entire request and process no events” (Meta, server event parameters). A monthly spreadsheet export will not work. Booked and sold jobs have to leave your CRM at least daily, which means a connector, not a person with a CSV.
Using Jobber? The Jobber section shows the stages to send and what to ask your freelancer for. This is the Meta part of our guide to offline conversion tracking for contractors. The Google Ads side is covered in our Google Ads offline conversion import guide and in enhanced conversions for leads vs offline import.
What the Conversions API does for a contractor
Meta describes the Conversions API as a connection for marketing data “from an advertiser’s server, website platform, mobile app, or CRM to Meta systems” (Meta for Developers). Instead of a script in a visitor’s browser, your CRM or a connector sends events straight to Meta.
For a roofer, plumber or remodeler, there are two kinds of events to send:
- Website events, such as a quote form submitted. If you already have the Pixel, Meta lets you add the Conversions API for website events “in one click from Meta Events Manager, with no code, configuration, or setup fees” (Meta). That backs up the Pixel, but it still only counts form fills.
- Offline events: visit booked, estimate given, job sold. These happen in your office and on the job site, so only your CRM knows about them. This post is about these.
Every event has to say four things: what happened (for example “Job sold”), when it happened, where it happened (on the website, over the phone, in the CRM) and who the customer was, using details Meta can match to an account such as email and phone. Meta requires all four (Meta, server event parameters). Meta only uses an event for ad delivery if it can match it to a person: “You can use only matched events for ads attribution and ad delivery optimization” (Meta, Conversions API best practices). A booked job sent with no email, phone or click ID counts in a report and does nothing for your campaigns.
Two kinds of Meta leads, two setups
Where the lead came in decides what you have to save and which Meta features you can use.
| Lead form on Facebook or Instagram (Instant Form) | Your website form or a phone call from an ad | |
|---|---|---|
| Best identifier to save | The Meta Lead ID, 15 to 17 digits | The Meta click ID from the _fbc cookie, plus email and phone |
| What you send | Every lead stage as it changes, from new lead to converted | The booked and sold jobs, with job value if you have it |
action_source | system_generated, with event_source set to crm | A value that is not website, such as phone_call for a job booked over the phone |
| Conversion Leads optimization | Yes, if you meet Meta’s volume rules | No, Meta supports it only for Instant Forms |
Tell your freelancer or agency this:
- For Instant Form leads, save the Meta Lead ID on the client record in our CRM.
- For website form leads, save the Meta click ID (the
_fbccookie) in a hidden field, plus email and mobile number. - When a lead is booked for an estimate or signs, send that status to Meta automatically, the same day.
- Show me each week: Meta leads, estimates booked and jobs sold, from our CRM, next to what Meta reports.
Instant Form leads: Conversions API for CRM
Meta built a separate setup for this, the Conversions API for CRM. You keep “the 15-17 digit Meta Lead ID stored in your CRM”, and if a lead has none, you “send customer parameters like click ID, phone number, or email” (Meta, Conversions API for CRM). Stage names are yours to choose, and Meta asks you to “send all stages as they are updated, including the initial lead stage” (Meta, CRM payload specification). For a contractor that could be: new lead, contacted, estimate booked, sold.
The payoff is the Conversion Leads performance goal, which Meta says “is currently only compatible with Facebook/Instagram’s Lead Ads (Instant Forms)” and “may yield higher quality leads that are more likely to convert.” To use it you need to:
- “Generate at least 200 leads per month”
- pick a stage that converts at “between 1% and 40%” of leads and happens “within 28 days after you generate the leads”
- “upload data regularly at least once per day”
Meta puts the learning phase at 2 to 4 weeks. Estimate booked usually fits the 28-day rule better than sold, especially for remodeling jobs that take months to close.
Under 200 Instant Form leads a month: Conversion Leads is not open to you yet, and plenty of small shops never get there. Send the stages anyway: they show you which campaigns bring jobs and which bring tire-kickers. At 200 or more: test Conversion Leads with estimate booked as the stage once a few weeks of stage data are in.
Website and phone leads
When someone clicks your ad and lands on your site, Meta’s click ID is stored in a cookie called _fbc (Meta, customer information parameters). Your form needs to copy it into a hidden field so it reaches the CRM with the lead, together with email and phone. Calls are harder. A caller types nothing, so without call tracking that ties the call to the ad click, the job can only be matched on the phone number and whatever else you saved on the customer record.
The 7-day rule, and what it does not mean
“The event_time can be up to 7 days before you send an event” (Meta). For CRM stage events, event_time is when the stage changed in your CRM, and it “must occur after the lead generation time or else the event may be discarded” (Meta, CRM payload specification).
So the clock starts when the job is sold, not when the lead came in. A kitchen remodel lead from August that signs in October can still be sent, as long as the “sold” event leaves your CRM within a week of being marked. The risk is in the process: a CRM where the office updates statuses on Friday afternoons, a Zap that fails quietly for ten days, or an agency that uploads once a month. Meta recommends “uploading in real time or on a daily basis” (Meta, offline events).
A roofing example: the lead comes in from a Facebook ad on June 1, the inspection is booked June 4, and the contract is signed July 15. “Estimate booked” goes to Meta on June 4 and “Job sold” on July 15, each the day it happens. Both are accepted. Whether the July 15 sale shows up as credit to the June campaign is a separate question, below.
That is a different number from attribution. ServiceTitan’s help page, for example, says “Meta only credits a conversion to a campaign if the customer books within seven days of clicking the ad” (ServiceTitan Help). Sending on time and getting credit are two separate checks.
What your CRM can send today
ServiceTitan
ServiceTitan’s Marketing Pro has a Meta Ads integration that “pushes key job events into Meta Ads as conversions”, with “bookings and job completions” sent as separate conversion events (ServiceTitan Help). Its help page says it uses “Meta’s Offline Conversion Posting mechanism” and creates a dataset called “Marketing Pro Ads”. It matches customers “using email, phone number, or the Facebook Click ID”, and “Dynamic Call Tracking (DNI) is required to enable the attribution and conversion posting features”. It also sends a daily customer list to Meta as an audience. Limits worth knowing before you switch it on:
- “This integration does not currently track Facebook Lead Forms or Meta Instant Forms.”
- The dataset is picked at the ad set level and cannot be changed after the ad set is published.
- It overwrites the UTM parameters already on your ads, so check your other reports afterwards.
HubSpot
HubSpot syncs form submissions and lifecycle stage changes to Meta through the Conversions API, on Marketing Hub Starter (up to 5 events), Professional (50) and Enterprise (100) (HubSpot Knowledge Base, updated October 7, 2026). Two limits matter for contractors: “Submissions from non-HubSpot forms cannot be synced with Meta”, and “Meta only supports syncing lifecycle data from contacts who interacted with your lead generation campaigns.” In practice, HubSpot’s stage sync works for Instant Form leads; for website leads it sends the HubSpot form fill. HubSpot recommends sending “at least the default Email property for a better identity match.”
Jobber, other field service tools and spreadsheets
The usual route is Zapier’s Facebook Conversions app. Its Jobber triggers include “Quote Approved”, “Job Closed” and “New Invoice Created”, and its actions include “Send Lead Event” and “Send Purchase Event” (Zapier). Meta’s own CRM guide names it too: “use a no-code option: Zapier or another partner integration” (Meta, Conversions API for CRM). Because a Zap fires when the quote is approved, it keeps you inside the 7-day window without anyone remembering to upload. The catch: Jobber’s records need the email and phone, and ideally the Meta click ID or Lead ID, for Meta to match anything.
One way to map it, using those Zapier triggers (adjust to how your office actually works):
- New Request Created: the lead.
- Quote Approved: job sold, with the quote amount as the value.
- Job Closed or New Invoice Created: job done, if you also want completed revenue.
An “estimate booked” stage depends on how your team schedules inspections in Jobber, so check which trigger matches that step before you build the Zap. Compare the CRM side in our guide to CRM and marketing automation.
Event Match Quality: what the score can and cannot tell you
Meta scores how well your events match its accounts: “An event’s EMQ score (out of 10) indicates how effective your server event’s customer information may be at matching it to a Facebook or Meta account.” You see it per event in Events Manager (Meta, best practices).
The catch for contractors: “Event Match Quality is currently available only for web events.” For offline events and conversion leads, Meta’s page says to contact your Meta representative. So the score you see covers your website form events, not the booked jobs your CRM sends. For those, check how many events Meta reports as matched in Events Manager.
What raises matching is the same either way. Meta names email, IP address, first and last name, and phone as “high-quality customer information parameters.” It also treats some events as invalid, for example one that carries only first name and gender, or only city, state, ZIP, country, gender and browser (Meta). For a home service CRM that means:
- Every customer record has an email and a mobile number.
- Phone numbers include the country code. Meta: “Always include the country code as part of your customers’ phone numbers”, so (650) 555-1212 becomes 16505551212 before hashing (Meta).
- Email is trimmed and lowercased, then hashed with SHA-256. Most connectors do this for you.
- The Meta click ID and Lead ID are saved as they arrive and sent unhashed.
Pixel plus Conversions API without double counting
Double counting only happens when the same event goes to Meta twice, once from the browser and once from the server. Meta deduplicates when both use the same event_name and the same event ID, and “if they are received within 48 hours” (Meta, deduplication).
The simple fix for a contractor: let the Pixel (or its one-click server backup) send the form fill, and give the CRM events their own names, such as “Estimate booked” and “Job sold”. A booked job only ever comes from the CRM, so there is nothing to deduplicate. Trouble starts when a connector also sends “Lead” for every new CRM record while the Pixel is sending “Lead” for the same form. If you use HubSpot’s Pixel install, HubSpot’s setup tells you to remove any Pixel code added by hand to avoid duplicates (HubSpot).
Setting it up: the order that works
If an agency or developer does the build, these steps are the checklist to hold them to.
Pick the stages that matter. Two or three is enough: estimate booked, job sold, and for Instant Forms the first stage too. Decide whether you send the job value, and use the same number your books use.
Save the identifiers when the lead arrives. The Meta Lead ID for Instant Forms, the _fbc click ID in a hidden field for website forms, and email plus a mobile number on every record (Meta).
Choose the route. Your CRM’s built-in integration if it has one (ServiceTitan Marketing Pro, HubSpot), otherwise Zapier or a developer-built connection. Check which lead types it covers before you rely on it.
Test before you trust it. Meta’s offline events guide says to “Use the Test Events tool in Events Manager for testing your payload” (Meta). Mark a test job as sold and confirm it arrives.
Send at least daily. Set it to fire when the status changes, not on a schedule someone has to remember. Anything older than 7 days is rejected.
Compare and wait. Each week, match the jobs Meta shows against the jobs in your CRM from Meta ads. If you run Instant Forms and qualify, switch to the Conversion Leads goal only after data has built up; Meta estimates about a month from start to results (Meta).
Mistakes that make Meta learn the wrong thing
| Mistake | What happens | Fix |
|---|---|---|
| Old setup still sends to an offline event set | Meta retired the Offline Conversions API in May 2025, so those uploads stopped | Move to the Conversions API, or to your CRM’s current integration |
| Weekly or monthly batch uploads | Any event older than 7 days rejects the whole upload | Send when the status changes, at least daily |
| Phone numbers saved without country code | Fewer jobs match, quietly | Store numbers as +1 and ten digits |
| CRM sends “Lead” while the Pixel also sends “Lead” | The same form fill counts twice | Give CRM events their own names, or share an event ID |
| Only the final “sold” stage is sent for Instant Form leads | Meta expects every earlier stage to have been sent first | Send each stage as it happens |
| Optimizing for “sold” when it takes 60 days | Meta’s CRM optimization needs a stage that happens within 28 days | Optimize for estimate booked; still send sold |
For campaign setup on the ad side, see our guide to Facebook ads for electricians.
The bottom line
Meta can only aim at what you tell it about. Save the Meta Lead ID or click ID with every lead, keep a real email and phone number on every customer, and have your CRM send booked and sold jobs to the Conversions API the day they happen. If you run Instant Forms at volume, use those stages to switch on Conversion Leads. If you would rather have someone build and check this, it is part of our paid social management for contractors work.
About the sources: each fact links to the page it comes from. The main ones are Meta’s Conversions API for CRM guide, Meta’s server event parameters, Meta’s Conversions API best practices and ServiceTitan’s Meta Ads integration page. All read October 27, 2026. Meta renames menus and features often, so check the linked page if something has moved.