EdgeKit Analytics
Event data your analysts trust, and your paywall reads
Reads, paywall views, sign-ups and subscriptions, collected on each title’s own domain and checked against schemas your team writes. Every valid event is archived unsampled and loaded into a warehouse table of your own. Signed-in readers’ engagement also reaches the profile your paywall and offer rules read.
Article read · The Northern Post
northernpost/article_read · 1-0-2
- Section
- Politics
- Reader
- Signed in
- Country
- United Kingdom
- Arrived from
- Search · Google
- Campaign
- morning-brief
- Device
- Chrome on iPhone
Matches your article_read schema
Delivered to
- Archiveunsampled
- Warehouseedgekit.events
- Brazecustom event
- Reader profileengagement
Where events go
Your separate behavioural data pipeline can go. Everything else stays.
One path and one tag per title. Every event is checked on arrival, then delivered from that single copy: into the archive, your warehouse, the tools your teams use and, for signed-in readers, the reader profile. Your consent platform, warehouse, BI tool, and Braze if you run it, all stay. Adding a destination never means re-tagging a page.
Sources
- Each title’s website
- iOS and Android apps
- Your own servers
On your domain
northernpost.com/edgekit
No new hostname · checked on arrival
- Matches its schemaDelivered
- Fails its schemaKept aside, with the reason
Delivered to
- ArchiveEvery valid event, unsampled. Always on.
- WarehouseOne table of your own, in Snowflake, BigQuery or MotherDuck.
- BrazeSigned-in readers’ events, as custom events.
- OpenTelemetryEvery event, to any endpoint you name.
- Reader profileEngagement for paywall and offer rules, once switched on.
How it works
Collected on your domain, checked at the door, loaded whole
First-party collection
Collected on your domain, not someone else’s
Each title routes one path on its own domain to EdgeKit, and the tag sends every event there. There is no new hostname, no certificate and no change to your content security policy. The path spells no analytics vendor’s name, and EdgeKit can add further paths of your choosing beside it.
- Its cookies belong to the title’s own domain, not to a third party
- Takes its signal from the consent platform you already run
import { createTracker } from '@edgekitcloud/analytics-browser'; const analytics = createTracker({ siteId: 'northern-post', requireConsent: true, }); analytics.trackPageView(); // held // your consent platform's accept callback analytics.grantConsent(); // → POST northernpost.com/edgekit/a/t
Reader profile
The next offer knows how this reader reads
Engagement is counted on the live event stream and lands on each signed-in reader’s profile: articles read, paywalls seen, how recently and how often they read. Paywall and offer rules read it in the same request as any other fact, so an offer moves on reading behaviour, not on last month’s export.
- Articles read, paywalls seen, recency and frequency, kept on the profile
- No export and no engineer between the event and the rule
- Anonymous reading is still collected and stored; only signed-in readers’ engagement reaches the profile
article_readPoliticspaywall_viewMeteredarticle_readBusiness
- Articles read
- 7
- Paywalls seen
- 2
- Last read
- Today
- Days active
- 23 of 90
Paywall rule
Paywalls seen 2 or more and days active 20 or more
Show the introductory offer
Schema registry
Bad data stops at the door, not in the board report
Your team defines each event once: its fields, their types, its version. Every event is checked as it arrives. One that fails is kept aside, untouched, with the reason it failed. It never reaches your tables and is never silently thrown away.
- Write schemas in the console, or have EdgeKit import the ones you already have
- A breaking change under the old version is refused when you save it, not found in next month’s numbers
- No version is ever deleted, so an app release from years ago still validates
1-0-23Yours12 Sep1-1-02Yours3 Sep1-0-01Yours28 Aug2-0-04Yours19 Aug1-0-01EdgeKit—article_read 1-0-3 changes words from a number to text. Rows already collected would no longer fit. Publish it as 2-0-0.
Archive and warehouse
Every row, in a warehouse your analysts can query
Every valid event lands in an archive that is always on and never sampled. From there it loads one wide table, one row per event and every title in it: into your own Snowflake, BigQuery or MotherDuck.
- Every event is loaded exactly once, even when a load runs again
- When it is switched on, EdgeKit loads the full archive into it
- Anonymous reading is in the table too, not only signed-in readers
select * from edgekit.events limit 5
5 rows · 2 titles · one table
Consent and privacy
Consent travels with the data
Where consent is required, the tag holds every event on the page until the reader says yes, using the consent platform you already run. Every event records the lawful basis in force on its title, so the evidence sits in the same stream as the data it covers.
- A reader who withdraws consent has the tracker’s cookies and stored state cleared from their device
- Choose fields, such as the IP address, to be hashed before anything is stored
- Bring named cookies from your other systems onto every event, and only those
Also included
The details your data team will ask about
Every platform, one path
Open-source trackers for web, iOS, Android and your own servers all send to the same path.
Your marketing stack
Events reach the marketing tools you already run, such as Braze, Iterable, Customer.io and Klaviyo, or any OpenTelemetry endpoint you configure.
Enriched on arrival
Country and region, referrer source, campaign tags, device and browser, added to each event that carries them.
Identity carried over
Coming from a pipeline on the same open-source tracker, readers keep their device identifiers and sessions are not reset.
Getting started
Adopted one title at a time
Nothing here needs a re-platform. The CMS keeps rendering, the old tool can keep running, and each step stands on its own.
White-glove onboarding: we set it up with you, start to finish.
- 01
Define your events
Agree the handful that matter (reads, paywall views, sign-ups, subscriptions) and write them as schemas in the console. If you already have schemas, EdgeKit imports them.
- 02
Mount the path, add the tag
Route /edgekit on each title’s domain to EdgeKit, install the tracker and connect it to your consent platform. Events arrive on your own domain from the first page view.
- 03
Connect your warehouse
EdgeKit switches on loading during setup, into your own warehouse or a Snowflake database it keeps for you, loads everything collected so far, then keeps the table current.
- 04
Retire the old pipeline when you are ready
Keep your current tool running as insurance until you trust the new data. We can even import past events.
Questions
Asked before every demo
Does it work with our consent platform?
Yes. The tag takes its signal from the consent platform you already run. Where you require consent, it holds events until the reader agrees, and every event records the lawful basis in force on its title.
Where does our data live?
Every organization has its own collector, its own archive and its own warehouse table, never shared with another media group. Deploy EdgeKit into your own cloud account and the archive sits in infrastructure you control. EdgeKit also keeps a 90-day copy of every valid event in a log store of its own, one dataset per organization. The warehouse copy is your organization’s: retention and deletion there are your call, and EdgeKit never deletes from it.
Do we have to remove our current analytics tags?
No. EdgeKit’s tracker runs beside them, so you can keep your current tool while you switch. Do not expect the two to agree. Different tools lose different events, use different clocks and judge bots differently, so their numbers never reconcile exactly. Treat the old tool as insurance, not as a benchmark.
Will the read count match the paywall’s meter?
No, by design. A page view is a record of what a reader did; a metered read is a paywall decision. Bots, previews and subscriber reads move one and not the other, so neither number is worked out from the other.