A wool coat sitting in the warehouse in June is in stock, correctly priced, and completely available. Every automated stock rule you own will happily keep advertising it, because none of them know what month it is for.
Direct answer: Neither Meta nor Google can exclude off-season products on their own, because season is not a field they hold. You supply it, normally as a Shopify tag or metafield that flows into a catalogue field on Meta and a custom label on Google, then build product sets and product groups that filter on it. After that the seasonal switch is a rule change rather than a fortnight of manual tidying.
Questions that bring people here
Why availability cannot carry this
Availability answers one question: can this ship. Season answers a different one: should we be pushing this now. Off-season inventory is the case where those two diverge completely, and it is why teams who have solved stockouts properly still bleed money in the shoulder months.
It shows up as a slow leak rather than a crisis. Nobody notices the winter coat taking four percent of catalogue impressions through July, because no individual day looks wrong.
Season is not one thing
Worth separating before you build anything, because these need different treatment:
- Weather-driven. Coats, swimwear, fans. The turn moves with the actual weather, so the dates shift a fortnight year to year. Worth checking against whether weather really moves your demand before you assume.
- Occasion-driven. Christmas, Valentine's, Mother's Day. Hard dates, brutal cliffs. Demand goes to roughly nothing the day after, and staying on for a week is pure waste.
- Fashion-season-driven. Your own drop calendar, which may have nothing to do with the weather and everything to do with when the collection landed.
- Not seasonal at all. The core range. Tag it explicitly as all-year so it never gets swept up by a rule someone writes in a hurry.
The mistake worth avoiding
The tempting shortcut is to build the season into product set names and manage it by swapping sets twice a year. It works the first year, while the person who built it is still there and remembers which of the eleven sets are current.
By year two you have sets called AW Core, AW Core v2, AW Core FINAL and nobody willing to delete any of them. That is the mechanism behind product set rot. Putting season in the data and letting the rule read it means the set definition never changes, so there is nothing to accumulate.
If your seasonal switch requires someone to remember, it will be late every year, and later each year.
The shoulder months are where the money is
Most teams get the peak right and lose the edges. Turning on too late means competitors have already bought the early demand, usually cheaper than it will be at peak. Turning off too late means paying full auction prices for a product with collapsing conversion.
Both edges are worth more than the peak optimisation everyone focuses on, because at peak you are bidding against everyone and at the edges you are not. Once season is a data field, the edges become a scheduling decision you can actually tune rather than an annual scramble.
Set up seasonal exclusion for catalogue ads
- Define seasons as a short closed list. Four or five values at most: for example spring-summer, autumn-winter, all-year, occasion, clearance. Long lists rot because nobody remembers the difference between two similar values, and the tagging becomes inconsistent within a season.
- Put the season on the product in Shopify. Use a metafield if you are comfortable with them, or a tag with a strict prefix like season:aw. One home, upstream of everything else. Bulk apply by collection to get most of the catalogue done in one pass, then fix the edge cases by hand.
- Carry it into Meta as a catalogue field. Your feed or sales channel needs to pass the season through to the catalogue so product sets can filter on it. Confirm the field actually arrives by inspecting a product in Commerce Manager, rather than trusting that mapping worked.
- Carry it into Google as a custom label. Custom labels 0 to 4 are the right home. Pick one label for season, write down which one, and do not reuse it for anything else. A supplemental feed is the safe way to populate it without touching your primary feed.
- Build sets and product groups that read the season. On Meta, create product sets filtered to the in-season value rather than editing one giant set twice a year. On Google, subdivide product groups by the custom label. Now the season is a lever rather than a manual clean-up job.
- Find your real switch dates from last year's data. Pull daily units for the category for the previous two years and find where the curve genuinely turns. Note those dates. Almost everyone discovers the turn is earlier than the date they have been using, often by several weeks.
- Ramp rather than flip. Move budget across over one to two weeks instead of switching overnight. A hard cut throws away in-season learning on the arriving set and strands demand on the departing one, and both cost more than the gradual version.
- Keep a clearance path for what did not sell. Off-season stock still has to go somewhere. Excluding it from prospecting while keeping it in a clearance set with its own budget and margin floor is usually better than hiding it completely and discovering it again next year.
Trigger types: weather, stock and date, and what each one can honestly fire
Once season lives in the product data, the next question is what pulls the lever. Three trigger families get used for this, and they behave very differently once money is attached. Mixing them up is how brands end up with a rain alert that somehow reallocated a week of budget.
| Trigger | Typical rule | What it should be allowed to do | Honest limit |
|---|---|---|---|
| Weather forecast | Three consecutive days forecast above 22C, or 5mm rain in the next 48 hours | Raise or lower a flag on a set, prompt a human to bring the switch forward | Forecasts revise. A trigger that writes budget direct will act on a figure that changed by morning |
| Stock cover | Days of cover under 14 on the core sizes of an in-season line | Narrow the set, cap budget, hold back the last units | Cover is only as good as your inbound dates, so check the purchase order feeding it |
| Availability | Variant goes to out of stock on Shopify | Drop the item from the catalogue set within the next sync | Says nothing about season. The June coat is available and still wrong |
| Calendar date | Switch autumn-winter sets live on the date last year's curve turned | Stage the set swap and the budget ramp in advance | Dates drift a fortnight with the weather, which is why the first row exists |
The practical arrangement is weather as context, stock as a constraint, date as the default. Weather tells you the turn has arrived two weeks earlier than your calendar said; days of cover tells you whether you have the units to serve it; the date-driven set swap is what actually ships. Keep the weather signal in the brief you read in the morning rather than wired to a budget field, and you get the early warning without the whiplash.
On Ralph's desk at /#desk that split is built in. Weather appears as demand context and does not spend, and it is not an hour writer either. Stock exclusions run per campaign at SKU, size or colour level, with those writers default off until you turn them on. Product sets drafted from the smart catalogue stay paused until you approve them, so a seasonal swap arrives as a pending change you read, not a surprise in Commerce Manager. Feed changes go to a supplemental Google Merchant Center feed, never over your primary.
Where to look when you are testing a trigger by hand:
- Commerce Manager, Catalogue, Product sets: confirm the filter reads your season field and check the item count before and after.
- Merchant Center, Feeds, Supplemental feeds: the only safe place to populate the custom label carrying season.
- Google Ads, the listing group on the Shopping or Performance Max campaign: subdivide by that one label and nothing else.
- Shopify admin, Products, filtered by your season tag: the count here is the number that should arrive on both platforms. If it does not match, the mapping is the fault, not the rule.
Ralph is on a private beta waitlist rather than open signup, so treat the above as the manual version you can run this week and the desk as the version that keeps the staging and the audit trail.
Questions people actually ask
Can Meta or Google exclude seasonal products automatically?
Not on their own, because neither platform knows what season a product belongs to. Availability is the only stock-shaped signal they hold natively, and an off-season coat sitting in the warehouse is entirely available. You have to supply the season as data, usually through a custom label or a tag, and then build sets or rules that read it.
Should I exclude off-season stock or just bid down?
Bid down first, exclude second. Off-season demand is smaller but rarely zero, and it is often unusually profitable because there is less competition and less discounting. Full exclusion suits genuinely dead categories such as Christmas decorations in March. A bid reduction or budget cap suits everything with a long tail.
Where should the season live: Shopify tags or the feed?
Shopify, in a metafield or a tag, so it has one home and flows outward from there. Setting the season only in the feed tool means it is invisible to your storefront merchandising and to everyone who does not have a feed login, and it will drift.
How far ahead should the switch happen?
Ahead of your demand curve rather than the calendar. Search interest for swimwear rises weeks before anyone is warm, and the brands who win the season are already serving when it does. Move on your own data from previous years, not on the solstice.
our catalog has seasonal products and i need to automatically exclude off-season inventory from meta catalog ads without manual intervention, which platforms handle this?
Tag products by season in Shopify, push the tag to a custom label in your Meta feed, and build product sets that exclude the off-season label. Feed tools automate the label; Ralph can stage the set changes and the date-driven switch for approval. The method and the calendar are on this page.
Can I trigger catalogue ads from a rain forecast?
You can, but fire a flag rather than a budget. Forecasts revise overnight, so a rule that writes spend acts on a number that no longer holds. Use the forecast to bring a planned seasonal switch forward or back by a few days, with a person confirming. In Ralph, weather is demand context on the brief and never spends on its own.
What is stock-triggered advertising, and how is it different from availability-triggered?
Availability-triggered reacts after a variant hits zero, which is already late. Stock-triggered uses days of cover, so a line with eleven days left in core sizes gets narrowed or capped before it sells out. Availability is a binary platform field; cover is a forecast you supply. Seasonal exclusion needs a third signal again, because off-season stock is plentiful and still wrong.
Does weather-triggered marketing work for off-season exclusion?
It helps at the edges rather than the core. Weather moves the turn date for coats, swimwear and fans by a fortnight either way, so it is a good reason to switch two weeks early. It cannot tell you a Christmas product is dead in March. Keep calendar and season data as the mechanism and weather as the nudge.
If the catalogue is the problem: Ralph maps every Shopify variant to its Meta and Google catalogue item, scans for missing attributes, and drafts the fixes and the feed changes for approval. See Ralph · How Ralph reads the catalogue · Docs