Impressions
A 1x1 pixel you place next to a link or banner, so every render is counted against the same brand link your clicks are counted against and the click-through rate comes from two measured numbers instead of one and an assumption.
What this feature does
An impression is one render of one of your links, recorded before the visitor does anything. You embed a 1x1 transparent image pointing at /impression/{brandLinkId}, or at the offer variant, alongside the link or banner itself. The row is written when a browser fetches that image.
A click is the step after. Both are recorded against the same brand link id, so you can put them side by side: impressions as the denominator, clicks as the numerator, over one link and one window of time.
Because the pixel is a plain image request with no redirect and nothing running in the visitor's browser, an impression carries far less context than a click. Everything Routy knows about it has to be on the pixel's own query string. The affiliate id is required and a row without it is dropped. Traffic source, tracker and the sub-id parameters are optional.
What you'll get out of it
- An impression URL Routy builds for a brand link and traffic source, or for a network offer. Embed it as an
<img>wherever the link is placed: in the body of a content page, an email template, beside an ad creative, on a partner site. - Per-impression rows at
GET /v1/reports/events/impressions, filtered by traffic source, brand link, tracker, affiliate, impression id, a free-text filter and a date range. The server caps a page at 200 rows, so a bigger pull goes throughPOST /v1/exportswithexportSource: "Impressions". - Click and impression counters in one response, at
GET /v1/traffic-controls/counter-stats. The same filters serve a time series at/timeseries, bucketed by minute, hour or day, and a breakdown at/breakdowngrouped by affiliate, traffic source or link. PA,PB,dynand the fiveutm_parameters on the row, carried straight from the pixel URL.- A tracker resolved against your own. A
campvalue matching none of yours now records the impression with no tracker, where it used to record someone else's. - An impressions quota separate from clicks. A plan carrying no impressions row of its own uses the events pool as its ceiling instead, and impression volume isn't added into what that pool reports as used.
What the row doesn't carry, because the pixel can't see it: no country, region or city, so filtering the report by country matches nothing. No device type, browser or operating system, and no visitor time zone. Nothing on this path classifies bots either, so a crawler or a mail scanner that fetches the image is counted like anyone else.
Per-row impressions are kept for 30 days. The counters are what you keep after that.
How it actually works
Placing the pixel
Ask Routy for the impression URL for the link and traffic source you're promoting, then put it in an <img> tag where the placement renders. The pixel and the link don't have to sit next to each other, as long as the image is fetched when the placement is shown.
The endpoint answers with a 1x1 transparent GIF and no-cache headers on every request, including the ones it couldn't record. A link id that doesn't resolve, a missing affiliate id, an error on our side: the visitor still gets the image, so a gap in your reporting never shows up as a broken image in your creative.
A camp value on the pixel is looked up against the trackers belonging to your affiliate, using the same rule a click uses, so an impression and the click after it end up on the same tracker. Unlike the click path, this one only resolves and never creates. A pixel view says less than a click does and this endpoint runs at far higher volume, so an unauthenticated image request that could insert rows would be a write amplifier: one row and one broker event for every invented camp value somebody tried. An impression arriving before any click for that tracker is recorded unattributed.
Counting, and the quota that caps it
Each impression increments a per-minute counter in Redis, and a job runs every minute to write buckets older than two minutes into Postgres. The counters follow a live placement within a couple of minutes. The per-row report is where you go for the individual fetches.
Impressions have their own quota row. Set to zero it blocks them, set to a number it meters them in their own bucket, and absent from the plan it falls back to the events pool as a ceiling.
Running out loses data. A blocked impression is refused on the hot path and isn't recorded anywhere, so there's nothing to reconstruct afterwards. The "never block" account option that protects other event types is deliberately ignored for impressions, because one affiliate can generate millions of them.
Impressions instead of clicks
Traffic control has a status that writes impressions in place of clicks. Set a link or a traffic source to it and a click there is saved as an impression: you keep the volume that source produces without crediting it with clicks. It sits between Untracked, which redirects the visitor and saves nothing, and Blocked, which refuses the request outright. This status is available at link and traffic-source level only, not per affiliate.
Why this is worth doing
Click-only reporting tells you which links got clicked, never how many renders it took. Two placements producing ten clicks each are the same row in that report whether one was shown a hundred times and the other ten thousand, and the one worth scaling is the one you can't see.
With the impression counters next to the click counters on the same brand link, that ratio is two measured numbers rather than one measured number over an assumption. The breakdown groups both by affiliate, traffic source or link, so the comparison is a filter instead of a spreadsheet.
The honest limit on this: impressions do not join to clicks. There's no shared identifier between the two, so you can't trace one click back to the render that produced it. You compare counts over the same link, source and window, which answers "which placement earns its space" and not "which particular view converted".
The traffic-control status is the other reason people turn this on. A source you suspect but haven't decided about can be moved to impressions, where its volume keeps arriving in the counters and stops arriving in your click reports. That buys you a few weeks of evidence before you block it or let it back.
Frequently asked questions
Where do I put the pixel?
Anywhere the placement renders: in the content page, in the email template, beside the ad creative, on a partner's site. The pixel and the link don't need to be adjacent.
What has to be on the pixel URL?
The affiliate id. Without it the impression is dropped, since there's nothing to attribute it to. Traffic source, tracker, PA, PB, dyn and your utm tags are all optional, and anything you leave off is simply absent from the row.
Can I filter impressions by country or device?
No. The impression pixel runs no geolocation and no device detection, so those fields are always empty and a country filter matches nothing. Use traffic source, brand link, tracker and your own sub-ids instead.
Can I tie a click back to the impression that produced it?
No. The two carry no shared identifier. Relate them by comparing counts over the same link, traffic source and time window.
Does this work in email?
It works wherever the client loads the image. That's the recipient's setting rather than anything Routy controls, so email impressions undercount by however many recipients block images.
How long are impressions kept?
Individual impressions are queryable for 30 days. The aggregated counters outlive them.
What happens when I run out of impression quota?
New impressions are refused and not stored. Unlike other event types, impressions aren't protected by the "never block" option, because one account can produce millions of them.
Ready to try Impressions?
Ask Routy for the impression URL for a brand link and traffic source, embed it as a 1x1 <img> next to that link, and read the counters at GET /v1/traffic-controls/counter-stats once the placement has rendered a few times.