Holiday Shipping Cutoff Checker
Find the last day customers can order on each shipping service and still get it by the holiday, check every delivery promise against it, and plan the switch to expedited and e-gift cards.
What it does
- Works out the last safe order date per shipping service and checkout rate from where your customers live, carrier transit days and published ship-by dates, with sources
- Models when orders leave the warehouse: cutoff time, weekends, closures and the BFCM backlog (first in, first out), with ship times by order date and the day the backlog clears
- Checks every delivery promise on the site, at checkout and in emails and SMS: late order-by dates or stated times, undated "by Christmas" lines and times the backlog breaks
- Builds a dated messaging calendar with plain copy (BFCM shipping note, cutoff reminders, expedited only, then e-gift cards), a fix list and a verdict
- Read-only and runs on local files, with a tested sample store and 19 end-to-end checks
Before you start
- Your warehouse's order cutoff time, working days, closed dates and daily pick/pack capacity, and roughly what share of orders arrive after the cutoff
- Transit days by carrier zone for each service you offer, and each carrier's holiday ship-by dates with the page URL once published
- Orders by carrier zone, from a ShipStation or Shopify orders export and the USPS zone chart; optionally projected orders per day and every place you show a delivery date
- Using the Budget Planner's daily plan CSV? Pass `--aov` with the planner's AOV (88.66 in its sample); the plan has net sales, not orders
- Python 3.8 or newer. Nothing to install and no API keys needed
See an example
Example output from a sample run. Company names and figures are sample data.
Fictional sample store: Fernhill Goods. Offline demonstration only.
Holiday Shipping Cutoff Check: Fernhill Goods, as of 2026-10-07
Verdict: NOT READY. 1 risky promise, 2 warnings and 1 note. Goal: delivery by Thu Dec 24, 2026 for at least 95% of customers.
Last safe order dates (orders placed by 1:00 pm ET):
- USPS Ground Advantage (Standard): Mon Dec 14, from the carrier ship-by date (source: sample)
- UPS Ground (Standard): Tue Dec 15, from transit by zone (source: sample)
- UPS 2nd Day Air (Express): Mon Dec 21, from transit by zone (source: sample)
- By checkout rate (a rate that uses several carriers gets the earliest date): Standard Mon Dec 14, Express Mon Dec 21
BFCM backlog: orders placed Thu Nov 26 – Mon Nov 30 ship within 3 business days; the backlog clears Thu Dec 3.
Issues, most severe first (all detected, none changed)
- RISKY: Site banner says order by Dec 18; Standard needs orders by Mon Dec 14 (4 days earlier).
- WARNING: Email: Holiday gift guide (sends Thu Dec 3): "Guaranteed delivery by Christmas on every order." has no order-by date or shipping method.
- WARNING: FAQ: Shipping says orders ship within 1 business day; orders placed Fri Nov 27 – Tue Dec 1 take up to 3 (BFCM backlog).
- INFO: Gift guide page says order by Dec 10, 4 days earlier than Standard needs (Mon Dec 14).
1. Last safe order dates (deliver by Thu Dec 24, 2026)
Safe means at least 95% of customers, weighted by where your orders go, get the order by Thu Dec 24. Dates are for orders placed by 1:00 pm ET; an order placed later counts as the next working day's order.
Zone mix (destinations.csv, 3,292 orders): zone 1 1.9%, zone 2 6.9%, zone 3 10.1%, zone 4 30.0%, zone 5 22.1%, zone 6 10.0%, zone 7 5.0%, zone 8 14.0%.
| Service | Checkout rate | Last safe (≥ 95%) | At 80% | At 99% | From transit | Carrier ship-by date | Based on |
|---|---|---|---|---|---|---|---|
| USPS Ground Advantage | Standard | Mon Dec 14 | Mon Dec 14 | Mon Dec 14 | Wed Dec 16 | Mon Dec 14 (sample) | carrier ship-by date |
| UPS Ground | Standard | Tue Dec 15 | Wed Dec 16 | Tue Dec 15 | Tue Dec 15 | — | transit by zone |
| UPS 2nd Day Air | Express | Mon Dec 21 | Mon Dec 21 | Mon Dec 21 | Mon Dec 21 | Tue Dec 22 (sample) | transit by zone |
Standard ships with USPS Ground Advantage and UPS Ground. Customers can't pick the carrier, so Standard's last safe date is the earlier one, Mon Dec 14. To keep Standard open until Tue Dec 15, ship every Standard order placed after 1:00 pm ET Mon Dec 14 with UPS Ground.
Where each date comes from:
- USPS Ground Advantage: transit 2, 2, 2–3, 3, 3–4, 4–5, 4–5, 5 business days for zones 1–8, plus 2 peak days you added for December delays; delivers Mon–Sat; no delivery Thu Nov 26, Fri Dec 25. Source: sample (fictional carrier data). Ship-by date Mon Dec 14. Source: sample (fictional, not a date USPS published).
- UPS Ground: transit 1, 1, 1–2, 2, 3, 3–4, 4, 4–5 business days for zones 1–8, plus 2 peak days you added for December delays; delivers Mon–Fri; no delivery Thu Nov 26, Fri Dec 25. Source: sample (fictional carrier data).
- UPS 2nd Day Air: transit 2 business days in every zone, plus 1 peak day you added for December delays; delivers Mon–Fri; no delivery Thu Nov 26, Fri Dec 25. Source: sample (fictional carrier data). Ship-by date Tue Dec 22. Source: sample (fictional, not a date UPS published).
Share of customers who get an order by Thu Dec 24, by order date (orders placed by 1:00 pm ET):
| Order date | Ships (ordered by 1:00 pm) | Ships (ordered later) | USPS Ground Advantage | UPS Ground | UPS 2nd Day Air |
|---|---|---|---|---|---|
| Thu Dec 10 | Thu Dec 10 | Fri Dec 11 | 100% | 100% | 100% |
| Fri Dec 11 | Fri Dec 11 | Mon Dec 14 | 100% | 100% | 100% |
| Sat Dec 12 (closed) | Mon Dec 14 | Mon Dec 14 | 100% | 100% | 100% |
| Sun Dec 13 (closed) | Mon Dec 14 | Mon Dec 14 | 100% | 100% | 100% |
| Mon Dec 14 | Mon Dec 14 | Tue Dec 15 | 100% | 100% | 100% |
| Tue Dec 15 | Tue Dec 15 | Wed Dec 16 | after ship-by | 100% | 100% |
| Wed Dec 16 | Wed Dec 16 | Thu Dec 17 | after ship-by | 93.0% | 100% |
| Thu Dec 17 | Thu Dec 17 | Fri Dec 18 | after ship-by | 76.0% | 100% |
| Fri Dec 18 | Fri Dec 18 | Mon Dec 21 | after ship-by | 48.9% | 100% |
| Sat Dec 19 (closed) | Mon Dec 21 | Mon Dec 21 | after ship-by | 13.9% | 100% |
| Sun Dec 20 (closed) | Mon Dec 21 | Mon Dec 21 | after ship-by | 13.9% | 100% |
| Mon Dec 21 | Mon Dec 21 | Tue Dec 22 | after ship-by | 13.9% | 100% |
| Tue Dec 22 | Tue Dec 22 | Wed Dec 23 | after ship-by | 0% | 0% |
| Wed Dec 23 | Wed Dec 23 | Thu Dec 24 | after ship-by | 0% | after ship-by |
2. Fulfillment and the BFCM backlog
Columbus, OH warehouse (America/New_York): orders placed by 1:00 pm ET on a working day (Mon–Fri) ship the same day; later orders and orders placed on a closed day count from the next working day. Closed: Thu Nov 26 (Thanksgiving), Fri Dec 25 (Christmas Day). Capacity 250 orders per working day. 60% of orders come in after the cutoff. Demand: demand.csv, Sun Nov 1 – Thu Dec 24 (3,543 orders).
Orders placed Thu Nov 26 – Mon Nov 30 ship within 3 business days; the backlog clears Thu Dec 3. The worst extra delay is 2 business days (orders placed Sun Nov 29 – Tue Dec 1). Orders placed Tue Dec 1 – Wed Dec 2 also wait, up to 2 extra business days. Peak backlog: 451 orders at close on Mon Nov 30.
| Date | Orders placed | Ready to ship | Shipped | Backlog at close | That day's orders ship | Business days to ship |
|---|---|---|---|---|---|---|
| Wed Nov 25 | 120 | 132 | 132 | 0 | Wed Nov 25 – Fri Nov 27 | 0–1 |
| Thu Nov 26 (closed: Thanksgiving) | 132 | — | closed | 0 | Fri Nov 27 | 1 |
| Fri Nov 27 | 330 | 336 | 250 | 86 | Fri Nov 27 – Tue Dec 1 | 0–2 |
| Sat Nov 28 (closed) | 185 | — | closed | 86 | Tue Dec 1 | 2 |
| Sun Nov 29 (closed) | 150 | — | closed | 86 | Tue Dec 1 – Wed Dec 2 | 2–3 |
| Mon Nov 30 | 205 | 701 | 250 | 451 | Wed Dec 2 – Thu Dec 3 | 2–3 |
| Tue Dec 1 | 94 | 612 | 250 | 362 | Thu Dec 3 | 2 |
| Wed Dec 2 | 52 | 439 | 250 | 189 | Thu Dec 3 | 1 |
| Thu Dec 3 | 44 | 238 | 238 | 0 | Thu Dec 3 – Fri Dec 4 | 0–1 |
Business days to ship count working days after the order date: 0 means it ships the day it was placed. Orders ship first in, first out.
3. Delivery promises
| # | Where | Says | Implies | Order-by | Status | Why |
|---|---|---|---|---|---|---|
| 1 | Site banner | "Order by Dec 18 for Christmas delivery" | Standard | Fri Dec 18 | RISKY | Dec 18 is 4 days after the last safe order date for Standard (Mon Dec 14). Express (by Mon Dec 21) still arrives in time. |
| 2 | Checkout rate name | "Express (UPS 2nd Day Air): order by 1 pm ET Dec 21 for delivery by Dec 24" | Express | Mon Dec 21 | OK | Matches the last safe order date for Express (Mon Dec 21). Gives the cutoff time. |
| 3 | Email: Holiday gift guide (sends Thu Dec 3) | "Guaranteed delivery by Christmas on every order." | any (none named) | — | WARNING | Promises holiday delivery with no order-by date or shipping method and says guaranteed. Standard needs orders by Mon Dec 14 and Express needs orders by Mon Dec 21. |
| 4 | FAQ: Shipping | "Orders placed by 1 pm ET on a business day ship the same day. All other orders ship the next business day." | — | — | WARNING | Says orders ship within 1 business day. Orders placed Fri Nov 27 – Tue Dec 1 take up to 3 business days (BFCM backlog). |
| 5 | Gift guide page | "Order by Dec 10 for Christmas delivery with Standard shipping." | Standard | Thu Dec 10 | INFO | 4 days earlier than needed: Standard orders placed by Mon Dec 14 still arrive in time, so this tells customers ordering Dec 11 – Dec 14 they are too late. |
Items 3 and 4: The FTC's Mail, Internet, or Telephone Order Merchandise Rule (16 CFR Part 435) requires a reasonable basis for any shipping time you state or imply, and when you can't ship on time, a notice that lets the customer agree to the delay or cancel for a prompt refund. Not legal advice.
4. Messaging calendar
Plain copy you can paste; adjust names to your checkout. Delivery dates are estimates, not guarantees.
| When | Switch | Where | Suggested copy |
|---|---|---|---|
| Thu Nov 26 – Wed Dec 2 | BFCM shipping-time note (take it down Thu Dec 3) | Shipping FAQ, cart, order confirmation email | "Orders placed Nov 26 – Dec 2 ship within 3 business days." |
| Mon Dec 7 | Start holiday cutoff messaging | Site banner, product pages, cart, emails | "Order by 1 pm ET Mon, Dec 14 for Standard shipping, or by 1 pm ET Mon, Dec 21 for Express shipping, to arrive by Thu, Dec 24." |
| Mon Dec 14, morning | Last day for Standard | Email, SMS | "Last day for Standard shipping to arrive by Thu, Dec 24: order by 1 pm ET today." |
| Mon Dec 14, 1:00 pm ET | Switch to expedited only (Express) | Site banner, cart, checkout | "Standard shipping will now arrive after Thu, Dec 24. For delivery by Thu, Dec 24, choose Express shipping and order by 1 pm ET Mon, Dec 21." |
| Mon Dec 21, morning | Last day for Express | Email, SMS | "Last day for Express shipping to arrive by Thu, Dec 24: order by 1 pm ET today." |
| Mon Dec 21, 1:00 pm ET | Switch to e-gift cards | Site banner, homepage, email | "Orders placed now will arrive after Thu, Dec 24. Gift cards are delivered by email right away." |
| Thu Dec 24, 1:00 pm ET | Closure notice | Site banner, cart | "We're closed Fri, Dec 25. Orders placed after 1 pm ET Thu, Dec 24 ship Mon, Dec 28." |
| Fri Dec 25 | Take down holiday delivery messaging (schedule it ahead) | Everywhere above | — |
5. Fix list (nothing has been changed)
| # | Severity | What to do | State | By |
|---|---|---|---|---|
| 1 | RISKY | Site banner: replace "Order by Dec 18 for Christmas delivery" with "Order by 1 pm ET Mon, Dec 14 for Standard shipping, or by 1 pm ET Mon, Dec 21 for Express shipping, to arrive by Thu, Dec 24." | recommended | now |
| 2 | WARNING | Email: Holiday gift guide (sends Thu Dec 3): replace "Guaranteed delivery by Christmas on every order." with "Order by 1 pm ET Mon, Dec 14 for Standard shipping, or by 1 pm ET Mon, Dec 21 for Express shipping, to arrive by Thu, Dec 24." | recommended | Wed Dec 2 |
| 3 | WARNING | FAQ: Shipping: add "Orders placed Nov 26 – Dec 2 ship within 3 business days." above the current text, and the same line in the order confirmation email for those orders. If orders fall further behind than you state, email the affected customers a delay notice that offers to cancel. | recommended | Wed Nov 25 |
| 4 | INFO | Gift guide page: move the date to Dec 14: "Order by 1 pm ET Mon, Dec 14 for Standard shipping to arrive by Thu, Dec 24." | recommended | Mon Dec 7 |
| 5 | PLAN | Replace the sample rows in carriers.csv with your own transit days by zone and each carrier's published holiday ship-by dates, with the page URL in source (references/playbook.md §1), then re-run. The dates above come from fictional sample data. | recommended | now |
| 6 | PLAN | Re-run with actual orders to date and the carriers' latest holiday dates, before the cutoff messaging starts Mon Dec 7. | recommended | Thu Dec 3 |
| 7 | PLAN | Schedule every switch in the messaging calendar (section 4) in the site, cart, checkout, email and SMS tools so each goes live on its date without anyone on call. | recommended | Wed Nov 25 |
Coverage is the share of customers, weighted by zone mix, whose order arrives by the target; a transit range like 3–5 days is spread evenly across its days, and a carrier ship-by date overrides a later transit-based date. Promises: RISKY = order-by date after the last safe date (or sent after it), or a stated time later than the cutoff on the last safe day; WARNING = no order-by date, no cutoff time on the last safe day, or a shipping time the backlog breaks; INFO = order-by date 3+ days earlier than needed. Each day's coverage uses the latest ship date of that day's orders (conservative). States: detected → recommended → applied → verified. Read-only: no site, checkout, email, SMS or carrier setting was changed.
Related guide
Browse the technical files
---
name: holiday-shipping-cutoffs
description: Work out the last day customers can order on each shipping service and still get their gift by the holiday, for a stated share of the store's customers. Models when orders leave the warehouse (cutoff time, weekends, closures, BFCM backlog), checks every delivery promise on the site, at checkout and in email or SMS against those dates, and gives a dated messaging calendar (expedited only, then e-gift cards) and fix list. Read-only.
---
# Holiday Shipping Cutoff Checker
Many stores tell customers "Order by Dec 18 for Christmas delivery" because that is what the banner said last year. The real last safe day is different for every shipping service, and it depends on four things you can measure: when orders actually leave your warehouse (cutoff time, weekends, closures and the BFCM backlog), where your customers live (the carrier zone mix), how long each service takes to each zone in December, and the carrier's own holiday ship-by date. Get it wrong one way and gifts arrive late, followed by refund requests and "where is my order" tickets. Get it wrong the other way and you stop selling days before you need to.
This skill works the date out for each service from local files, checks every delivery promise you make against it, and plans the switches: **last safe date per service → promises fixed → BFCM backlog explained → expedited only → e-gift cards.**
## Before you run
This skill ships scripts and sample data alongside this SKILL.md. Before running any command:
1. **Get the files.** Make sure the skill's other files (`scripts/`, `examples/`, `tests/`, `references/` and `DATA_CONTRACT.md`) are in your working folder at the same relative paths. Some environments load only SKILL.md. If yours did, fetch each file from this skill's published files and write it to the matching path. In type.com, read them with the skill-file tools. Anywhere else, the type.com Skills Library API lists every file with its path, content and `sha256`: GET `https://api.type.com/api/public/library/skills` and take the entry with slug `holiday-shipping-cutoffs`.
2. **Check the copies are exact.** Compare each file's size in bytes, not characters (and its hash, where your tools report one), with the published version before running. A copy written out from the published file is fine once its byte size and hash match. Never run a script you summarised or reconstructed from memory.
3. **Run from the skill's folder**, calling interpreters explicitly: `python3 scripts/…` and `bash examples/run.sh`. Python 3.8+ and the standard library only; there is nothing to install.
4. **Try the sample first.** Run `bash examples/run.sh`. Its output must match `examples/expected_output.txt` exactly. If it doesn't, stop and report the first differing line rather than running on real data. `bash tests/run_tests.sh` runs the full check suite.
## When to use this
- October to early November, before holiday delivery messaging goes live, on a store that ships its own orders (or uses a 3PL whose cutoff and daily capacity you know). Or on each store an agency manages.
- Someone asks "what's our last day to order for Christmas?", "is 'order by Dec 18' still right?", "when do we switch to expedited only?" or "will Black Friday orders ship on time?".
- Again when the carriers publish their holiday dates, after BFCM with actual orders, and the week before cutoff messaging starts. Stay silent when the verdict is READY and nothing changed.
- Other gifting dates work the same way: set `--target` (Hanukkah, Valentine's Day, Mother's Day).
## Operating rules
1. **Read-only.** The script reads local files only. Never change a banner, checkout rate, email, SMS, help-desk macro, ShipStation rule or carrier setting unless the user approves that specific change. When they do, make it, read it back (view the live page or send a test), and re-run.
2. **Never present a date as carrier-published unless the user supplied it with a source.** Carrier ship-by dates go in carriers.csv with the page URL in `source`. Don't fill in carrier dates from memory or from last year. If the user doesn't have them yet, run on transit days alone and say so. The sample's carrier data is fictional and labeled `sample`.
3. **Estimates, not guarantees.** "95% of customers" means 1 in 20 may still get it late. Suggest dated, plain copy; never suggest the word "guaranteed" unless the business offers a remedy when it's late. The FTC note in the report is general information, not legal advice; send guarantee wording to whoever reviews legal copy.
4. **Quote exact numbers**: the date with its weekday, the cutoff time and time zone, the coverage percentage, business days to ship and the day the backlog clears.
5. **Keep exports local.** Order exports with addresses stay on the user's machine. Only zone counts go into destinations.csv.
6. Say which state each item is in: **detected**, **recommended**, **applied**, or **verified**.
## Gathering the inputs
Exact columns, units and sources are in `DATA_CONTRACT.md`. Most stores can build all five files in about an hour.
1. **carriers.csv, required.** One row per service with its transit business days to zones 1–8 (and optionally zone 9, US territories) from your warehouse (a single number or a range like `3-5`), the days it delivers, and its non-delivery dates. Add `peak_extra_days` for the December slowdown you expect (your allowance, not carrier data). And/or a row with the carrier's own holiday **ship-by date** and its URL. Where carriers publish these is in `references/playbook.md` §1. Every row needs a `source`.
2. **warehouse.json, required.** Time zone (required: customer copy shows the cutoff with its zone), order cutoff time, the share of orders that arrive after the cutoff, handling days, working days, closed dates, daily pick/pack capacity and any temporary peak capacity.
3. **destinations.csv, required.** Orders by carrier zone, ideally last November–December. ShipStation's shipment export includes the zone; or count a Shopify orders export by ZIP against the USPS zone chart for your origin ZIP.
4. **demand.csv, optional.** Projected orders per day from Nov 1 through the holiday: the BFCM Holiday Budget Planner's `--csv` daily plan (pass `--aov`), last year's orders by day shifted to this year's calendar, or a manual forecast. Without it, the backlog isn't modeled.
- **Planner handoff:** the planner CSV has net sales per day, not orders, so `--aov` is required (the run exits 2 without it). Use the same AOV the planner used (88.66 in the planner's sample, which its report rounds to "AOV $89"); a different AOV gives different order counts, so the backlog and ship dates won't line up with the plan.
5. **promises.csv, optional.** Every place a delivery date or shipping time appears: site banner, product pages, cart, checkout rate names, shipping FAQ, emails and SMS (with send dates), help-desk macros. Without it, promises aren't checked.
If the user has connected Shopify, ShipStation or Klaviyo integrations, you may pull the same data read-only and write it into these files. Never ask the user to paste API keys or tokens into chat.
## Running it
```bash
python3 scripts/check_cutoffs.py --carriers carriers.csv --warehouse warehouse.json \
--destinations destinations.csv [--demand demand.csv [--aov 85]] [--promises promises.csv] \
[--account "Store"] [--target 2026-12-24] [--threshold 95] [--as-of YYYY-MM-DD] [--json result.json]
```
`bash examples/run.sh` runs it on the bundled sample store (Fernhill Goods, fictional). `--target` defaults to Dec 24 and `--threshold` to 95 (% of customers). `--as-of` defaults to today; pass it for a reproducible report.
What it does:
1. **Ship dates.** Orders placed by the cutoff on a working day ship that day (plus any handling days); later orders, weekend orders and orders on closed days count from the next working day. Orders beyond daily capacity wait in a first-in, first-out queue. The report shows the backlog by day, business days to ship for each order date, the worst extra delay and the day it clears, with a one-line summary for BFCM (Thanksgiving to Cyber Monday).
2. **Coverage.** For each order date and service: from the ship date, count the carrier's delivery days to the target (skipping its non-delivery days) and weight each zone by your zone mix. A range like 3–5 days is spread evenly across its days. Each order date uses the latest ship date of that day's orders (the last ones out of the backlog), so coverage is conservative.
3. **Last safe order date.** The last order date (by the cutoff) with coverage at or above the threshold, also shown at 80% and 99%. A carrier ship-by date overrides a later transit-based date. A checkout rate that uses several carriers gets the earliest date, with a routing option to extend it.
4. **Promises.** RISKY: an order-by date later than the last safe date, a message sent after it, or a stated time later than the cutoff on the last safe day (times like "11:59 pm PT" or "5 pm ET" are converted to the warehouse zone; US standard time). WARNING: a holiday promise with no date (with the FTC Mail, Internet, or Telephone Order Merchandise Rule note), the last safe date without the cutoff time, or a shipping time the backlog breaks. INFO: a date 3+ days earlier than needed.
5. **Messaging calendar and fix list.** Dated switches with plain copy (backlog note, cutoff messaging, last-day reminders, expedited only, e-gift cards, closure notice), and a verdict: `NOT READY` (any RISKY), `FIX BEFORE PEAK` (warnings only) or `READY`.
If every last safe date has already passed, the verdict line says so ("all cutoffs have passed") rather than "Nothing to fix". A BFCM window with no forecast orders is reported as such, including when an earlier backlog runs through it.
Exit codes: 0 means the report was written, 2 means invalid input (with the file, line and reason), including a carrier `ship_by_date` after the target date or a warehouse file with no `timezone`.
`--json` output: additive fields in this version are `all_cutoffs_passed` (top level) and `backlog.bfcm_orders_forecast` (false when no orders are forecast in the BFCM window; `bfcm_ship_within_business_days` is then null). `zone_mix` has keys `1`–`8`, plus `9` only when orders go to zone 9. Nothing was renamed or removed.
## Acting on the report
Present the verdict and the last safe dates, then walk through the fixes in this order. Each needs the user's approval. Copy templates and UI paths are in `references/playbook.md`.
1. **RISKY promises first.** Replace each late date with the per-service copy from the fix list, including the cutoff time. Check every placement the same text lives in (banner, announcement bar, product templates, help-desk macros).
2. **Unqualified promises.** Replace "guaranteed by Christmas" and similar lines with dated, per-method copy. Explain the FTC note plainly and suggest legal review of any guarantee.
3. **Backlog.** Add the dated shipping-time note to the FAQ, cart and order confirmation before the first affected day. If the backlog is longer than the business can accept, show the capacity option (temporary staff, a weekend shift) next to the messaging option.
4. **Conservative dates.** Move them later to the last safe date; this is free revenue.
5. **Calendar.** Schedule every switch ahead of time (banner, cart, checkout rate names, email and SMS sends), including the e-gift card switch and the closure notice.
6. **Re-run.** When carriers publish their holiday dates, after BFCM with actual orders, and before cutoff messaging starts. Mark items **verified** only when a later run (or a live page check) shows them fixed.
Related library skills: BFCM Holiday Budget Planner feeds `demand.csv` (with `--aov` set to the planner's AOV); Holiday Support Macros should use the same dates; Inventory Stockout Risk covers whether the stock is there to ship.
## Files
- `scripts/check_cutoffs.py`: the analyzer. Local files only, deterministic output, optional `--json`.
- `DATA_CONTRACT.md`: the five input formats, where each column comes from, every rule and threshold, and the JSON output.
- `references/playbook.md`: where carriers publish holiday dates and transit times, building the zone mix, measuring cutoff share and capacity, the FTC rule in plain terms, copy templates, Shopify, ShipStation and Klaviyo steps, and a status-update template.
- `examples/run.sh`, `examples/expected_output.txt`, `examples/data/`: sample run. `examples/make_fixtures.py` regenerates the sample data.
- `tests/run_tests.sh`, `tests/make_cases.py`: 19 end-to-end checks on hand-checkable inputs. No network needed.