Tracking pixels and SEO
GA4, Meta Pixel, Meta CAPI, GTM, and Google Search Console.
On this page
- Tracking codes
- Facebook Conversions API (CAPI)
- Which events the site sends automatically
- If you use GTM
- Checking that CAPI really works
- Malformed ids
- Cookie consent banner
- How tools are sorted (fixed, not editable)
- Limits to know
- Sitemap
- Google Search Console verification
- Facebook domain verification
- Course-level SEO meta tags
Tracking codes
Go to School settings → Tracking & integrations and enter your GA4 measurement ID, Meta Pixel ID, and/or GTM container ID — the system injects them into your public site automatically.
Facebook Conversions API (CAPI)
Front-end Pixel alone is easily blocked by ad blockers. With CAPI enabled, the platform sends a server-side Purchase event to Meta whenever an order is paid, using the order ID as the event_id so Meta deduplicates it against the front-end Pixel event. Enable it by pasting your Meta CAPI access token; if left blank, only the front-end Pixel fires. The token is stored encrypted and isn't shown again once saved — leave the field blank to keep the current token, type a new one to replace it, or tick "Remove this key" to turn CAPI off. Your email marketing (Mailchimp etc.) API key is stored the same way.
Which events the site sends automatically
Once a Pixel or GA4 id is filled in, the site sends these events at the moment the student actually does the thing. No GTM setup is needed, and nothing fires before the action succeeds:
| What the student did | Meta | GA4 |
|---|---|---|
| Viewed a course page | ViewContent | view_item |
| Opened checkout | InitiateCheckout | begin_checkout |
| Paid (amount above 0) | Purchase | purchase (with the order id as transaction_id) |
| Joined a free course, or finished an order with a 100% coupon | CompleteRegistration | free_enrollment |
| Created an account | CompleteRegistration | sign_up |
| Left an email to get a free lead-magnet course | Lead | generate_lead |
An order with a total of 0 never sends Purchase. A free join isn't a sale; a 0-value Purchase would teach Meta that these people are buyers and skew your ad delivery. It is sent as a registration instead. There is no switch for this rule at the moment.
Reloading the payment-success page doesn't count twice: Purchase and registration events are sent once per browser tab, and Meta's browser and server events share one event id so Meta merges them. Your own test order (the $1 test checkout in school settings) sends nothing.
If you use GTM
The site pushes the same events to dataLayer (GA4 ecommerce format, each with an event name such as purchase or view_item). In GTM create a Custom Event trigger using the name from the GA4 column above, and attach it to a tag in GTM. For now the site only allows the tracking domains of Meta and Google, so TikTok, LINE and Google Ads pixels are blocked by the browser's security policy (CSP) and can't be used through GTM yet; native support is in development. Pushing to dataLayer doesn't mean any platform receives anything by itself either. You still set up the tags and triggers in GTM.
Manage GA4 one way only: if you filled in the GA4 measurement id here, don't also configure the same GA4 inside GTM, or every event is counted twice. Moving between pages of the site (links, Back) is tracked automatically by the Meta Pixel and GA4, so don't add a PageView trigger in GTM.
Checking that CAPI really works
1. In Meta Events Manager → Test events, copy the test event code.
2. Paste it into School settings → Tracking & integrations → "Meta test event code" and save.
3. Complete one real small order (the $1 test checkout in school settings does not send CAPI).
4. Back in Test events you should see two Purchase events, browser and server, the server one marked as deduplicated.
5. Clear the test event code right after. While it is filled in, every CAPI event from this school carries it, and real orders may not count toward ad results.
If the token or Pixel id is wrong, Meta rejects the event. The student's payment is not affected, and the error is written to the payment error log.
Malformed ids
GA4 must start with G-, the Pixel id must be digits only, GTM must start with GTM-. A wrong format is refused on save, with the field named.
Cookie consent banner
School settings → "Tracking & integrations" has a switch, "Show a cookie consent banner on the site". It is off by default, and while it is off the site behaves exactly as before.
When it is on (and you have filled in at least one of GA4, the Meta Pixel, GTM or custom JS):
- Until the visitor agrees, these tools are not loaded and no event is sent. The banner is a block at the top of the page, so it never covers a button, and a visitor who doesn't answer can still browse and buy.
- "Accept all" and "Reject all" are the same size and type, one filled and one outlined, with no nudging. "Customize" lets the visitor choose per category.
- The choice is kept in the visitor's browser for 6 months. The footer always has "Cookie settings" to change or withdraw it; after a withdrawal the page reloads so tools that were running stop.
- If a visitor refuses "advertising", their order is not reported to Meta (CAPI). This follows the choice they made when they placed the order, so switching the banner off later doesn't change it.
How tools are sorted (fixed, not editable)
| Category | Tools |
|---|---|
| Analytics | GA4 |
| Advertising | Meta Pixel, GTM, your custom JS |
GTM and custom JS can hold anything, so they are always treated as "advertising".
Limits to know
- Turning the banner on means less advertising and analytics data.
- The platform can't check the tags inside a GTM container. Set consent conditions in GTM yourself. A GA4 tag that only loads through GTM won't load when a visitor agrees to analytics alone.
- The site offers
window.tvxConsent(the current choice) and atvx:consentevent for your custom JS, but it is only an interface: your code can ignore it, and the platform can't force it not to. - Turning the banner on doesn't make the site legally compliant. Whether you need it, and how, depends on where your students are.
The school's privacy policy page lists the tools actually in use and their categories automatically.
Sitemap
Every school gets its own /sitemap.xml automatically, listing every published course's sales page — nothing to maintain manually.
Google Search Console verification
In Search Console, choose "HTML tag" verification, copy the content value, and paste it into the "Google site verification code (Search Console)" field under School settings → Tracking & integrations. The system emits the matching meta tag automatically.
Facebook domain verification
Under School settings → Tracking & integrations, paste the domain verification code from Meta Business Manager (Brand Safety → Domains) into the "Facebook domain verification code (Business Manager)" field. This is what lets you claim your school's domain in Business Manager — useful if you also run Facebook/Instagram ads and want control over how links from your domain are displayed.
Course-level SEO meta tags
On a course's "Visibility & search" tab, you can set a custom meta title and description for that course's sales page — shown in search-engine results and when the link is shared, instead of the auto-generated default. Leave them blank to keep using the course's own title and a trimmed excerpt of its description.