Skill · Sales and Marketing · Customer Success · Finance and Operations

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.

Created by type.com

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)

  1. RISKY: Site banner says order by Dec 18; Standard needs orders by Mon Dec 14 (4 days earlier).
  2. WARNING: Email: Holiday gift guide (sends Thu Dec 3): "Guaranteed delivery by Christmas on every order." has no order-by date or shipping method.
  3. WARNING: FAQ: Shipping says orders ship within 1 business day; orders placed Fri Nov 27 – Tue Dec 1 take up to 3 (BFCM backlog).
  4. 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%.

ServiceCheckout rateLast safe (≥ 95%)At 80%At 99%From transitCarrier ship-by dateBased on
USPS Ground AdvantageStandardMon Dec 14Mon Dec 14Mon Dec 14Wed Dec 16Mon Dec 14 (sample)carrier ship-by date
UPS GroundStandardTue Dec 15Wed Dec 16Tue Dec 15Tue Dec 15—transit by zone
UPS 2nd Day AirExpressMon Dec 21Mon Dec 21Mon Dec 21Mon Dec 21Tue 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 dateShips (ordered by 1:00 pm)Ships (ordered later)USPS Ground AdvantageUPS GroundUPS 2nd Day Air
Thu Dec 10Thu Dec 10Fri Dec 11100%100%100%
Fri Dec 11Fri Dec 11Mon Dec 14100%100%100%
Sat Dec 12 (closed)Mon Dec 14Mon Dec 14100%100%100%
Sun Dec 13 (closed)Mon Dec 14Mon Dec 14100%100%100%
Mon Dec 14Mon Dec 14Tue Dec 15100%100%100%
Tue Dec 15Tue Dec 15Wed Dec 16after ship-by100%100%
Wed Dec 16Wed Dec 16Thu Dec 17after ship-by93.0%100%
Thu Dec 17Thu Dec 17Fri Dec 18after ship-by76.0%100%
Fri Dec 18Fri Dec 18Mon Dec 21after ship-by48.9%100%
Sat Dec 19 (closed)Mon Dec 21Mon Dec 21after ship-by13.9%100%
Sun Dec 20 (closed)Mon Dec 21Mon Dec 21after ship-by13.9%100%
Mon Dec 21Mon Dec 21Tue Dec 22after ship-by13.9%100%
Tue Dec 22Tue Dec 22Wed Dec 23after ship-by0%0%
Wed Dec 23Wed Dec 23Thu Dec 24after ship-by0%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.

DateOrders placedReady to shipShippedBacklog at closeThat day's orders shipBusiness days to ship
Wed Nov 251201321320Wed Nov 25 – Fri Nov 270–1
Thu Nov 26 (closed: Thanksgiving)132—closed0Fri Nov 271
Fri Nov 2733033625086Fri Nov 27 – Tue Dec 10–2
Sat Nov 28 (closed)185—closed86Tue Dec 12
Sun Nov 29 (closed)150—closed86Tue Dec 1 – Wed Dec 22–3
Mon Nov 30205701250451Wed Dec 2 – Thu Dec 32–3
Tue Dec 194612250362Thu Dec 32
Wed Dec 252439250189Thu Dec 31
Thu Dec 3442382380Thu Dec 3 – Fri Dec 40–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
#WhereSaysImpliesOrder-byStatusWhy
1Site banner"Order by Dec 18 for Christmas delivery"StandardFri Dec 18RISKYDec 18 is 4 days after the last safe order date for Standard (Mon Dec 14). Express (by Mon Dec 21) still arrives in time.
2Checkout rate name"Express (UPS 2nd Day Air): order by 1 pm ET Dec 21 for delivery by Dec 24"ExpressMon Dec 21OKMatches the last safe order date for Express (Mon Dec 21). Gives the cutoff time.
3Email: Holiday gift guide (sends Thu Dec 3)"Guaranteed delivery by Christmas on every order."any (none named)—WARNINGPromises 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.
4FAQ: Shipping"Orders placed by 1 pm ET on a business day ship the same day. All other orders ship the next business day."——WARNINGSays orders ship within 1 business day. Orders placed Fri Nov 27 – Tue Dec 1 take up to 3 business days (BFCM backlog).
5Gift guide page"Order by Dec 10 for Christmas delivery with Standard shipping."StandardThu Dec 10INFO4 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.

WhenSwitchWhereSuggested copy
Thu Nov 26 – Wed Dec 2BFCM 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 7Start holiday cutoff messagingSite 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, morningLast day for StandardEmail, SMS"Last day for Standard shipping to arrive by Thu, Dec 24: order by 1 pm ET today."
Mon Dec 14, 1:00 pm ETSwitch 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, morningLast day for ExpressEmail, SMS"Last day for Express shipping to arrive by Thu, Dec 24: order by 1 pm ET today."
Mon Dec 21, 1:00 pm ETSwitch to e-gift cardsSite 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 ETClosure noticeSite banner, cart"We're closed Fri, Dec 25. Orders placed after 1 pm ET Thu, Dec 24 ship Mon, Dec 28."
Fri Dec 25Take down holiday delivery messaging (schedule it ahead)Everywhere above—
5. Fix list (nothing has been changed)
#SeverityWhat to doStateBy
1RISKYSite 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."recommendednow
2WARNINGEmail: 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."recommendedWed Dec 2
3WARNINGFAQ: 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.recommendedWed Nov 25
4INFOGift 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."recommendedMon Dec 7
5PLANReplace 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.recommendednow
6PLANRe-run with actual orders to date and the carriers' latest holiday dates, before the cutoff messaging starts Mon Dec 7.recommendedThu Dec 3
7PLANSchedule 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.recommendedWed 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.

AI for marketing teams: a practical 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.