Marketing
The client's numbers, where you already work
Link each client's Google Analytics 4, Search Console, Google Ads and SE Ranking; the numbers then appear on the client's own page, in a marketing tab and in one overview across every client. Every link carries its own sync status, so a stale graph is never silent. Which tiles the client sees, and what they are called, you compose per client.
Five sources, linked on the client
A client gets its own links: a GA4 property, a Search Console site, a Google Ads account and an SE Ranking project. Several links per source are allowed, so a client with two brands keeps them apart. A link can also hang on one specific website of that client instead of staying client-wide, so a client with two sites groups per site. The account pickers search as you type and show exactly what the signed-in colleague's Google connection can actually reach — and an empty list explains why it is empty and what to do next.
- No Google account connected yet: the "Connect Google" button sits right there
- Missing scopes: reconnect and grant access to that one source
- Access revoked: the link reads "Connection lost"
- The API is off in the Google Cloud project: reconnecting won't help, and it says so
- Google Ads without a developer token: the screen points you at Instellingen → Marketing
On the client page, in a tab, across every client
Every client page carries the Marketing panel: the last 30 days against the 30 before, KPI rows with the delta, sparklines, and the linked accounts as chips with "Open in Google Analytics" behind them. That panel reads entirely from our own database and makes zero calls to Google, so it opens as fast as the rest of the record. To look further, the client's marketing tab offers longer ranges and the drilldowns; the Marketing page in the sidebar renders the same dashboard with a client picker above it, so it is one screen with two entrances. Overzicht → Marketing puts one row per linked client beside it, sortable server-side, so over coffee you can see who needs attention. Licence the reporting module too and marketing supplies nine of the chapters in the monthly client report.
- Client panel: 30 days against the previous 30, with sparklines and account chips
- Client tab: longer ranges, drilldowns and the layout editor
- Overzicht → Marketing: sources, sessions, clicks, avg. position, spend, conversions and key events per client
- A dashboard tile for the team, and a tile on the client's own portal dashboard
KPIs you can open up
Each source contributes its own KPI row, with the change against the previous period beside it. You pick the range: last 30 days, this month, this quarter, last 90 days or the last 12 months, each compared with the period before it. Under the tiles sit the drilldowns, fetched live from the source rather than synced along: top pages, channels, devices and key events per event from Analytics; top queries, top pages and the biggest movers from Search Console; campaigns from Ads; and keywords, keyword groups, the site audit and AI-search visibility from SE Ranking. The tiles themselves come from the daily figures pulled overnight, so switching range costs no Google quota.
- Analytics: sessions, users, new users, key events, conversions, engagement, revenue and channels
- Search Console: clicks, impressions, CTR and average position
- Google Ads: spend, clicks, impressions, conversions and conversion value
- SE Ranking: average position, Top 3, Top 10, Top 30, ranking and tracked keywords
You compose what the client sees, and what it is called
You edit a client's dashboard the way you arrange your own My Day: hit "Edit layout" and you drag tiles to reorder them, hide what this client does not need (hidden tiles wait in a strip below), rename them in place in Dutch and English, switch drilldowns on or off, pick the default chart, or hide a whole source for this client. Everything saves immediately, and the layout is exactly what a portal login sees. Hiding happens server-side: a hidden tile drops out of the data the panel, the tab and the overview receive — it is not merely pushed out of view in the browser. Until you touch it nothing changes, because no layout simply means: show everything. That same editor is where a conversion gets a name of its own, because GA4 calls it whatever a developer once created it as.
- GA4 says generate_lead; the client reads "Website enquiries"
- Your own name per key event, per language, typed in the row where that event sits
- The GA4 event name stays the reference underneath, so the figures keep adding up
- An event not measured this period is added by its raw GA4 name
- Rather not share conversion figures? Switch the key-events tile off for this client
A graph that goes stale says so
Every link carries its own status: Synced, First sync running, Sync error or Connection lost, with "Last synced …" beside it. A link syncs through one colleague's Google account and every screen names that person, so nobody has to guess why the numbers stop the day they leave. Overnight a job per organisation pulls the daily figures and re-pulls the last week while it is at it: Search Console only finalises two to three days later and Analytics and Ads attribution keeps shifting for a while, so late data heals itself. Each link runs independently, so one broken connection never stops the rest. Creating a link kicks off a backfill of roughly thirteen months, committed month by month, so sparklines and year-over-year work from day one. Unlinking erases nothing: the link is deactivated, the synced history stays, and relinking switches it back on.
Keys, permissions and licence
Marketing rides on your agency's own Google connection: you register your own Google Cloud project and the marketing scopes are asked for in that same consent screen, so a colleague does not walk through Google three times. Under Instellingen → Marketing you set the SE Ranking API key (one key for the whole agency, which every client project is attached to) and the Google Ads developer token; both are stored encrypted and never handed back — the screen only reports that a key is on file. Permissions are separate from one another: reading the figures is a default for every team member, creating links is admin work, and the cross-client overview is a management screen. The core of schakl. is open source (AGPL); marketing is an extension module and needs a licence key. When one expires the module goes read-only: linking and settings refuse and the nightly sync stands down, while the panel, the tab and the overview keep showing the figures already pulled.
- Read marketing metrics: default for every team member, narrowable if you treat ad spend as sensitive
- Manage marketing links: admins, like the Google settings themselves
- Read the marketing overview: the cross-client screen, managers by default
- A portal login only ever sees the dashboard you composed for that client
A period is a name, not a number of days
The question an agency actually gets is "how did July go?", and counting thirty days back from today does not answer it: that is 11 July to 9 August, which is not a month anybody reports on. So one token names the span: a trailing window, a rolling preset like this month or last quarter, or a frozen period like 2026-07. A tab then still means "last month" next month, while a link you paste into a chat keeps showing the month you were looking at. The label is decided by the dates rather than by the word you picked, so a month reached through the picker and the same month reached through the tab row are impossible to tell apart. The comparison works the same way: a percentage is a claim about two spans, so both are on the screen ("vs 11 Jul - 9 Aug 2025", not "vs previous period"), and you choose whether the dashboard compares against last year or against the previous period, with a per-client override where seasonality demands one.
- A period-to-date with no complete day falls back to the previous whole one; 1 August has no August to show
- A period you named yourself is never silently substituted
- The cross-client overview deliberately ignores the per-client override, because percentages with different denominators rank nothing
Want to know more?
The documentation describes every module in detail, from installation to permissions.