Questions, answered with data
What America Is Buying · Convenience Stores

The Gas-Station Run Keeps Its Own Clock

A model saw only what sold, never the clock. It still split the day into three runs: morning coffee, a long daytime stretch and late night. And nearly a third of baskets are fuel and nothing else.

Analysis: Python, pandas, DuckDB, scikit-learn · Visualization: D3.js · Methods: k-means clustering of hourly sales mixes with stability checks, basket shares, pair lift (market-basket analysis) with bootstrap intervals and a timing adjustment, event study of rival openings with placebo tests
Weekday-hours sorted the same way every month
153 of 168
by a model that saw only what sold
Baskets that are fuel and nothing else
30.8%
and 54% of basket revenue
Coffee with sweet baked goods
3.8×
as often as chance would predict
For the business: Stock the morning for coffee, energy drinks and pastries, and the day for lottery, fuel and beer. The pump is the biggest untapped aisle: only 1 in 7 fuel baskets holds anything else.

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.

Source: PDI, 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.

Source: PDI, cluster means in 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.

Source: PDI item lines by hour, category and month (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.

Source: PDI basket histogram (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.

Source: PDI basket histogram (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.

Source: PDI category co-purchase counts (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.

Source: PDI pair table 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.

Source: PDI category co-purchase (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.

Source: Advan store visits (not PDI), January 2023 to July 2026; openings are stores seen for the first time. This is an association, not proof: chains choose where to open. Wawa near 7-Eleven within 1 km has too few openings to show.

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.