Create a pixel
Name it by product, site or funnel.
PIXORA ADS SIGNAL LAYER
Install once, keep the path from ad click to conversion visible and make every important signal easy to trust.
Create a Pixel, verify its HTTPS domain, check test events and select it during website campaign creation or in its settings.
Name it by product, site or funnel.
Publish the exact token file on that host over HTTPS.
Open the site directly and inspect PageView, ViewContent and Lead.
In Promote → Website traffic, choose Pixel on the Audience step; existing campaigns have the same setting.
For a live attribution check, open the site through a real website campaign visit. That transition creates px_click; a direct URL does not. View the LENTO demo landing.
Use the same small SDK in plain HTML, React, WordPress or an SPA and send events from your own success states.
Add this once in the head or layout. New installations wait for explicit analytics consent: call consent from your CMP, even before the async script loads.
<script>
window.PixorAdsPixel = window.PixorAdsPixel || { q: [] };
window.PixorAdsPixel.track = window.PixorAdsPixel.track || function (name, options) {
window.PixorAdsPixel.q.push([name, options]);
};
window.PixorAdsPixel.consent = window.PixorAdsPixel.consent || function (value) {
window.PixorAdsPixel.q.push(["consent", value]);
};
</script>
<script async data-consent="required" src="https://pixora-ads.com/sdk/pixorads-pixel.js?pixel_id=px_your_id"></script>Unknown is the default. A denied update stops collection and removes stored attribution. Existing installations keep their behavior until you opt in using data-consent=required.
// Call from your real CMP consent callback, never automatically:
function onAnalyticsConsentChanged(granted) {
window.PixorAdsPixel.consent(granted ? "granted" : "denied");
}After consent the SDK sends PageView once and supports both px_click and px_tclick. Keep the server key out of this page. Live browser origins must match a verified HTTPS host.
PageView, Lead, CompleteRegistration and Purchase share one shape, a stable eventId and a readable event log.
Send Lead only after your server accepts the request. Use its stable event_id in both browser and postback.
// After the lead request succeeds:
window.PixorAdsPixel.track("Lead", {
eventId: acceptedLead.event_id,
});Browser events describe activity; they do not confirm a server conversion or change billing. Do not send Purchase for a demo request.
The pixel maps the funnel; an HMAC-signed postback confirms goal actions for analytics.
The server signs the exact raw JSON bytes: timestamp + dot + raw JSON. Use the browser event_id and keep it on retries.
// Node.js 22+, YOUR SERVER. Keep the signing key out of the browser.
import { createHmac } from "node:crypto";
async function sendPixelEvent(event) {
// Persist this event in your outbox after the real outcome, with its original
// event_id and px_click (or px_tclick). Reuse the same body on retries.
const raw = JSON.stringify(event);
const timestamp = String(Math.floor(Date.now() / 1000));
const signature = createHmac("sha256", process.env.PIXORADS_PIXEL_KEY)
.update(timestamp + "." + raw).digest("hex");
// Public px_... ID, not the internal UUID used in cabinet APIs.
const pixelId = process.env.PIXORADS_PUBLIC_PIXEL_ID;
const response = await fetch(
"https://pixora-ads.com/api/v1/pixels/" + encodeURIComponent(pixelId) + "/postback",
{
method: "POST",
redirect: "error",
headers: {"Content-Type": "application/json",
"X-PixorAds-Timestamp": timestamp,
"X-PixorAds-Pixel-Signature": signature},
body: raw,
signal: AbortSignal.timeout(8000)
}
);
if (!response.ok) throw new Error("Pixel postback HTTP " + response.status);
const result = await response.json();
// 2xx alone does not mean attribution: inspect status/mode/error_code.
return result;
}
// Example persisted lead payload (replace with values from your backend):
// {event_id: "lead:123", event_name: "Lead", px_click: "<original click token>"}
// For a Purchase, optional value_minor and currency must be supplied together.
// RUB and XTR use 1000 internal units per unit; USD is not accepted here.
// Retry only transport/5xx/429 failures with bounded backoff. Generate a fresh
// timestamp/signature on each delivery, keeping the event_id and body unchanged.Only a signed server postback can confirm a goal action for analytics. It does not change billing. Use the same event_id to connect both signals and retry safely.
Send X-PixorAds-Timestamp and X-PixorAds-Pixel-Signature (HMAC-SHA256) from your backend. Keep the signing key on the server.
Add separate connections in campaign settings. The website bridge reads real tag identifiers after visitor consent; secrets stay on the Pixora Ads server.
Copy the complete snippet from your connection. It also works without a Pixel. Multiple connections can coexist; no token or API secret belongs in this code.
<script>
window.PixorAdsAnalytics = window.PixorAdsAnalytics || {
q: [],
consent: function (value) { this.q.push(["consent", value]); }
};
</script>
<script async src="https://pixora-ads.com/sdk/pixorads-analytics.js?connection_id=YOUR_PUBLIC_CONNECTION_ID"></script>
// Call only from your CMP, never grant automatically:
function onAnalyticsConsentChanged(granted) {
window.PixorAdsAnalytics.consent(granted ? "granted" : "denied");
}The bridge uses ym(counter, 'getClientID', callback) and gtag('get', measurementID, 'client_id'/'session_id', callback). It waits up to eight seconds for existing tags, skips unavailable IDs and never creates substitute visitors. Consent updates are shared with a consent-gated Pixel.
Use the connection check in the cabinet: counter found → visitor linked → request validated → test sent. GA4 validation is distinct from delivery and does not guarantee visibility in reports. Purchase values and stable order IDs must come from your backend. Metrica API · Google tag API.
The journal shows the last 40 events with event_id, source, mode, campaign and error_code. Read those fields before retrying.
test is stored without attribution. received is accepted without a confirmed analytics conversion. attributed matched a click; a browser row is still an activity signal, while a signed server postback confirms a conversion for analytics without changing billing. duplicate did not create another outcome. unmatched needs a valid px_click and matching campaign. rejected failed a rule or conflicted with another event.
If no row appears, inspect the Network response: an unverified browser domain, paused Pixel or invalid signature can be refused before logging.
NEXT SIGNAL
Create a pixel, run the test flow and connect it to a campaign when the signal is healthy.