The browser setup path completes after Plainrouter receives a real eligible arrival. Managed-hostname setup can also recognize qualifying verified server revenue. The identity-free server verification event is a diagnostic and does not complete onboarding.
Before you begin
You need:- A collection domain that shows as active in Plainrouter.
- Access to the shared
<head>template or site-wide code injection setting for your website. - Permission to deploy changes to the domain connected to the workspace’s Signals setup.
Install the pixel
1
Copy your snippet
Open Signals → Install. For managed-hostname setup, confirm your collection-hostname label and add the CNAME. When the hostname is active, find 2. Add the browser snippet.Click Copy snippet. Use the complete snippet exactly as Plainrouter provides it. Its key and script URL are unique to your workspace.Before the first arrival, Dashboard and Signals also display the installation instructions. Once your hostname is provisioned, you can copy its CNAME and snippet directly from those screens.
2
Add it to every page
Paste the snippet immediately before the closing Keep the initialization block before the asynchronous script. This preserves commands that run while the pixel is loading.
</head> tag in your site-wide layout.Your snippet follows this structure:3
Deploy and visit your site
Publish the change, then open any page on the connected website.For managed-hostname setup, choose I’ve added the CNAME and snippet after installing. This records your setup path; the Verified status still requires stored arrival evidence.Use the network checks below to confirm that the pixel loads and sends an arrival. Then test your consent integration separately for conversion events and Meta delivery. You can use Connect or manage Meta on Install when you are ready; Meta setup is not required for the arrival check.
You can close the setup screen after deployment. Reopen Signals later to check the workspace’s Signals status.
Can I enable the included consent banner?
Open Signals → Install → Consent banner. A workspace manager can enable Show the PlainRouter consent banner and optionally Show a floating reopen control. Use the included banner when your site does not already have a consent platform; supported external sources can take precedence. Verify actual grant, rejection and withdrawal behavior using Track events and consent. The banner does not automatically block unrelated scripts installed by your CMS, plugins or tag manager. Use Cookie scan and declaration to inspect pre-consent activity and publish the observed inventory.Can an AI assistant read my installation instructions?
Yes. With a production Read workspace key, callget_install_instructions. A single-workspace key needs no arguments; a multi-workspace key needs workspace_id. Confirm the returned workspace, then use its existing CNAME and snippet. The call is read-only and reports stored first_arrival state; it does not provision DNS or install code.
This tool supports managed hostnames only. A null snippet means the hostname is not ready; finish setup in Install. For same-origin forwarding, use Configure serving.
Verify the installation
To test browser collection, open your browser’s developer tools and reload the page:- Select the Network tab.
- Search for
v4.jsand confirm it loads from your collection domain. - Search for
arrivaland confirm onePOST /v1/arrivalrequest receives202. This request occurs before consent evaluation, including when consent is denied or has not been provided. - Grant all three advertising permissions through your consent integration. Confirm the separate
PageViewrequest to/v1/eventssucceeds.
Does the consent message verify installation?
The consent-source message on Install is separate from the Verified arrival status. It describes the configured consent surface or the latest eligible retained consent-source observation; it is not a live test of your CMP on the current page. A detected consent source does not prove that a new purchase was delivered to Meta. An arrival can be verified while advertising consent is absent. Complete the grant, partial-consent, and withdrawal checks after checking collection, then inspect the purchase’s delivery separately.What happens on initialization
signalq("init", ...) sends one arrival per document and publishable key before checking consent. It does not create or read visitor cookies for that request. Repeating initialization with the same key, changing consent, navigating with the History API, or restoring the page from the back-forward cache does not send another arrival. A full page reload starts a new document and can send a new arrival.
The current snippet sends the publishable key in a text/plain JSON body with credentials: "omit". It does not put click IDs or customer data in the arrival body. The current v4 arrival also supplies bounded traffic context: the page path, referrer origin and an allowlisted campaign-query subset. Collector requests use referrerPolicy: "no-referrer", so the browser does not attach the full page URL as an HTTP Referer. Arrivals do not trigger Meta delivery.
Which arrival fields are retained?
The collector retains the UTC-hour timestamp, workspace and policy context, and these bounded dimensions:
The arrival has no visitor identifier, IP address, raw user-agent string, full referrer URL, arbitrary query parameters, or commerce payload. The generated arrival ID identifies the arrival record, not a visitor or session. Keep personal data out of website paths and campaign labels; permitted strings are not automatically scrubbed of personal information.
The separate
/v1/events path requires consent_basis: "consent" and granted values for ad_storage, ad_user_data, and ad_personalization. After the first complete grant, the collector sends a consented PageView. This event does not add a second arrival to the arrival total. Events requested before consent are not replayed retroactively.
Arrival requests are not retried, queued in the browser, or resent by beacon. A failed request can therefore leave that document load uncounted.
The generated snippet uses
signalq for tracking commands. Do not rename it to signal. The separate plainrouter("consent", "open") control reopens the supported consent surface; it is not the tracking queue.Content Security Policy
If your website uses a Content Security Policy, allow the collection domain in both places:- Add
https://YOUR_COLLECTION_DOMAINtoscript-src. - Add
https://YOUR_COLLECTION_DOMAINtoconnect-src. - Apply your site’s nonce or hash policy to the inline initialization block.
'self' source may cover them. Keep the inline initialization block under your nonce or hash policy. See same-origin CSP troubleshooting.
You may need to allow https://connect.facebook.net in script-src after you connect Meta. The Meta library loads only after advertising consent is granted.
Troubleshoot
Why do Dashboard and Signals still show installation instructions?
The workspace has not recorded its first arrival. Check that your deployed page loadsv4.js and sends an accepted arrival request, then allow the screen to refresh. Copying the snippet, confirming installation, or sending an API verification event does not replace a real browser arrival. Follow the installation checks to distinguish an edge receipt from stored collection.
The script does not load
- Confirm the snippet appears in the rendered page source.
- Clear your site cache or CDN cache after deploying.
- Disable content blockers while testing.
- If your site uses a Content Security Policy, allow your collection domain in
script-src. The initialization block must also follow your site’s nonce or hash policy for inline scripts.
The event request is blocked
- Allow your collection domain in the
connect-srcdirective of your Content Security Policy. - Confirm you installed the snippet on a domain allowed by the workspace’s Signals setup.
- Confirm the publishable key and script URL came from the same Plainrouter snippet.
Signal setup still shows as incomplete
Confirm the collection hostname is active,v4.js loads, and /v1/arrival is accepted. A missing or invalid publishable key or unauthorized website origin is rejected without recording an arrival. A 429 means an arrival rate limit was reached. Fix the cause and reload the page; the snippet does not retry an arrival on its own. The identity-free verification event cannot replace a real arrival.