Everyone knows coffee sells in the morning. The real question is how many selling periods a store has, and where one ends and the next begins. We asked a model without telling it the time.
The data: about 980 million receipts from independent convenience stores, via PDI (August 2025 to August 2026, 168 of 673 files). The groups are groups of hours and baskets, not people.
The day sorts itself
We cut the year into 2,184 hour slots and gave a model only each slot's mix across 31 product categories. It found three groups. Read back against the clock, they fall in order: morning (about 3 to 9 a.m.), day and evening (10 a.m. to 8 p.m.), and late night. For 153 of the 168 weekday-hours, all 13 months agreed.
Grouped only by what sold, the hours fall back into clock order
Each cell is one weekday-hour, coloured by its sales mix. Pale cells: the 13 months didn't all agree.
time_slots clustering (k-means, 3 groups) from docs/stories/segments/retail/time_slots.json; per-slot assignments reproduced from the same code and seed.The morning starts later as the week goes on: 3 a.m. Monday to Thursday, 4 a.m. Friday and Saturday, 5 a.m. Sunday. Refits on random 80% slices gave the same groups (agreement 0.99 out of 1).
What each run buys
The morning is the sharpest. Coffee is 3.6% of items sold (1.5% overall), energy drinks 9.0% (5.3%), and beer's share halves. The day leans on lottery, fuel and beer. Late night leans on tobacco, salty snacks and candy.
Mornings are about coffee, energy drinks and hot food; late nights about snacks and tobacco
Each category's share of items in each mix against its average across all slots. 1× is average. Hover for the shares.
docs/stories/segments/retail/time_slots.json. Shares are of item lines; each slot counts equally.Raw hourly counts agree without any model: 16.6% of the day's coffee sells in the 7 a.m. hour. Beer peaks at 5 p.m.
Coffee, energy drinks and pastries peak at 7 a.m.; beer at 5 p.m.
Share of each category's daily items sold in each hour. Gray line: all items.
cat_hour_month); peak hours match category_peaks in docs/stories/segments/retail/summary.json.Two caveats. The model weighs quiet hours like busy ones: late night is 28% of the slots but only 9% of the items. And three groups only narrowly beat two.
Nearly a third of baskets are fuel and nothing else
30.8% of baskets hold fuel and nothing else. They average $37.48, against $12.41 for a basket with no fuel, so they bring in 54% of basket revenue. Every month falls between 29.6% and 32.1%.
Fuel-only baskets are 31% of baskets and 54% of the money
Share of basket records and of basket revenue, by whether the basket has fuel in it.
basket_month); fuel-only share matches fuel_only_share in docs/stories/segments/retail/summary.json.Only about 1 in 7 fuel baskets holds anything else. Some of that is bookkeeping: paying at the pump and then buying a coffee inside can show up as two baskets. Fuel-only peaks at 10 a.m. (34.4% of baskets) and bottoms out at 1 a.m. (22.6%).
Fuel-only baskets peak mid-morning and fade at night
Fuel-only baskets as a share of all baskets in each hour. Dashed line: all hours.
basket_month), August 2025 to August 2026.Baskets without fuel are small: 2.1 items on average, and 44% are a single item. Cigarettes lead (13.4%), then soft drinks, energy drinks and lottery (about 11% each).
Cigarettes, soft drinks, energy drinks and lottery lead the non-fuel basket
Share of no-fuel baskets holding at least one item from each category. A basket can count in several rows.
copurchase_month). 41.6% of these baskets also hold at least one item the category classifier could not place, so each share here is a lower bound.What sells together
Lift compares how often two categories share a basket with how often chance would put them there. 1 means chance. Coffee and sweet baked goods top the list at 3.8×, and it holds every month. But they're in only 0.13% of baskets. Salty snacks and soft drinks pair more loosely (2.7×) and reach six times as many baskets. Cigarettes and fuel meet at a quarter of the rate chance predicts.
Coffee and pastries stick together hardest; snacks and soft drinks reach the most baskets
Each dot is a pair of categories. Across: share of baskets holding both. Up: lift. Log scales. Dashed line: chance.
docs/stories/segments/retail/category_pairs.csv: 263 pairs in at least 10,000 baskets, excluding unclassified items and accounting adjustments. Monthly ranges from the same file.That suggests two tests: a coffee-and-pastry deal for a small, tight group, and a snacks-and-soda deal for a looser habit that reaches far more baskets.
Some pairs are just the clock
Coffee and hot food look like a pair, but both simply sell in the morning. Timing alone predicts 1.45× of their 1.51×. Coffee and a pastry keep most of their pull. The oddest real pair is health-and-beauty items with water or sports drinks, strongest in December. Nicotine pouches go with energy drinks but avoid cigarettes.
Coffee and hot food are mostly the clock; coffee and a pastry are a real pair
Dot: how often two categories share a basket, against chance. Ring: what selling at the same hours alone would predict. Only baskets with something besides fuel count here, so each lift is about 30% lower than in the chart above; the order is the same. Log scale.
copurchase_month) and hourly sales (cat_hour_month), August 2025 to August 2026. Timing-only lift assumes the two categories are bought independently within each month × hour, since there are no pair counts by hour. 95% bootstrap intervals are within ±5% of each value.When a Sheetz or Wawa moves in
When a Sheetz or Wawa opened, other gas stations and convenience stores within a kilometre lost about 2% of their visits over the next year. The loss fades with distance. 7-Elevens a few kilometres from a new Wawa didn't measurably change.
A new Sheetz or Wawa costs the station next door about 2%
Change in nearby stores' visits in the 12 months after the opening, by distance, against the same kind of store 20 to 40 km away. Gray: the range when each opening is moved to a random fake location.
How this analysis was done
Data. PDI convenience-store line items, August 2025 to August 2026, from 168 of 673 files. Baskets are rebuilt within each file. The stores are participating independents, not a random sample. There are no exact dates, so holidays can't be separated. Time zones are unverified, though the 7 a.m. coffee peak suggests local time. About a quarter of items are unclassified.
Time slots. 2,184 month × weekday × hour slots, each described by its share of item lines across 31 categories, then scaled. K-means was tried for 2 to 9 groups, and 3 scored best (silhouette 0.343, against 0.338 for 2). Five 80% subsamples agreed at 0.99 (adjusted Rand index), and the first and second halves of the year at 0.92. Slots count equally regardless of volume. The late-night group is partly defined by unclassified items.
Baskets and pairs. Plain shares of all 980 million basket records, not clusters. Lift is pooled over 13 months; monthly ranges are the lowest and highest monthly lift. Store-level and category clusters failed the project's own quality checks and are left out. These are patterns, not causes.
Rival openings. A stacked event study on Advan monthly store visits, January 2023 to July 2026. Each opening is compared with the same kind of store 20 to 40 km away over the same months, and each store with its own year before. Intervals come from 1,000 bootstrap draws over openings. Checks: flat trends before the opening, 100 fake locations, and fake dates a year earlier. The Sheetz 1–3 km estimate fails the fake-date check. Stores unrelated to fuel (AutoZone) near the same openings also dipped about 2.7% at 3 to 5 km, so only the close-in effect is reported as a finding.
Pairs and the clock. The second pair chart counts only baskets with something besides fuel (678 million), because fuel-only baskets inflate every lift by the same factor. Pairs need at least 98,000 shared baskets and 500 in every month, a floor fixed before ranking. Intervals are the wider of two bootstraps (over months and over files). Timing-only lift treats two categories as independent within each month × hour slot. A category network was also tested; the version planned in advance did not beat shuffled networks, so it is left out.