Docs

Filtering, dimensions & comparisons

Slice your data with secondary dimensions, AND/OR filters, date ranges, and comparison periods.

Date ranges

Every report has a date range set at the top, and changing it updates every widget at once — there's no per-widget date juggling for the common case. Pick a preset — from last 7 days, last 30 days, this month or last month, right through to last quarter, last 6 full months, last 12 months, year to date or all time — or set a custom start and end date. Because the builder runs on live data, moving the range re-queries each source immediately, so the preview always reflects the window you've chosen. A widget with its own date range names that range in its header, in the app, on shared links and in PDFs. Match the range to the story you're telling: a monthly client report sits naturally on "last month," while a half-year or full-year performance review can run on last 12 months, year to date, or a custom window that spans several months to show a trend properly. Presets are counted in your workspace's time zone (Settings → Time zone and date format): "yesterday" is yesterday where you are, and "last month" moves to the new month at midnight your time. That holds everywhere the report is read: in the app, on shared links, in PDFs and scheduled emails, in the API and in the MCP connector. A workspace far from UTC can therefore see a range one day earlier or later than before October 2026, when ranges were counted in UTC. Each source then reads those calendar dates in its own reporting time zone, as it always has: Google Ads and Meta in the ad account's, GA4 in the property's, Search Console and Bing Webmaster Tools in US Pacific time, and AI visibility by the UTC day its scans are stored under. CrunchJunkie passes the dates through unchanged and never shifts them by an offset.

Chart time scale: daily, weekly or monthly trends

When a report covers a long window — a half-year, a year, a custom multi-month range — a chart plotted day by day becomes an unreadable wall of ~180 bars. That's what the Time scale control fixes. Click any line or bar widget and, under Chart display, switch its Time scale between Daily, Weekly and Monthly. Set it to Monthly and a twelve-month range collapses to twelve clean bars — "Mai 2026 → Juni 2026 → …" — instead of one bar per day; Weekly gives you calendar weeks for something in between. The setting is per widget, not global to the report, so you can show a monthly half-year or yearly trend at a chosen spot on the page while other charts stay daily. And it stays honest: each bucket is aggregated exactly like the KPI card over that period — a monthly bar equals that month's scorecard — with base metrics (spend, clicks, conversions) summed and rates (ROAS, CTR, cost per conversion) recalculated from the totals rather than averaged. So a longer time scale changes only how the trend reads, never the underlying numbers. A week or month in the middle of the chart with no answers at all is a gap for Visibility and Mentions, with a note, because nothing was measured; a period with answers but no mention of the brand is a real 0.

Google ranking updates on Search Console charts

A Search Console chart over dates shows when Google rolled out a ranking update: a faint band from the day the rollout began to the day Google said it was complete, tagged G1, G2 and so on, with each update's name and dates under the chart. The dates are Google's own, from its Search Status Dashboard (status.search.google.com), as US Pacific days, the way the dashboard shows them. An update that is still rolling out runs to the chart's last point and is marked ongoing. The band shows timing only, not a cause. A line can move during an update for reasons of its own, and an update can leave a site untouched, so read it as "an update was running then", never as the explanation. Only ranking updates for web search are shown: core, spam and similar updates. Discover updates are left out because the charts show web search, and so are incidents Google calls a ranking issue rather than an update. On a chart with a comparison period the band belongs to the dates on the axis, not to the dashed comparison line; a period comparison (two points) has none. The bands are on by default in the app, on shared links and in PDFs. To hide them on one chart, switch off Show Google ranking updates under Chart display in the widget's settings. Rank Tracking charts of Google positions show the same bands.

Branded vs non-branded queries

A Search Console widget can count branded queries, non-branded queries, or both side by side. A query is branded when it names the client's brand: the client's name without its legal form when that shorter name is switched on under Settings → Brands (on by default when it keeps a distinctive word and names no place; "Online SL" and "Autohaus Berlin GmbH" are matched as written until someone switches "Online" or "Autohaus Berlin" on — the rule every surface that finds a brand in a text uses, see the Query fanouts section), the name of its website, its brand names in AI Visibility, and any terms you add under the client's brand terms (Clients → Edit → Brand terms, or Edit the brand terms in a widget's settings). Matching is on whole words, in any case and with or without accents, so "muller" and "mueller" both match Müller, "strasse" matches Straße, and a name of several words also matches spaced, hyphenated or joined ("tiki taka", "tiki-taka", "tikitaka"). A two- or three-letter brand only matches as a word of its own, never inside another word. A name taken from the website ("schluesseldienst-berlin" from schluesseldienst-berlin.de) counts only hyphenated or joined, never as separate words, so a generic phrase like "schluesseldienst berlin mitte" stays non-branded. In the brand terms you can untick a derived term that is too generic, add product names and common misspellings, and add terms that should never count as branded ("apple pie" for a brand called Apple). Before you save, a preview counts how many of the client's top queries of the last 28 days, and how many of its tracked keywords, would count as branded, with the term each one matched. It also lists spellings the whole-word rule leaves out, such as your term inside a longer word ("ottoversand" for Otto) or a one-word name written as two ("crunch junkie"), so you can add them. Each term takes room in Search Console's filter, which allows 4,096 characters; the dialog shows how much is used and refuses a term that would not fit. On a KPI, chart, table or donut, set Queries to Branded only or Non-branded only; the widget then says under it which terms it counted, and its comparison period is filtered the same way. Google applies the filter to all of the property's queries, not to a sample of top queries we fetched. For both groups side by side, choose the dimension Branded vs non-branded on a table, a donut or a line chart. Clicks and impressions are added up per group, CTR is each group's clicks divided by its impressions, and the average position is weighted by impressions, never an average of daily figures. Read the totals with one thing in mind: Google leaves rare queries out of every query filter to protect searchers' privacy (anonymized queries). They are in the property's total but in neither group, so branded and non-branded add up to less than all queries. The split table shows that remainder as its own row, with its clicks, impressions and CTR; it has no position of its own, because one can't be worked out from a difference. Widgets you already have are unchanged: they count all queries until you pick a filter. Bing Webmaster Tools offers the same filter and split on its weekly top-query table and donut, built from Bing's top queries only; its daily totals can't be split by query. In the Rank Tracker, the Keywords control (All, Branded, Non-branded) narrows the tiles, the chart and the views beside the table, a branded keyword carries a Brand label naming its term, and a Branded vs non-branded table under the tiles compares the two groups: keywords checked, top 3, top 10, average position over the keywords that rank, and AI Overviews shown and citing the site. Rank Tracking report widgets take the same filter and split. Through the AI assistant connector, the API (GET /reports/{id}/data?brandFilter=branded) and Ask Crunch, a report can be read for branded or non-branded queries only, and each such widget's note names the terms. Draft with AI and the AI editors can add these widgets when you ask for branded figures.

Channels by month (GA4)

A Google Analytics table can show its channels month by month. Choose the dimension Channel × Month: one row per channel, as GA4 groups traffic in its Default Channel Group (Organic Search, Paid Search, Direct, Referral and so on), and one column per calendar month, the oldest on the left. Each cell shows one metric, the first one picked, for example Sessions. The table's row limit is the number of months, the newest up to the report's end date: 13 unless you set it, at most 36. Months before the property has any data are left out, and the current month shows its days, for example "Oct 2026 (1–20)", with a line under the table, so it never reads as a full month. Two switches work as on the AI visibility month tables. Totals adds a Total column per channel and a Total row per month; heat shading colours each cell from light to strong, with a legend under the table, and leaves the Totals unshaded. Counts and amounts (Sessions, Engaged Sessions, Key Events, Conversions, Purchases, Revenue) add up, so their Totals are the sums of the cells. Users do not: someone who came in March and again in April, or through two channels, is one user, so the Totals of Users, New Users and Active Users are GA4's own counts for the row or column, lower than the sum of the cells, and the table says so under it. Rates and averages (Engagement Rate, Bounce Rate, Avg. Session Duration and the like) are each cell's own figure from GA4, and their Totals are GA4's figures for the whole row or column, never an average of the cells. A channel with no visits in a month reads 0 for a count and "—" for a rate, because there is nothing to divide. If GA4 does not answer, the table says it was not loaded instead of showing zeros. The report's comparison period does not apply to this table, and the widget's filters apply to every cell. Ask Crunch, Draft with AI and the MCP connector build the table when you ask for visits by channel per month, and the "GA4 — Acquisition" template includes one for the last 12 months.

Key events only (GA4 events table)

A Google Analytics table by Event Name can keep only the events GA4 marks as key events (what GA4 called conversions until 2024). Turn on "Key events only" in the widget settings, or ask Ask Crunch or the AI assistant connector for it: "a table titled Website enquiries with Event Name, Key Events and Users, only key events, most Key Events first, full width". The table is sorted by the metric you pick under Sort, highest first for a count, and the row limit is applied after that sort. The filter is GA4's own isKeyEvent dimension, set to true, and it goes with every read of the table, including the comparison period, so the two periods list the same kind of event. An event that became a key event recently shows only the days since it was marked: GA4 does not change history. Key Events adds up across events, since it is a count. Users does not: it counts the distinct people per event, and one person can trigger several events, so the table draws no Total row and the rows should never be added up. If GA4 does not answer, the widget says it was not loaded instead of showing zeros.

Comparison periods

A number on its own rarely tells a client much; what changed is what matters. Add a comparison period and every scorecard and chart gains a change indicator showing movement against the baseline. You can compare to the previous period (the equivalent window immediately before), the same period last year (which controls for seasonality), or a custom window of your choosing. Previous-period comparisons are great for spotting recent momentum; year-on-year is the fairer read for seasonal businesses. Pick whichever frames the result honestly — the goal is to give context, not to flatter the numbers. On a daily chart of an ad platform (Google Ads, Microsoft Ads, Meta Ads, LinkedIn Ads, Amazon Ads, Reddit Ads, ChatGPT Ads), Google Analytics or Search Console, the dashed comparison line is matched by date: each day is drawn against the day at the same place in the comparison period (the 5th day against the 5th day), and an all-channels chart adds up each channel's days the same way. A day the platform sends no row for (an account that delivered nothing that day) is a 0 for a count such as clicks and a gap for a rate or an average such as CTR, never the next day's figure moved up; a figure the platform did not report for the period at all stays a gap on every day. When the comparison period is shorter (February against March, or a year with 29 February against one without), the last days have no comparison point. A chart of a period still running, such as this month, ends at the last day with data rather than dropping to 0 for days that have not been reported yet; with a comparison line, a period that has ended is no longer cut short at its last day with data (Search Console charts still end at the last day Search Console has reported). Email (Mailchimp, Brevo) charts compare send by send, and the Piwik PRO, Matomo and Business Profile charts compare point by point in the order the days come back. A line chart that plots several counts from one source whose sizes are far apart (LinkedIn Ads impressions beside clicks and leads, say) puts every series more than 20 times smaller than the largest on its own axis on the right, titled with the series' names, so those lines do not sit flat at zero; charts of channels, AI engines or competitors, and charts of rates or amounts, keep one axis. A previous value of 0 is a real value, and a scorecard shows the change from it exactly as a table does: lost impression share going from 0 % to 12 % reads +12.0 pts, and conversions going from 0 to 5 read +5 in the Absolute and Both formats. A percentage change from 0 does not exist, so in the default format a count or an amount from 0 shows no change. "No prior data" is shown only when there is nothing to compare with: the source has no data for the comparison period (no scan, audit or rank check yet), the comparison period could not be read (an error is never shown as a 0), or the figure is a snapshot of how things stand today, such as Merchant Center catalog counts, the Business Profile review total and rating, or Facebook and Instagram follower totals. A rate or an average over a comparison period with nothing in it (no impressions, no visits) has no previous value either, while a count from such a period is a real 0. An all-channels scorecard shows "No prior data" when one of its channels has a figure now but none for the comparison period, rather than comparing a full total with a partial one. A widget set to compare with nothing shows neither. AI summaries, the API and the MCP connector read it the same way: a missing comparison is null ("no prior data"), never 0. The same holds for the current period: a figure the source could not be read for shows "—", never 0, and no change; when none of a scorecard's figures could be read, it says the data could not be loaded. An all-channels scorecard or chart leaves an account it could not read out of both periods and names it under the widget; on shared links, in present mode and in the PDFs CrunchJunkie renders, that note gives only the number of accounts left out. A Google Ads scorecard, chart or table that adds up several campaigns (a campaign selection or widget filter with more than one campaign, a day, week or month of a filtered chart or table with more than one, or the reach of several Display and Video campaigns) shows "—" for the figures Google reports per campaign only, with a line under the widget that says why: impression share and its lost, top and absolute-top variants, the top and absolute-top impression rates, view, engagement, video and viewability rates, average cost per view, unique users and frequency. They cannot be added up, and two campaigns at 40 % and 30 % impression share are not at 70 %. Counts and amounts are added up, and CTR, cost per click, cost per conversion, conversion rate and ROAS are worked out from those totals. A filter to one campaign shows that campaign's own figures. A change that rounds to zero reads ±0.0 pts or ±0.0 % in neutral grey, not as a gain or a loss. For the ad platforms (Google Ads, Microsoft Ads, Meta Ads, LinkedIn Ads, Amazon Ads, Reddit Ads and ChatGPT Ads) there is one more case: when the platform spent on far fewer days in the comparison period than now (fewer than half of the comparison period's days, and at most half as many days as in the current period), the change stays, the widget says so ("Meta Ads ran on only 4 of 30 days of the previous period") and the change chip carries an asterisk. Scorecards and daily charts carry it, and so do the Google Ads and LinkedIn Ads tables with a comparison. A steady advertiser who ran as few days in both periods is not flagged.

Secondary dimensions

Dimensions are the ways you break a metric down — by campaign, ad group, landing page, device, country, and so on, depending on what the source exposes. A secondary dimension adds a second layer to a table so you can read two attributes at once: campaign by device, for example, or landing page by country. It's the difference between "this campaign spent X" and "this campaign spent X, and most of it went to mobile." Reach for a secondary dimension when a single breakdown raises an obvious follow-up question. Keep it to one extra layer in a client-facing table, though — two dimensions illuminate, three usually just clutter.

Filters with AND/OR logic

Filters narrow a widget to just the rows you care about. You can apply several conditions at once and choose how they combine. AND logic requires every condition to be true — "campaign contains Brand AND device is Mobile" — which tightens the focus. OR logic matches rows meeting any condition — "country is Germany OR country is Austria OR country is Switzerland" — which is how you group a region or a set of related campaigns. On Search Console, "Does not contain" leaves the matching queries or pages out, and "Starts with" matches the start: the start of a query, or for a page the path right after the site's address ("/blog" matches every page under /blog, and on a property for a folder such as https://example.com/de/ also every page under /de/blog; a full address such as https://www.example.com/blog matches as written). Until October 2026 both were read as "contains", so a report built with them may show different, correct figures since then. Search Console can join filters with OR only between Page filters or between Query filters, and never with "Does not contain"; such a widget says so instead of showing figures. Combine filters with a secondary dimension and a comparison period and you can answer a precise question on a single widget — say, how this quarter's branded mobile campaigns in the DACH region performed against last quarter — without building a separate report for it. Some campaigns belong in none of a report's figures, for example Meta campaigns of the client's that your agency does not run. In the builder's toolbar, "Exclude Meta campaigns" takes terms such as "Energy": every Meta campaign whose name contains one of them, in upper or lower case, archived and deleted ones included, is left out of the whole report — its Meta Ads widgets, the all-channels totals, comparisons, share links, PDFs, scheduled emails, the API and the AI assistant connector — and every widget it affects says so under its figures. Before showing a period, CrunchJunkie checks that the campaign list adds up to the account's spend; when it does not, or more than 200 campaigns match, the Meta widgets show no figures and say why, rather than figures that might still include those campaigns. The builder's "Campaigns" picker works the other way round for Google Ads: it narrows a report to campaigns you choose. It lists the campaigns of every Google Ads account of the client, grouped by account; an account with more than 200 campaigns shows the first 200 by name with its total, and the search finds the others. Campaigns belong to one account, so the choice applies to that account only: widgets of the client's other Google Ads accounts keep their whole figures, and an all-channels widget adds the chosen campaigns of the one account to the others in full. A chosen campaign counts whatever its status, so a campaign removed since keeps its history. Every widget the choice narrows says so under its figures ("Google Ads figures: 2 chosen campaigns of Acme only", with the campaign names when they fit), an all-channels widget names the accounts it includes in full, and the AI summary, the API and the AI assistant connector are told the figures are not the whole account's.

GA4 e-commerce products by traffic source

A common client question is "which products did a given channel actually sell?". You can answer it on a single GA4 widget. Build a table on a GA4 data source, set its dimension to an item breakdown — Item name, Item category or Item brand — and choose e-commerce metrics such as Items purchased, Item revenue, Items added to cart or Items viewed. Then add a filter on the traffic source, using Session source / medium (for example "google / cpc" for Google Ads, or "google / organic" for organic search), Session source, or Session medium. The result is a product breakdown scoped to that channel — for instance, the items purchased by visitors who arrived from Google Ads. Swap the filter value to compare channels, or drop the filter to see products across all traffic. It's a filtered breakdown rather than a separate pre-built metric, so you keep full control over which items, metrics and source you're looking at.