The pixel is not required to activate a Signal. Complete server-side ingestion verification first, then install the pixel only where your consent policy permits it.
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 your signal tracker.
Install the pixel
1
Copy your snippet
Open Signals, continue setup, and find Optional browser confirmation.Click Copy code. Use the complete snippet exactly as PlainRouter provides it. Its key and script URL are unique to your signal tracker.
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.After your consent integration supplies a complete grant, track a test event and use the network checks below to confirm the pixel loads and sends it.
You can close the setup screen after deployment. Reopen Signals later to check the signal tracker status.
Verify the installation
To test browser collection, open your browser’s developer tools and reload the page:- Select the Network tab.
- Search for
v3.jsand confirm it loads from your collection domain. - Grant consent through your integration, track a test event, then search for
eventsand confirm the browser sends a request to/v1/eventson the same domain.
2xx response.
What happens on initialization
signalq("init", ...) initializes browser collection without creating visitor state or sending an ordinary event. Browser events require consent_basis: "consent" and granted values for ad_storage, ad_user_data, and ad_personalization. Missing, unknown, denied, malformed, or withdrawn state does not send an ordinary browser event.
The browser flow is not the authoritative activation check. Use the identity-free server verification event for setup.
The generated snippet uses
signalq. Do not rename it to signal; the v3 bundle intentionally exposes only the collision-resistant signalq global.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.
https://connect.facebook.net in script-src after you connect Meta. The Meta library loads only after advertising consent is granted.
Troubleshoot
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 signal tracker.
- Confirm the publishable key and script URL came from the same PlainRouter snippet.