Documentation · v1

PIXORA ADS SIGNAL LAYER

Conversion pixel.
From click to event.

Install once, keep the path from ad click to conversion visible and make every important signal easy to trust.

01Create02Verify03Install04Test05Link campaign06Go live

From click to the first conversion

Create a Pixel, verify its HTTPS domain, check test events and select it during website campaign creation or in its settings.

01

Create a pixel

Name it by product, site or funnel.

02

Verify the origin

Publish the exact token file on that host over HTTPS.

03

Check test mode

Open the site directly and inspect PageView, ViewContent and Lead.

04

Link a website campaign

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.

Install without extra plumbing

Use the same small SDK in plain HTML, React, WordPress or an SPA and send events from your own success states.

Installation snippet

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>
Connect your consent manager

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.

A contract your team can trust

PageView, Lead, CompleteRegistration and Purchase share one shape, a stable eventId and a readable event log.

Send your first event

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,
});
PageViewPage opened; SDK sends it automatically
ViewContentA product was viewed
LeadThe server accepted a request
PurchaseA real order was confirmed

Browser events describe activity; they do not confirm a server conversion or change billing. Do not send Purchase for a demo request.

Browser analytics plus server proof

The pixel maps the funnel; an HMAC-signed postback confirms goal actions for analytics.

Confirm the outcome from your backend

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.
Browser events are analytics

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.

Metrica and GA4 in the same funnel

Add separate connections in campaign settings. The website bridge reads real tag identifiers after visitor consent; secrets stay on the Pixora Ads server.

Website or GTM bridge

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.

When a signal is not green

The journal shows the last 40 events with event_id, source, mode, campaign and error_code. Read those fields before retrying.

testreceivedattributedduplicateunmatchedrejected

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

Ready to see the full funnel?

Create a pixel, run the test flow and connect it to a campaign when the signal is healthy.

Open workspace