HubSpot ships with a solid set of relative date filters. "This Month." "Last Quarter." "Last 30 Days." For most people, most of the time, that's fine.
But if you're doing any real cohort analysis, say, comparing pipeline performance from exactly four to five months ago regardless of the current date, those built-in filters fall apart fast.
They're calendar-based, not rolling. "Last Quarter" means the previous calendar quarter. It doesn't mean "the 90 days before the 90 days before today." That's a different thing. And for teams tracking things like time-lagged conversion rates, cohort-level churn, or rolling revenue windows, that difference matters a lot.
The fix is surprisingly clean once you know it exists.
If your team reports on rolling date windows, anything that needs to stay anchored to "now minus X months" rather than a calendar period, this setup gives you properties that update themselves automatically on the first of every month. You build the filter once, and your reports stay accurate forever.
No manual exports. No "wait, which quarter was that again?" No date logic errors buried in a spreadsheet someone else built.
It's also a great example of using HubSpot's automation layer to fix gaps in the reporting layer, which is exactly the kind of systems thinking that separates a well-run HubSpot portal from a messy one.
First, create two new custom properties on the object you're reporting on (deals, contacts, companies; wherever your data lives).
Go to Settings > Properties, select your object, and create two new properties:
report_window_start - Field type: Date picker
report_window_end - Field type: Date picker
Use date picker rather than text. Text properties can store a date string, but date picker properties work cleanly as filters in custom reports without any extra formatting workarounds.
Go to Automation > Workflows and create a new workflow. Under the trigger options, choose a specific date, and set it to fire on the 1st of every month.
This is the scheduled workflow pattern. It runs on a fixed calendar cadence rather than in response to record activity. It's what makes the whole thing auto-updating.
For the enrolled records: you'll enrol all records of the relevant object type (all contacts, all deals, etc.), or a filtered subset if you only want this to apply to a specific segment.
Inside the workflow, add a Format Data action. This is the Data Hub action that lets you perform date arithmetic, specifically, adding or subtracting time from a date value.
Here's the setup for a 4 to 5 months ago rolling window:
Action 1 - Set the window start:
Action 2 - Set the window end:
Every time this workflow fires on the 1st, both properties get stamped with fresh dates. The window shifts forward automatically.
If you're using the add_time() function in a calculated property formula instead (available in the custom equation builder under Settings > Properties > Calculation), the syntax looks like this:
add_time([properties.create_date], -5, "months")
That said, for the scheduled workflow approach, you don't need calculated properties at all, the Format Data action handles the arithmetic directly.
Now, when building custom reports in HubSpot, filter using your new properties instead of the default date filters.
In the Custom Report Builder, add a filter condition like:
Because both properties are date pickers and auto-update on the 1st of each month, your report always reflects the exact rolling window you defined, without touching it again.
A few things worth knowing:
The workflow needs re-enrolment enabled. Make sure your workflow is set to re-enrol records every time the trigger conditions are met, otherwise records that were already enrolled won't get updated properties on the next run.
Dates in HubSpot are stored as UNIX timestamps (in milliseconds). You don't need to worry about this for the Format Data action, but if you're building calculated properties with custom equations, the raw values will be in milliseconds. Use a converter or account for this in your formula.
The 5-property limit on calculated properties (Professional tier) is real. If you're creating multiple custom equations, keep an eye on this. Scheduled workflows writing to date picker properties don't count toward this limit, which is another reason to prefer the workflow approach for this use case.
This requires Data Hub Pro or Enterprise. If you're on a lower tier, the Format Data action and scheduled date triggers won't appear. The workaround is a third-party tool like Make or Zapier to handle the date logic externally and write back to HubSpot via the API.
This hack is a good example of a pattern that shows up a lot in well-built HubSpot portals. When the reporting layer doesn't have what you need, the automation layer usually can.
HubSpot's reporting is strong, but it's built for the common case. When your use case drifts away from calendar quarters and 30-day windows, you need to engineer the data your reports depend on, not try to bend the filters into shapes they weren't designed for.
Custom properties, written by a scheduled workflow, give you anchor points you fully control. Once you've done this once, you'll start seeing other places where the same pattern applies.
If reading this made you think "we need about six of these across three objects and I don't have time for that", that's exactly the kind of systems work we do at Neighbourhood.
We're a Diamond HubSpot Partner, and we spend a lot of time inside portals fixing reporting setups that grew faster than they were designed. If your HubSpot data is technically in there but doesn't actually tell you what you need to know, get in touch. We'll take a look and tell you honestly what's going on.
Talk to us about your HubSpot setup.
We've been sharing shorter, sharper HubSpot tips, including stuff like this, on our Facebook and YouTube channels. If you prefer to watch someone click through a workflow rather than read about it, come find us there. We're building a library of practical how-tos for HubSpot admins and RevOps teams who want to get more out of what they've already paid for.
Happy HubSpotting!