# Sources for the Dog Academy CAPI spec (website route)

All Meta pages were **accessed on 2026-09-28**. Where a page shows its own update date, it is given as "upd.".

How each kind of page was read:
- **Meta for Developers:** the Meta developer-docs search tool (`devtools_discovery`) and direct `WebFetch`.
- **Meta Business Help Center:** the Meta Ads MCP help-article reader, which returns the official article text. Direct `facebook.com` fetches return an error from this host.
- **Where the tool paraphrased,** the claims in the spec rely only on text that was quoted in the tool output.

Tags such as `[D1]` are cited in `DEV-SPEC.md`, `QA-RUNBOOK.md` and `event-contract.json`.

## Meta for Developers

| Tag | Page | URL | What it supports |
|---|---|---|---|
| D1 | Server Event Parameters (upd. Feb 12, 2026) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/parameters/server-event | The list of `action_source` values and their definitions. "By using the Conversions API, you agree that the action_source parameter is accurate…". "All action source values enable ad measurement and custom audience creation capabilities. All action sources enable ad optimization capabilities." `event_time` is at most 7 days old or the entire request errors. `event_source_url` is required for website events. `opt_out`, `referrer_url`, `data_processing_options`. Dedup: 48 hours, browser event favoured within 5 minutes. |
| D2 | Parameters (upd. Dec 13, 2025) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/parameters | Website events require `client_user_agent`, `action_source` and `event_source_url`; non-web events only `action_source`. Hashing requirements per key. |
| D3 | Customer Information Parameters | https://developers.facebook.com/documentation/ads-commerce/conversions-api/parameters/customer-information-parameters | Normalization for em, ph, fn, ln, ct, st, zp, country and external_id ("same format" on every channel). IP and user agent belong to "the browser corresponding to the event". |
| D4 | ClickID and the fbp and fbc Parameters | https://developers.facebook.com/documentation/ads-commerce/conversions-api/parameters/fbp-and-fbc | The `fbc` format. A server-generated value uses subdomainIndex 1 and "the timestamp when you first observed or received this fbclid". "We recommend sending the fbc parameter with every event." |
| D5 | Parameter Builder Library (upd. Jun 30, 2026); Get Started (upd. Jun 30, 2026); Workflow and Examples (upd. Mar 26, 2026) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/parameter-builder-library · …/parameter-builder-library/get-started · …/parameter-builder-library/workflow-and-examples | A server-side SDK exists for PHP, NodeJS, Java, Python and Ruby. `processRequest`, `getFbc`, `getFbp`, `getClientIpAddress`, `getNormalizedAndHashedPII`. The appendix format. "Do not override or adjust the _fbc or _fbp cookie". Hash only once. Cookie consent before calling. The server SDK can't write cookies. |
| D6 | facebook/capi-param-builder: PHP README and CHANGELOG (GitHub; Packagist `facebook/capi-param-builder-php` 1.3.2) | https://github.com/facebook/capi-param-builder/tree/main/php | The Laravel usage `processRequestFromContext($request->server->all())`, `getEventSourceUrl()`, `getReferrerUrl()`, PHP ≥ 7.4, and the cookie-setting loop. |
| D7 | Using the API (upd. Feb 6, 2026) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/using-the-api | The `POST /{API_VERSION}/{PIXEL_ID}/events` format and the access token. Up to 1,000 events per request. "If any event you send in a batch is invalid, we reject the entire batch". Test Events and `test_event_code`. "Events sent with test_event_code are not dropped… used for targeting and ads measurement purposes." Events can be verified within 20 minutes. |
| D8 | Best Practices – Conversions API (upd. Jun 28, 2026) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/best-practices | Offline events such as "phone calls" use an `action_source` that is "not website". "The action source is required to determine the campaign objectives for which the event is intended". Only matched events are used for attribution and optimization. The invalid parameter combinations. EMQ exists only for web events. Test with your own customer information. |
| D9 | Handling Duplicate Pixel and Conversions API Events | https://developers.facebook.com/documentation/ads-commerce/conversions-api/deduplicate-pixel-and-server-events | `fbq('track', …, {eventID})`. Dedup within 48 hours of the first event. The external_id/fbp fallback "only works for deduplicating events sent first from the browser and then through the server". |
| D10 | Conversions API End-to-End Implementation (upd. Jun 30, 2026) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/guides/end-to-end-implementation | Send within 1 hour. After 2 hours there can be a "significant decrease in performance". At 24 hours or more there are "significant issues". Send browser and server events to the same pixel ID. The redundant set-up. |
| D11 | Conversions API overview (upd. Feb 25, 2026) | https://developers.facebook.com/documentation/ads-commerce/conversions-api | "Offline events may be used for attributed offline events measurement, offline custom audience creation or measurement." |
| D12 | Sending Offline Events Using the Conversions API (upd. Jan 5, 2026) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/offline-events | The `physical_store` action source for store events. The `is_consolidated_container` check. Upload in real time or daily. The 62-day window applies to `physical_store` only. |
| D13 | Conversions API for CRM integration (upd. Dec 17, 2025) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/conversion-leads-integration | "The Conversion Leads performance goal is currently only compatible with Facebook/Instagram's Lead Ads (Instant Forms)." |
| D14 | Payload Specification (upd. Jun 28, 2026) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/conversion-leads-integration/payload-specification | "Currently, this optimization only supports native Lead Ads (Instant Forms)…". `system_generated`, `event_source=crm`, `lead_event_source`. |
| D15 | 3: Developer Implementation (upd. Jun 28, 2026) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/conversion-leads-integration/crm-integration/3-implementing-the-crm-integration | "Refrain from using this payload specification for other event types, such as website leads." Events that "do not match a Meta lead ad… will not be used for training the model". Click ID and hashed email have Highest priority. |
| D16 | FAQs (upd. Mar 24, 2026) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/conversion-leads-integration/faq | "Use native lead ads (Instant Forms or Website Forms)". "Send the lead_id or PII for matching". 28 days; 1–40%; daily uploads. |
| D17 | Conversions API for CRM: Integrate as a Platform (upd. May 5, 2026) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/guides/conversions-api-crm-for-platforms | The CRM example payload without `lead_id`, using hashed em and ph. Onboarding takes about 1–2 months. |
| D18 | Dataset Quality API (upd. Jun 28, 2026); for offline events (upd. Feb 27, 2026) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/dataset-quality-api · …/dataset-quality-api/offline-events | The `dataset_quality` endpoint and EMQ examples. Event coverage is the "7-day average percent of Pixel events that are covered by the Conversions API". `dedup_key_feedback`, `data_freshness`. The system-user "Manage Pixel" assignment. |
| D19 | Ads Pixel Stats (upd. Dec 10, 2025) | https://developers.facebook.com/documentation/ads-commerce/marketing-api/reference/ads-pixel/stats | `GET /{pixel-id}/stats`, `aggregation=event`, `event_source=SERVER_ONLY`. Data "up to seven days from the request time". |
| D20 | Ad Account, Custom Conversions (upd. Jan 22, 2025) | https://developers.facebook.com/documentation/ads-commerce/marketing-api/reference/ad-account/customconversions | `action_source_type` values include `phone_call`. `event_source_id`. `rule`. |
| D21 | Meta Pixel: Conversion Tracking | https://developers.facebook.com/documentation/meta-pixel/implementation/conversion-tracking | Custom event names are at most 50 characters. From 2025-09-02, custom conversions that suggest health conditions or financial status are flagged and can't be used in new campaigns. |
| D22 | Meta Pixel reference (standard events) | https://developers.facebook.com/docs/meta-pixel/reference | Definitions of Lead, Schedule ("books an appointment…"), Contact, Purchase (value and currency required). eventID as the 4th argument. |
| D23 | Meta Pixel: Advanced Matching | https://developers.facebook.com/docs/meta-pixel/advanced/advanced-matching | `fbq('init', id, {em, fn, ln, ph, external_id, ge, db, ct, st, zp, country})`. Values are hashed automatically by the pixel. It accepts unhashed lowercase or SHA-256 email. |
| D24 | Data Processing Options (Limited Data Use) | https://developers.facebook.com/docs/marketing-apis/data-processing-options | LDU through CAPI (`["LDU"]`, country/state `0` for geolocation, `1`/`1000` for California) and through the pixel (`fbq('dataProcessingOptions', …)` before `init`). The covered US states. |
| D25 | Ad Account, Ad Sets reference | https://developers.facebook.com/documentation/ads-commerce/marketing-api/reference/ad-account/adsets | `execution_options` `validate_only` "will not perform the mutation". `attribution_spec` event types. `destination_type` values. |
| D26 | Ad Set Promoted Object; Ad Campaign Message Delivery Estimate | https://developers.facebook.com/documentation/ads-commerce/marketing-api/reference/ad-promoted-object · https://developers.facebook.com/documentation/ads-commerce/marketing-api/reference/ad-campaign/message_delivery_estimate | `custom_conversion_id`, `offline_conversion_data_set_id`. `lead_ads_form_event_source_type` has values including `offsite_crm` and `offsite_web` (semantics undocumented). `lead_ads_selected_pixel_id`. |
| D27 | Marketing API changelog | https://developers.facebook.com/documentation/ads-commerce/marketing-api/marketing-api-changelog | v25.0 released 2026-02-18 is the latest. v24.0 expires 2026-10-06. |
| D28 | AppendAttribution (guide) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/guides/append-attribution | A beta with limited access, Purchase-based. Not applicable to DA now. |
| D29 | Call Ads (upd. May 21, 2026) | https://developers.facebook.com/documentation/ads-commerce/marketing-api/call-ads | `QUALITY_CALL` with destination `PHONE_CALL`, for calls placed from the ad. Not DA's outbound-call outcomes. |
| D30 | Original Event Data Parameters (upd. Oct 28, 2024) | https://developers.facebook.com/documentation/ads-commerce/conversions-api/parameters/original-event | Exists (event_name, event_time, order_id, event_id). Not needed for this build. |

## Meta Business Help Center

| Tag | Article | URL | What it supports |
|---|---|---|---|
| H1 | About performance goals for lead ads | https://www.facebook.com/business/help/782657799338685 | Qualified leads "can be used with both website forms and instant forms". Website forms: −9.5% cost per quality lead (69 advertisers, Aug 21–Sep 14, 2025). From April 2026 the goal needs a Conversions API integration for new campaigns. The value goal for lead ads. |
| H2 | Performance goals available by ad objective and conversion location | https://www.facebook.com/business/help/416997652473726 | Leads → Website: "maximize number of leads" and "maximize number of qualified leads". Website and calls, and Website and instant forms: qualified leads. |
| H3 | Available conversion locations and events by objective | https://www.facebook.com/business/help/2035196646663270 | Leads → Website events: complete registration, contact, find location, lead, **schedule**, search, start trial, submit application, subscribe, view content. The Sales and Website-and-in-store event lists. |
| H4 | About conversion locations and events | https://www.facebook.com/business/help/1431172887335181 | "The conversion location is the place where your desired business outcome will occur". Omnichannel is used for physical channels. |
| H5 | Set up your CRM for qualified leads | https://www.facebook.com/business/help/279369167153556 | Connecting a CRM (Ads Manager or Events Manager → CRM → create or choose a dataset). |
| H6 | Qualified leads (metric) | https://www.facebook.com/business/help/344136647998618 | "The crm events sent to meta platform are used to calculate the metric". It is "in development". |
| H7 | About attribution models and attribution settings | https://www.facebook.com/business/help/460276478298895 | Standard, incremental and custom models. For website and in-store: 1- or 7-day click, 1-day view, 1-day engage-through. The settings "inform ad optimization and determine which conversions can be credited". |
| H8 | Set up engage-through in Meta Ads Manager | https://www.facebook.com/business/help/1055388958765938 | The Leads/Sales → Website attribution options: click-through 1-day or 7-day; view-through none or 1-day; engage-through 1-day. |
| H9 | Compare attribution settings in Meta Ads Reporting | https://www.facebook.com/business/help/654970342692714 | 28-day click is available for comparison "regardless of the ones you chose to optimize for". |
| H10 | How conversions are attributed in Commerce Manager | https://www.facebook.com/business/help/1997130013754737 | The Ads Manager default "7-day click or 1-day view" and the available options. |
| H11 | About offline conversions | https://www.facebook.com/business/help/1142103235885551 | Offline conversions (store purchases, phone orders, bookings) are used for measurement and audiences. |
| H12 | About standard and custom events for Meta offline conversions | https://www.facebook.com/business/help/3182661985172509 | "You can't use custom events for optimization or custom audiences", only custom conversions and attribution. Custom offline events need review. English CamelCase names. |
| H13 | Best practices for offline events data | https://www.facebook.com/business/help/1798506233494677 | Specify the action source. Upload daily. Matched against impressions "for events that occurred within 1, 7 or 28 days of an impression". One event per order. |
| H14 | Create a custom conversion for offline events | https://www.facebook.com/business/help/182135238967018 | An offline custom conversion only applies to data uploaded after it was created. |
| H15 | Create an omnichannel ad campaign in Meta Ads Manager | https://www.facebook.com/business/help/8975791382450840 | "Website and in-store" is Sales only, Purchase only, and needs quality offline events. Its attribution options. |
| H16 | Store sales optimization | https://www.facebook.com/business/help/219583342205431 | Removed on July 15, 2022 (background). |
| H17 | About lead ads with calling | https://www.facebook.com/business/help/378168646496279 | Call ads optimize for calls placed from the ad. Website and calls optimizes for website events plus calls. |
| H18 | About custom conversions for web; Use custom conversions to filter events; Best practices for custom conversion setup | https://www.facebook.com/business/help/780705975381000 · https://www.facebook.com/business/help/462806641140703 · https://www.facebook.com/business/help/2375212726097833 | Parameter-based rules. Web custom conversions can be performance goals "once we've received this custom conversion enough times". The limit is 100 per ad account. |
| H19 | About event match quality | https://www.facebook.com/business/help/765081237991954 | EMQ applies to website CAPI events only. It is scored 0–10 on the last 48 hours. Parameter priorities. The Business Tools Terms bar sensitive data and require hashing. |
| H20 | View server event details in Meta Events Manager; Monitor and improve your Conversions API setup | https://www.facebook.com/business/help/1541268312717919 · https://www.facebook.com/business/help/586304118741779 | "Aim for a 75% event coverage ratio". Server count should equal or exceed pixel count. The dedup-key overlap tab. The data freshness tab. |
| H21 | Test your server events using the Test Events tool; Test Events tool for browser events | https://www.facebook.com/business/help/1624255387706033 · https://www.facebook.com/business/help/2040882565969969 | The CRM test flow needs an **instant form**. Browser activity is only recorded while the Test Events page is open. Data kept for 24 hours. Cleared activity still appears in reporting and audiences. |
| H22 | Implement Conversions API using personalized instructions | https://www.facebook.com/business/help/232481544843294 | Events Manager → dataset → Manage integrations → "generate access token". |
| H23 | Compare Conversions API setup options | https://www.facebook.com/business/help/433493041367251 | Meta-enabled CAPI (one click, web only). A direct integration takes "2 to 4 weeks". Only a direct integration covers offline events. |
| H24 | Domain verification: about; verify your domain; troubleshoot | https://www.facebook.com/business/help/286768115176155 · https://www.facebook.com/business/help/321167023127050 · https://www.facebook.com/business/help/340070217802345 | The meta-tag, HTML-file and DNS TXT methods. The root domain covers subdomains. The crawler doesn't run JavaScript. Another Business may already have verified the domain. Verification markers can be removed afterwards. |
| H25 | About prohibited information | https://www.facebook.com/business/help/361948878201809 | Health information includes "mental health and psychological states" and "physical locations that identify a health condition". Names and criteria must not imply prohibited information. You can remove the pixel from specific pages. UTMs can leak prohibited data. |
| H26 | About core setup | https://www.facebook.com/business/help/124742407297678 | Core setup strips custom parameters and URL paths. Custom events must be reviewed. |
| H27 | Understand data sharing restrictions based on data source categories | https://www.facebook.com/business/help/511197658391698 | Categories can impose core setup, restrictions on "specific mid and lower funnel events", or full restrictions. |
| H28 | About learning limited; Cost per optimization event | https://www.facebook.com/business/help/269269737396981 · https://www.facebook.com/business/help/1707952432550214 | About 50 optimization events in the week after the last significant edit. Choosing "an optimization event that occurs more frequently". |
| H29 | Specifications for dynamic URL parameters | https://www.facebook.com/business/help/2360940870872492 | `{{campaign.id}}`, `{{adset.id}}`, `{{ad.id}}` and others. Meta may automatically add `utm_source` facebook or instagram. |

## Internal (read-only)

| Tag | File | Used for |
|---|---|---|
| I1 | `../../meta-lead-funnel-2026-09-25/tracking/TRACKING-STACK.md` | The current pixel install, `tk-fb.js`, cookies, `__ussa`, program pages without a pixel, number swapping, the Laravel/Livewire/AWS stack, the domain tag |
| I2 | `../../meta-lead-funnel-2026-09-25/flow/LEAD-FLOW.md` | The 22-step quiz, the email-step partial lead, the redirect to the scheduler and the login wall, Heyflow, the PSD forms |
| I3 | `../../meta-lead-funnel-2026-09-25/capi/META-LEAD-TO-PURCHASE-OPTIMIZATION.md` and `event-spec.json` | The earlier CAPI research: CRM gates, stage names, the backfill rule, the call script (sale made on the consultation call) |
| I4 | `../../meta-lead-funnel-2026-09-25/PLAN-TODO.md` | Locked operator decisions, the Phase 2 scope, the §3.3 statement corrected in DEV-SPEC §0.1 |
| I5 | `../../meta-lead-funnel-2026-09-25/RESEARCH-SUMMARY.md` | TFL refund terms (100% within 30 days); refunds as the top complaint |
| I6 | `../../../NOTES.md` (brands/dog-academy) | The hard rules: never state the TFL price, optimize only to leads that buy, the website quiz as destination, the $10k test budget |
| I7 | `../../meta-lead-funnel-2026-09-25/meta-account/META-ACCOUNT-READBACK.md` | The connector's `Invalid dataset_id` for 481578137302100 (the access blocker) |

## Practitioner colour (not evidence)

Reddit returns an error from this host (both earlier and today), so there is no Reddit input. The X posts below come from the 2026-09-25 research (accessed that day) and are colour only:

- Ivan Falco, X, 2026-08-19: campaigns start on Lead and climb stage by stage because "each objective is a proxy you tolerate until the real signal has volume". The excerpt was only partially verified. https://x.com/itsivanfalco/article/2090117520858747291
- Chris Edwards, X, 2026-06-28: "~200 form fills, not one of which has been legit". This is the junk-form-fill risk behind the no-form-fill rule. https://x.com/toph_edwards/status/2071279961055572161

## Claims marked UNVERIFIED

See DEV-SPEC Appendix B and `event-contract.json → unverified`. The two that decide the plan are:
- **U1:** whether a Website ad set can optimize on non-website events. The docs imply it can't.
- **U2:** whether qualified leads works for website forms in DA's account. The Help Center and developer docs conflict.

Both are closed by Gate 0.
