Dates and comparisons
Kreel needs one consistent answer to a question like “what does last 7 days mean.” This page covers how date ranges are built, why ad metrics stop at yesterday, and how the Compare To options work, including why a comparison sometimes shows a dash instead of a percentage.
The same rules apply everywhere: the dashboard, the REST API, and MCP tools like get_performance.
Calendar days and your reporting timezone
Section titled “Calendar days and your reporting timezone”Every date range in Kreel is a span of whole calendar days in your brand’s reporting timezone, not UTC and not your browser’s timezone. You choose that timezone when creating the brand and can change it in the brand’s settings; while Shopify is connected, the store’s own timezone takes over automatically. Every timestamp-based record (a Shopify order, a Klaviyo email send) is converted into that timezone’s day boundaries before it’s counted.
Date ranges are inclusive on both ends. A “last 7 days” query run on July 20 covers July 13 through July 19: 7 calendar days, not 8, and never including today.
Custom Range has no lower bound - you can pick a start date as old as your connected platforms’ history, not just the last 90 days. It’s capped only on the high end, at today.
Ad metrics end yesterday
Section titled “Ad metrics end yesterday”Meta Ads and Google Ads data always ends at yesterday, never today. Both platforms’ own reporting for “today” is still settling, so Kreel only pulls a day in once it’s finished. Check ad performance in the middle of the day and you’ll see numbers current through yesterday, not this morning’s spend.
Shopify and Klaviyo rolling windows follow the same rule: “last 7 days” and “last 30 days” stop at yesterday too, so a range labeled the same way means the same span of days no matter which metric you’re looking at. Month to Date is the exception: since it’s defined as the current month through today, it can already include today’s Shopify and Klaviyo activity so far.
For how often each platform’s underlying data actually refreshes, see Sync and data freshness.
Comparison windows (Compare)
Section titled “Comparison windows (Compare)”A Compare control sits directly in the Analytics range bar, next to the date range picker, on every Dashboard page. It’s a persistent, always-visible group of three options - Off, Previous Period, Same Period Last Year - not something you have to open the date picker to find. The date range picker also keeps its own Compare To section with the same three choices (there it’s still labeled No Comparison instead of Off); the two controls write the same setting and always stay in sync, so it doesn’t matter which one you use.
- Previous Period compares your selected range to the equal-length range right before it. A 7-day window compares to the 7 days before that. The exception is Month to Date: instead of comparing to the trailing days of the previous month, it compares to the same day-span of the previous calendar month (July 1-4 vs. June 1-4, not June 27-30), since month-end days behave too differently to make a useful comparison. If the current month has more days than the previous month, the comparison clamps to the previous month’s last day rather than bleeding into days you’re currently viewing (March 1-31 compares to Feb 1-28).
- Same Period Last Year compares to the exact same calendar dates one year earlier. This is calendar-aligned, not weekday-aligned, so a Monday can end up compared against what was a Tuesday last year. Feb 29 clamps to Feb 28 in a non-leap comparison year.
- Off (No Comparison in the date picker) turns off delta and percentage-change rendering entirely. There’s no stale comparison left behind when you pick this.
Once a comparison resolves, a single line under the page header states the exact window it landed on (for example vs Jun 1, 2026 - Jun 30, 2026, or the coverage-failure sentence when it couldn’t resolve - see below).
Individual KPI card badges carry the same window as a hover tooltip rather than repeating it as visible text next to every card.
How a comparison reads on a campaign table
Section titled “How a comparison reads on a campaign table”Drill-down tables - Meta, Google, and TikTok campaigns (including Meta’s ad sets and ads), and the Email campaign and flow tables - show each compared number as two lines in the same cell: the value on top, a small signed delta underneath. Every compared column uses this same two-row layout, so a table full of comparisons stays easy to scan.
Each row is matched to its counterpart in the comparison period by identity (the same campaign, ad set, ad, or flow), and can land in one of a few states:
- A resolved delta - a colored, signed change, for example
+12.3%or-0.4 pp(percentage points for rate metrics), or an unsigned0.0%when it’s genuinely flat. new- the row had no activity in the comparison period at all, so there’s nothing to compare against; shown as the word “new,” not a fabricated +∞% or +100%.no comp.- the comparison was suppressed for this row or card; hover it for the exact reason (see below).- An em dash
—- the row was compared, but the delta itself isn’t a meaningful number (for example a zero baseline that would produce a fake spike) - see How to read the numbers for the general dash convention.
When a comparison is suppressed
Section titled “When a comparison is suppressed”Coverage for a comparison window is all-or-nothing, and it’s checked per data source.
If any part of the comparison window falls outside the history Kreel actually has for a given platform, Kreel suppresses that comparison (no comp.) rather than computing a percentage against too little data, which would otherwise render as a meaningless spike like “+400%.”
This is judged per platform, not per brand.
Years of Shopify history don’t vouch for a Meta Ads connection you only made last month.
Ask for a year-over-year comparison and the Shopify numbers can compare fine while the Meta numbers show no comp., in the same view.
The reason is always a plain sentence, never a raw internal identifier or a bare date that doesn’t explain itself:
| What happened | What you see |
|---|---|
| The account hasn’t synced recently | "Comparison paused - data has not synced since {date}." |
| Comparison window starts before Kreel’s history for this source | "Comparison unavailable - synced history starts {date}." |
| No synced data covers the comparison period at all | “Comparison unavailable - no synced data covers the comparison period.” |
| The comparison period is still syncing | “Comparison-period data is still syncing.” |
| The comparison period’s sync failed | “Comparison-period data failed to sync. Retry it from Connections.” |
The “synced history starts” reason always names whichever bound actually limits the read - verified sync coverage or, if that’s later, the point Kreel’s background materialization has reached - so the date shown is the one that’s actually blocking the comparison, not always the earliest date Kreel has ever seen for that source.
Comparisons from the API or an agent
Section titled “Comparisons from the API or an agent”get_performance and similar MCP tools take a compare_to_previous flag that adds an equal-length prior-period comparison to the response.
It’s the same Previous Period logic described above, scoped to the fields that tool returns.
See MCP data tools for the exact parameters and which entity types support it.
Need help?
Section titled “Need help?”Email support@kreel.ai.