Dated Shopify packs: publish, end date, archive
How to run a dated Shopify pack from publish to takedown — pick the end trigger (date or gift stock), work around the missing unpublish date with Flow or a calendar, take it down in the right order, choose archive vs delete vs re-run, and record the numbers before the report window rolls.
Jeshua Leger
Founder, Leger Studio ·
It is January 9. The “Holiday Glow Set — ends Dec 24” is still the second tile in the Gifts collection, still in the Google Shopping feed, and it sold eleven units this month at December’s price. Before that, the holiday tins ran out on December 19, so for five peak-shopping days the set sat at the top of the collection marked Sold out while the serum inside it was in stock the whole time. Nothing was misconfigured. Shopify has a publish date and no unpublish date, the pack is a real product — which is the point of it — and real products keep appearing everywhere real products appear until somebody ends them.
This post does one job: take a dated pack down on its end date so the next morning it is not still selling, ranking, feeding an ad, or holding an active-bundle seat — and decide what happens to the product afterwards. It is not about building the offer; that is the gift-with-purchase, fixed-price packs, and product kits pages. It is not about what a sitewide sale does to the pack while it is live (discount stacking) or what happens when one item comes back (returns and partial refunds). Those posts assume the pack exists. This one is about making it stop existing on time.
A dated pack ends three times, not once
A pack is finished when it is no longer visible, no longer purchasable, and no longer counted. Those are three separate states with separate switches, and a zombie pack is one where you flipped some of them:
- Visible: the product is published to the Online Store and any other channel (Shop, Google & YouTube, POS), sits in manual and automated collections, appears in storefront search, and has an indexed URL that ads, emails, and the component pages link to.
- Purchasable: the bundle is Active in Better Bundles and the Shopify product is Active. The troubleshooting docs list those as two separate checks because they are two separate switches — flip one and not the other and the app and Shopify disagree about whether the pack is for sale.
- Counted: the bundle occupies an active-bundle seat on Basic, it is in scope of any discount that targets its collection or tag, and its components are still stocked for a campaign that has ended.
The January scenario above is a pack that was never ended on any axis. The December 19 scenario is the other kind: a pack that stopped being purchasable — sold out through its shortest component — while staying fully visible. Both are what “nobody owned the end date” looks like in the admin.
Pick the end trigger before you publish: the date or the gift
Pack availability is the minimum across components of stock ÷ quantity per pack (how availability is calculated). In a seasonal set, the seasonal component — the tin, the ornament, the holiday scent — is almost always the shortest branch, because you bought a fixed lot of it and you buy the hero continuously. So a dated pack can end two honest ways, and the PDP copy must match the one you chose:
- Date-ended: “Available through December 24.” You are promising availability for the whole window, so the seasonal component’s cover at the pack’s expected velocity has to exceed the window. If 300 tins are bought and the set is forecast at 12 a day across a 30-day window, you are 60 short and the copy is false on day 25.
- Stock-ended: “While supplies last.” The pack ends when the tins do. You accept that the set may vanish mid-window — and you take responsibility for pulling the Sold out tile, because component sell-through does not unpublish anything; the pack simply shows as sold out and stays where it was.
For a stock-ended pack, decide up front what happens on sell-out day. The cheap version is a daily Shopify Flow that emails you every product at zero available, so the sold-out tile is a morning task rather than a five-day accident. The tidier version is to treat sell-out exactly like the end date and run the takedown sequence below.
Title, handle, and tag: decide now whether next year is the same URL
Because the pack is a real product, its URL handle is yours to set and search engines index it like any other product page (set the URL handle). That makes the handle a lifecycle decision, not a naming one:
- Comes back every year with roughly the same contents → undated handle (holiday-glow-set), year in the title if you want it, and plan to archive and unarchive the same product. The URL keeps its history, and last year’s emails and ads still resolve when it returns.
- One-off → a dated handle is fine (holiday-glow-set-2026), and the takedown includes a redirect.
- Never rename a dated pack into an evergreen one under the same URL at a different price. Search snippets, saved carts, and wishlists show December’s number against January’s page. Publish the evergreen pack as its own product and archive the dated one.
Give every dated pack a campaign tag on top of the default bundle tags from Settings (for example campaign-holiday-2026). It is the filter your takedown automation will select on, the thing your sale-collection exclusions can read (scope, not toggles), and the fastest way to answer “what is still live from last season?” in the product list.
Takedown mechanics: publish date exists, end date does not
Shopify’s Online Store channel can schedule when an Active product becomes available, so the launch side of a dated pack is one field. There is no equivalent field for the end. You have two ways to end visibility on time, and one habit to avoid:
- Manual, with an owner. A calendar entry at the end hour, naming the person who unpublishes. Fine for one pack; unreliable for six across two people over a holiday.
- Shopify Flow. A Scheduled time trigger at the end date and hour → Get product data filtered by the campaign tag → For each → Unpublish product from the channels you choose. Shopify publishes this as a template. Know what it does and does not do: it removes the product from the selected channels. It does not archive the product, and it does not set the bundle to Draft in the app. It ends visible; you still end purchasable and counted the next morning.
- Not by inventory. Do not end a pack by zeroing the seasonal component or the hero. Component stock is shared — there is no second pool for the pack — so zeroing the tin also kills its solo PDP, and zeroing the hero kills everything the hero is in.
The morning after the end (or the morning after sell-out, for a stock-ended pack), run this in order:
- Confirm visibility ended everywhere. Open the product and check its sales channels — Flow only unpublished the channels you selected. A pack pulled from the Online Store but still in Shop or Google & YouTube is still selling.
- Set the bundle to Draft in Better Bundles, then set the Shopify product to Archived. Two switches. Do not assume a channel unpublish changed the app’s status — open the bundle and check.
- Redirect the URL if the handle is dated or the pack is not coming back: Online Store → Navigation → URL redirects, pointing to the hero PDP or the gifts collection. Shopify serves a redirect only for a path that no longer resolves, so an archived product’s URL will follow it; if you unarchive next year, delete the redirect first.
- Pull the pointers Shopify cannot see: paused ad sets and shopping campaigns targeting the pack URL, email and SMS flows that link it, and the “complete the set” sentence you wrote into the component product descriptions — archiving the pack does not edit the hero’s copy.
- Recount. Basic allows 3 active bundles and status lives in the app, so a pack you only unpublished in Shopify is still one of the three until it is Draft. Then check any automatic discount whose scope was a collection that contained the pack.
- Write down the numbers from the next section. Today.
Run steps 1 and 2 at a quiet hour, not at 9 p.m. on the last day. Shoppers with the pack in an open cart find it unavailable at checkout the moment it is unpublished; that is the accepted cost of a hard end time, and the reason “ends at midnight” should mean the morning after in practice.
Archive, delete, or re-run: the rule
- Archive is the default. Any pack that took a paid order stays as an archived product at least through your returns window — support and refunds reference it (returns and partial refunds) — and in practice forever, because archived products cost nothing.
- Delete only a pack that never sold and will never return — a set built for a campaign that was cancelled. Even then, archive is fine.
- Re-run next season: unarchive the product and reopen the bundle in the app. The editor’s go-live checklist is doing real work here — it flags a component that no longer exists (last year’s tin was discontinued) and a fixed price that now exceeds the combined component total. Component prices have moved since last year, which means a fixed-price set’s discount percent moved with them; rerun the margin row before you set it Active. Re-save the bundle so the latest configuration is pushed to checkout (troubleshooting), and set the new publish date.
- Convert to evergreen when the set out-earned the hero it replaced and you want to keep selling it: publish a new pack with an evergreen title, handle, and price, then archive the dated one. The dated URL redirects to the new pack.
Count it before the report window rolls
Better Bundles reports look back 30 days on Basic and Starter, 90 on Growth, and 365 on Pro, with CSV export on Pro (reports). On Starter, a six-week campaign has already lost its first week by takedown day, and by the time someone asks in February whether the set was worth repeating, the whole window is gone. So takedown day is report day. Record, into the campaign card below:
- Bundle units sold and discounts given for the pack, from the Reports page, over the exact window.
- Hero solo units for the same window and for the same window last year, from Shopify’s sales by product — the cannibalization check from the margin post.
- Sold-out days: how many days inside the window the pack showed Sold out. Every one is a day the tile was working against you.
- Seasonal component left on hand, by location.
Leftover seasonal components are not pack stock
Archiving the pack releases nothing, because there was nothing to release: the pack never had its own stock pool. What you have on January 9 is 140 tins in component inventory with a solo PDP and no campaign. Four things you can do with them, in the order I would consider them:
- Sell them solo at a markdown. The tin has its own product page; a price change is the whole plan.
- Make them the gift in a January pack. The cash is spent, so the cost of using a tin as a gift is what you could otherwise get for it — its markdown price, not last year’s landed cost. Use it as a gift only if that salvage value is below the contribution lift you expect from the offer, and run the row anyway.
- Carry them to next season only if nothing on them is dated, storage is cheap, and the count is small enough that you are not financing a shelf of tins for eleven months.
- If they are spread across locations, consolidate before you do any of the above. Twenty tins at each of seven doors sells nowhere; 140 at the location that fulfills online orders is a sellable lot (routing as a drain valve; FlowOps, in development, is built for exactly this kind of move).
The one-page campaign card
Every dated pack gets one, written before it is published. Ten lines, and most of the failures above cannot happen when they are filled in:
- Pack title, handle, and campaign tag
- Publish date and hour (the scheduled availability field)
- End trigger: date, or seasonal component stock — and the PDP copy that matches it
- End date and hour, and the owner who confirms it happened
- Takedown method: Flow workflow name, or the calendar entry
- Channels the pack is published to (so step 1 has a list to check against)
- Afterlife: archive and re-run under the same handle / archive and redirect / convert to evergreen
- Report-day numbers: pack units, discounts given, hero solo units this year and last, sold-out days
- Leftover plan for the seasonal component, by location
- Basic only: which of the 3 active seats this pack holds, and what replaces it
Publish dated packs you can end
A dated pack is only as good as its takedown, and takedown is easy when the pack is a real product with its own switches: a status in the app, a status and channels in Shopify, a handle you chose, and a tag automation can select. Better Bundles gives a dated set all of those on every plan, applies its savings at checkout with Shopify Functions, and keeps availability tied to real component stock so the pack goes sold out instead of overselling the tins. Basic is free forever with up to 3 active bundles — one dated set at a time is comfortable if you draft it the morning after; Starter, Growth, and Pro are $17 / $37 / $77 a month with a 15-day trial and unlimited bundles, with 90- and 365-day report history on Growth and Pro for campaigns you compare year over year. Start with create your first bundle, add the campaign tag to the pack product in your Shopify admin, and fill in the campaign card before you set it Active.