<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>MapDove — Blog</title><description>Field notes on foot traffic, site selection and the models behind them.</description><link>https://mapdove.com/</link><language>en</language><item><title>Dwell time and visit frequency: what they really tell you</title><link>https://mapdove.com/blog/dwell-time-visit-frequency/</link><guid isPermaLink="true">https://mapdove.com/blog/dwell-time-visit-frequency/</guid><description>Visits, visitors, frequency and dwell are easy to quote and easy to misread. Here is how to interpret them by category.</description><pubDate>Wed, 07 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Visit counts get the headlines, but two quieter metrics often explain more about a store: &lt;strong&gt;how long people stay&lt;/strong&gt; and &lt;strong&gt;how often they come back&lt;/strong&gt;. Both are easy to put on a slide and easy to misread. This post covers what MapDove reports, how the metrics relate, and what a “good” value looks like, which depends heavily on the category.&lt;/p&gt;
&lt;h2 id=&quot;visits-visitors-and-frequency&quot;&gt;Visits, visitors and frequency&lt;/h2&gt;
&lt;p&gt;Start with the definitions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Visits&lt;/strong&gt;: every recorded trip to the place in the selected date range.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visitors&lt;/strong&gt;: the distinct people behind those trips.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frequency&lt;/strong&gt; = visits ÷ visitors: the average number of trips per visitor in that range.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A coffee shop with 12,000 visits and 9,000 visitors over a month has a frequency of about 1.33. Nine thousand people came, and on average each came a little more than once.&lt;/p&gt;
&lt;p&gt;The ratio has a property people often forget: &lt;strong&gt;it depends on the window.&lt;/strong&gt; Over a single day almost everyone is a one-time visitor. Over a quarter, regulars pile up repeat visits. Comparing a store’s 7-day frequency with a competitor’s 90-day figure is meaningless. MapDove computes KPIs over the range you select, so compare like with like: same range length, same season.&lt;/p&gt;
&lt;p&gt;In the demo dataset (synthetic, modeled from neighborhood-level parameters), each category has a typical visitor-to-visit ratio. Fitness has the most repeat behavior of the everyday categories at about 0.70 visitors per visit, or roughly 1.4 trips per visitor. Coffee sits near 0.78. Grocery, pharmacy and quick service land at 0.82–0.86. Destination categories like apparel, electronics and cinemas are near 0.9, meaning mostly single trips.&lt;/p&gt;
&lt;h2 id=&quot;what-frequency-actually-tells-you&quot;&gt;What frequency actually tells you&lt;/h2&gt;
&lt;p&gt;High frequency usually means &lt;strong&gt;habit&lt;/strong&gt;. People keep coming to the gym, the commute-route café or the neighborhood grocer because it is convenient and part of a routine. That is valuable: habitual visitors are less sensitive to new competition and easier to forecast.&lt;/p&gt;
&lt;p&gt;But high frequency with flat or falling visitors is a warning. Your base is loyal and shrinking, so the store depends on fewer people coming more often. Low frequency with rising visitors is the reverse. Reach is growing, maybe from a new residential development or a marketing push, and the open question is whether those people turn into regulars.&lt;/p&gt;
&lt;p&gt;Read the two together:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Visitors&lt;/th&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;th&gt;Likely story&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;Healthy growth: new people are becoming regulars&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;↓&lt;/td&gt;
&lt;td&gt;Reach is expanding, loyalty untested (new trade area, promotion)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;↓&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;td&gt;A loyal core but a shrinking base, often from new competition nearby&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;↓&lt;/td&gt;
&lt;td&gt;↓&lt;/td&gt;
&lt;td&gt;Real decline: look for a cause in the trade area&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;dwell-time-category-first-store-second&quot;&gt;Dwell time: category first, store second&lt;/h2&gt;
&lt;p&gt;Dwell is the average minutes per visit. It is meaningless without a category benchmark. Typical dwell in the demo dataset ranges over two orders of magnitude:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Under 15 minutes&lt;/strong&gt;: fuel &amp;#x26; convenience (~7), pharmacy (~12), quick service (~14)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;15–35 minutes&lt;/strong&gt;: coffee (~18), apparel (~26), grocery (~28), electronics (~30), home improvement (~34)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;45–95 minutes&lt;/strong&gt;: department stores (~45), full-service dining (~62), fitness (~65), shopping centers (~95)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long stays&lt;/strong&gt;: entertainment (~140), hotels (overnight, measured in hours)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A café averaging 28 minutes isn’t “underperforming” against a restaurant at 62. It may be a work-from-café spot whose seats turn over slowly, which matters for capacity planning. The right comparisons are against the &lt;strong&gt;category average in the same city&lt;/strong&gt; and against the &lt;strong&gt;store’s own history&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;when-dwell-moves&quot;&gt;When dwell moves&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dwell rising, visits flat&lt;/strong&gt;: in dining or coffee, slower turnover. Check peak-hour capacity in the hourly heatmap. In grocery, possibly bigger baskets, a stock-up season or slower checkout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dwell falling, visits rising&lt;/strong&gt;: often a convenience shift such as a new pickup counter, a faster format or more grab-and-go trips. Good for throughput, but watch the basket size.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dwell falling at a shopping center&lt;/strong&gt;: an early sign of weakening anchors. Visitors still come for one errand but no longer browse.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;pitfalls&quot;&gt;Pitfalls&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Averages hide mixtures.&lt;/strong&gt; A fitness club’s 65-minute mean blends 30-minute lunchtime visits and 90-minute evening classes. Use the hourly view to separate them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seasonality affects both metrics.&lt;/strong&gt; Phoenix and Miami have strong winter seasons and Dubai peaks in the cool months. Year-over-year comparisons are safer than month-over-month.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dwell is not engagement.&lt;/strong&gt; Long dwell at a pharmacy is more likely a queue than loyalty.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;practical-takeaways&quot;&gt;Practical takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Always state the window&lt;/strong&gt; when quoting frequency, and compare equal-length ranges.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read visitors and frequency together.&lt;/strong&gt; The four-quadrant table above covers most cases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Benchmark dwell within the category and city.&lt;/strong&gt; Never compare it across categories.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pair dwell changes with the hourly heatmap&lt;/strong&gt; to tell capacity issues from demand shifts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The place page in &lt;a href=&quot;/product/foot-traffic/&quot;&gt;Foot Traffic&lt;/a&gt; shows all four KPIs alongside the category benchmark. Definitions are in the &lt;a href=&quot;/docs/core-concepts/&quot;&gt;core concepts docs&lt;/a&gt; and &lt;a href=&quot;/docs/demo-data/&quot;&gt;demo data notes&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>foot-traffic</category><category>kpis</category><category>methodology</category><author>hello@mapdove.com (Marcus Bell)</author></item><item><title>Picking KPIs for CRE leasing teams</title><link>https://mapdove.com/blog/cre-leasing-kpis/</link><guid isPermaLink="true">https://mapdove.com/blog/cre-leasing-kpis/</guid><description>Raw visit counts win meetings but lose deals. Five foot-traffic KPIs that help leasing teams price space, pick tenants and defend co-tenancy.</description><pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Leasing teams were among the first to adopt foot-traffic analytics, and they are also the teams most likely to be using it badly. The usual failure mode is a single headline number (“our center sees 4 million visits a year”) deployed in every pitch, regardless of which tenant is across the table.&lt;/p&gt;
&lt;p&gt;A big number is a fine opener. It is a poor argument. A prospective tenant’s real estate committee does not care how busy your center is in general; it cares whether &lt;em&gt;its&lt;/em&gt; customers are there, whether the space will be productive, and whether the neighbors will help or hurt. That calls for a small, deliberate set of KPIs.&lt;/p&gt;
&lt;p&gt;Here are the five we recommend to leasing and asset management teams, with how to pull each one in MapDove. Numbers in the examples are illustrative and drawn from the synthetic &lt;a href=&quot;/docs/demo-data/&quot;&gt;demo dataset&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;1-visits-per-square-foot&quot;&gt;1. Visits per square foot&lt;/h2&gt;
&lt;p&gt;Raw visits favor large units. A 40,000 sq ft grocer will always out-visit a 1,800 sq ft café, which tells you nothing about which space is more productive. Normalizing by area fixes that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to use it:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compare &lt;strong&gt;within a category&lt;/strong&gt;, never across. Grocery and coffee have very different natural densities.&lt;/li&gt;
&lt;li&gt;Use it to &lt;strong&gt;support rent conversations&lt;/strong&gt;. If the in-line spaces along one corridor of a center produce 40% more visits per sq ft than the other, that is a defensible basis for differential rents.&lt;/li&gt;
&lt;li&gt;Use it to &lt;strong&gt;spot under-performing boxes&lt;/strong&gt;. A large-format tenant with low visits per sq ft relative to its category is a candidate for a downsize or a split.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every place in MapDove carries a &lt;code&gt;sqft&lt;/code&gt; field, so visits per sq ft is one division away in the app or an export. In Dubai, the same metric reads as visits per square meter.&lt;/p&gt;
&lt;h2 id=&quot;2-percentile-in-city-within-category&quot;&gt;2. Percentile in city (within category)&lt;/h2&gt;
&lt;p&gt;“Strong” is meaningless without a reference group. MapDove’s place view reports a &lt;strong&gt;percentile in city&lt;/strong&gt;: where this location ranks among all places in the same category in the same city. A Taco Rojo unit at the 81st percentile out-visits four in five quick-service places in its market.&lt;/p&gt;
&lt;p&gt;Why leasing teams should prefer it to raw counts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is &lt;strong&gt;seasonally neutral&lt;/strong&gt;. Everything in the reference group experiences the same season, so the percentile does not swing just because it is August in Phoenix.&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;travels well&lt;/strong&gt;. “Top-decile coffee location” means the same thing to a tenant in Austin as in Miami.&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;frames renewals&lt;/strong&gt;. A tenant who has slipped from the 70th to the 45th percentile over two years has a different conversation coming than one that has held steady.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-trade-area-overlap&quot;&gt;3. Trade-area overlap&lt;/h2&gt;
&lt;p&gt;Prospective tenants want to know whether your center’s visitors look like their customers. The &lt;a href=&quot;/docs/trade-areas/&quot;&gt;trade area&lt;/a&gt; view answers that: it maps the hexes that together account for the first 85% of modeled visitors, with population, income, age and lifestyle segment mix.&lt;/p&gt;
&lt;p&gt;For leasing, the strongest version of this KPI is &lt;strong&gt;overlap&lt;/strong&gt;: how much of the prospect’s existing trade area (from one of their stores elsewhere in the city) coincides with your center’s. High overlap with an existing store is a mixed signal; it confirms fit, but it also predicts cannibalization. Pair it with a &lt;a href=&quot;/docs/huff-forecast/&quot;&gt;Huff forecast&lt;/a&gt; with cannibalization enabled to show the prospect net new visits, not just gross.&lt;/p&gt;
&lt;h2 id=&quot;4-co-tenancy-strength-via-cross-shopping&quot;&gt;4. Co-tenancy strength via cross-shopping&lt;/h2&gt;
&lt;p&gt;Co-tenancy clauses are written in legal terms, but they rest on a behavioral claim: that one tenant’s customers also shop at another. &lt;a href=&quot;/docs/cross-shopping/&quot;&gt;Cross-shopping&lt;/a&gt; measures exactly that. For any place, it lists the other places its visitors also visit, with two scores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Overlap&lt;/strong&gt;: the share of visitors in common.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Affinity&lt;/strong&gt;: how much more likely that is than you would expect from the two places’ sizes and locations alone.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Affinity is the one to bring to a negotiation. Every tenant overlaps with the busy grocer next door; a high-affinity link (say, between IronPulse Fitness and a neighboring WellPoint Pharmacy) shows a genuine shared customer that a merchandising plan can build on. It also tells you which tenants matter most for co-tenancy: losing a high-affinity anchor hurts more than losing a merely large one.&lt;/p&gt;
&lt;h2 id=&quot;5-dwell-time&quot;&gt;5. Dwell time&lt;/h2&gt;
&lt;p&gt;Dwell is the KPI most often ignored and the one that best explains how a center earns its rent. Long dwell means more cross-shopping, more food and beverage, and more incidental spending.&lt;/p&gt;
&lt;p&gt;Use it carefully:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Benchmark by category.&lt;/strong&gt; A cinema will always out-dwell a pharmacy. Compare a Starlight Cinemas to other cinemas, not to the center average.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Track direction, not level.&lt;/strong&gt; A falling center-wide dwell after an anchor departure is an early warning that the remaining tenants are losing cross-shopping traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use it to place F&amp;#x26;B.&lt;/strong&gt; Units adjacent to long-dwell tenants are the natural home for cafés and casual dining.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;putting-it-together&quot;&gt;Putting it together&lt;/h2&gt;
&lt;p&gt;A compact leasing scorecard for a prospect pitch:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;KPI&lt;/th&gt;
&lt;th&gt;Question it answers&lt;/th&gt;
&lt;th&gt;Where in MapDove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Visits per sq ft&lt;/td&gt;
&lt;td&gt;Is this space productive?&lt;/td&gt;
&lt;td&gt;Place view, &lt;code&gt;sqft&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Percentile in city&lt;/td&gt;
&lt;td&gt;How strong is it versus its peers?&lt;/td&gt;
&lt;td&gt;Place view KPIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trade-area overlap&lt;/td&gt;
&lt;td&gt;Are the prospect’s customers here?&lt;/td&gt;
&lt;td&gt;Trade areas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-shopping affinity&lt;/td&gt;
&lt;td&gt;Will the neighbors help?&lt;/td&gt;
&lt;td&gt;Cross-shopping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dwell time&lt;/td&gt;
&lt;td&gt;Does this center hold visitors?&lt;/td&gt;
&lt;td&gt;Place view, visit series&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Five numbers, each tied to a question a tenant’s committee will ask. For portfolio reviews, add &lt;a href=&quot;/docs/compare-sites/&quot;&gt;compare sites&lt;/a&gt; to put up to five candidate units side by side on suitability, forecast and a 1-mile catchment.&lt;/p&gt;
&lt;h2 id=&quot;takeaway&quot;&gt;Takeaway&lt;/h2&gt;
&lt;p&gt;Retire the single headline visit count. Build each pitch from visits per sq ft, percentile in city, trade-area overlap, cross-shopping affinity and dwell, all benchmarked within category and city. These KPIs are seasonally fair, comparable across markets and grounded in the questions tenants actually ask. See how the &lt;a href=&quot;/solutions/real-estate/&quot;&gt;real estate solution&lt;/a&gt; packages them for leasing and asset teams.&lt;/p&gt;</content:encoded><category>kpis</category><category>real-estate</category><category>trade-areas</category><category>foot-traffic</category><author>hello@mapdove.com (Priya Natarajan)</author></item><item><title>Drive-time vs. radius catchments: when each is right</title><link>https://mapdove.com/blog/drive-time-vs-radius/</link><guid isPermaLink="true">https://mapdove.com/blog/drive-time-vs-radius/</guid><description>Rings in miles and rings in drive minutes answer different questions. Here is how to choose, and what MapDove&apos;s drive-time approximation does and doesn&apos;t do.</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Almost every site package we review opens with the same exhibit: three concentric rings around a pin, usually 1, 3 and 5 miles, with population and median income stacked beside them. It is the lingua franca of retail real estate, and it is genuinely useful. It is also routinely asked to answer questions it was never built for.&lt;/p&gt;
&lt;p&gt;Since &lt;a href=&quot;/docs/catchments/&quot;&gt;drive-time catchments&lt;/a&gt; landed in MapDove, we get a version of the same question every week: &lt;em&gt;should we switch everything to drive time?&lt;/em&gt; The short answer is no. The longer answer is that radius and drive-time rings measure different things, and a good analyst picks the one that matches the decision in front of them.&lt;/p&gt;
&lt;h2 id=&quot;what-a-radius-ring-actually-measures&quot;&gt;What a radius ring actually measures&lt;/h2&gt;
&lt;p&gt;A radius ring is a statement about &lt;strong&gt;proximity&lt;/strong&gt;, not access. It says: these are the people who live within a fixed straight-line distance of the site. Its strengths are real:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It is comparable.&lt;/strong&gt; A 3-mile ring in Austin and a 3-mile ring in Miami are the same physical size, so densities and incomes compare cleanly across markets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It is stable.&lt;/strong&gt; It does not change when a road is widened or when you change your assumptions about traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It matches how deals are written.&lt;/strong&gt; Radius restrictions in leases, exclusives and co-tenancy clauses are almost always expressed in miles or kilometers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Its weakness is equally clear. It ignores how people move. A ring that crosses a river, a freeway with few interchanges or a large industrial district counts households that, in practice, will rarely make the trip.&lt;/p&gt;
&lt;h2 id=&quot;what-a-drive-time-ring-measures&quot;&gt;What a drive-time ring measures&lt;/h2&gt;
&lt;p&gt;A drive-time ring is a statement about &lt;strong&gt;effort&lt;/strong&gt;. It asks: who can reach this site in 5, 10 or 15 minutes? That framing is closer to how convenience-driven categories behave. Nobody picks a pharmacy or a quick-service lunch based on crow-flies distance; they pick the one that is easy to get to.&lt;/p&gt;
&lt;p&gt;Drive time also normalizes across cities with very different travel speeds. Ten minutes of driving covers a lot more ground in a fast, car-oriented metro than in a dense, congested one, and that difference matters when you are sizing a trade area.&lt;/p&gt;
&lt;h2 id=&quot;how-mapdove-computes-drive-time-rings-and-what-that-implies&quot;&gt;How MapDove computes drive-time rings (and what that implies)&lt;/h2&gt;
&lt;p&gt;We want to be precise about this, because it affects how you should use the output. MapDove’s drive-time mode is a &lt;strong&gt;speed-based approximation&lt;/strong&gt;, not a road-network isochrone. When you request rings in minutes, we convert each ring to a radius using the city’s average travel speed:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;th&gt;Avg speed&lt;/th&gt;
&lt;th&gt;10-minute ring ≈&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Austin&lt;/td&gt;
&lt;td&gt;42 km/h&lt;/td&gt;
&lt;td&gt;7.0 km (4.3 mi)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Houston&lt;/td&gt;
&lt;td&gt;45 km/h&lt;/td&gt;
&lt;td&gt;7.5 km (4.7 mi)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phoenix&lt;/td&gt;
&lt;td&gt;50 km/h&lt;/td&gt;
&lt;td&gt;8.3 km (5.2 mi)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Miami&lt;/td&gt;
&lt;td&gt;35 km/h&lt;/td&gt;
&lt;td&gt;5.8 km (3.6 mi)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dubai&lt;/td&gt;
&lt;td&gt;55 km/h&lt;/td&gt;
&lt;td&gt;9.2 km&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Demographics inside each ring are &lt;strong&gt;area-weighted&lt;/strong&gt; from the underlying hex grid (cells of roughly 0.8 km²): if a ring covers 40% of a hex, it picks up 40% of that hex’s population and households. You can request up to four rings per analysis, in km, mi or minutes, through the app or the &lt;a href=&quot;/docs/api-overview/&quot;&gt;&lt;code&gt;/sdss/catchment&lt;/code&gt; endpoint&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What this approximation does well: it scales catchments sensibly between markets. A 10-minute ring in Miami is meaningfully smaller than one in Phoenix, which is exactly the adjustment a planner would make by hand.&lt;/p&gt;
&lt;p&gt;What it does not do: it will not bend around a bay, follow a freeway corridor or stop at a river without a bridge. If your site sits next to a hard barrier, treat the drive-time ring as an upper bound and sanity-check it against the &lt;a href=&quot;/docs/trade-areas/&quot;&gt;modeled trade area&lt;/a&gt;, which is built from where visitors actually come from in the demo dataset.&lt;/p&gt;
&lt;h2 id=&quot;choosing-between-them&quot;&gt;Choosing between them&lt;/h2&gt;
&lt;p&gt;A practical rule of thumb we use internally:&lt;/p&gt;
&lt;h3 id=&quot;use-radius-rings-when&quot;&gt;Use radius rings when&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;You are &lt;strong&gt;comparing markets&lt;/strong&gt; or screening dozens of candidate sites on a level playing field.&lt;/li&gt;
&lt;li&gt;The question is about &lt;strong&gt;lease language&lt;/strong&gt;: radius restrictions, exclusives, co-tenancy.&lt;/li&gt;
&lt;li&gt;You need a figure that a landlord, lender or investment committee will recognize instantly.&lt;/li&gt;
&lt;li&gt;The category is &lt;strong&gt;destination-driven&lt;/strong&gt; (cinemas, furniture, department stores) and customers routinely travel past competitors.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;use-drive-time-rings-when&quot;&gt;Use drive-time rings when&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The category is &lt;strong&gt;convenience-driven&lt;/strong&gt;: coffee, pharmacy, fuel, quick-service, grocery top-up trips.&lt;/li&gt;
&lt;li&gt;You are comparing sites &lt;strong&gt;across cities with different travel speeds&lt;/strong&gt; and want “equivalent effort” catchments.&lt;/li&gt;
&lt;li&gt;You are setting &lt;strong&gt;network spacing&lt;/strong&gt; and want to know roughly how far apart stores can be before the gap becomes inconvenient.&lt;/li&gt;
&lt;li&gt;You are pairing the catchment with a &lt;a href=&quot;/docs/huff-forecast/&quot;&gt;Huff forecast&lt;/a&gt;, which already reasons in terms of distance decay.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;use-neither-on-its-own-when&quot;&gt;Use neither on its own when&lt;/h3&gt;
&lt;p&gt;The decision is large and the site is unusual. Rings are a first pass. For a final recommendation, layer the ring demographics with the modeled trade area, the &lt;a href=&quot;/docs/site-suitability/&quot;&gt;suitability score&lt;/a&gt; for the hex, and the cannibalization estimate against your own network.&lt;/p&gt;
&lt;h2 id=&quot;a-worked-example&quot;&gt;A worked example&lt;/h2&gt;
&lt;p&gt;Consider a hypothetical new Bean Republic location on the edge of The Domain in Austin. A 3-mile radius ring and a 10-minute drive-time ring (about 4.3 miles at Austin’s average speed) look similar on a map. But the drive-time ring pulls in a meaningful slice of the higher-income suburbs to the north and west, which a coffee operator cares about because commute-adjacent morning trips are the core of the business.&lt;/p&gt;
&lt;p&gt;Now run the same exercise for a Starlight Cinemas candidate. For a destination category, the 10-minute ring understates reach; moviegoers will drive 20 minutes for the right screen. Here a 5-mile radius plus the modeled trade area is the more honest picture.&lt;/p&gt;
&lt;p&gt;Same tool, same pin, different right answer.&lt;/p&gt;
&lt;h2 id=&quot;common-mistakes&quot;&gt;Common mistakes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mixing units in one deck.&lt;/strong&gt; Show either miles or minutes for a given comparison, never both, or readers will compare the wrong numbers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treating drive time as precise.&lt;/strong&gt; A speed-based ring is a planning approximation. Present it as “approximately 10 minutes,” not “exactly 10 minutes.”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Using the same ring sizes for every category.&lt;/strong&gt; A 1-mile ring is meaningful for a dense urban pharmacy and nearly meaningless for a regional fitness club.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;takeaway&quot;&gt;Takeaway&lt;/h2&gt;
&lt;p&gt;Use radius rings to compare and to negotiate; use drive-time rings to reason about convenience and equivalent effort across cities. In MapDove, drive time is a transparent speed-based conversion with area-weighted demographics, so check it against the modeled trade area wherever geography is lumpy. Try both on the same pin in the &lt;a href=&quot;/product/trade-areas/&quot;&gt;catchment tool&lt;/a&gt; and see where they disagree; that disagreement is usually where the insight is.&lt;/p&gt;</content:encoded><category>catchments</category><category>site-selection</category><category>methodology</category><author>hello@mapdove.com (Marcus Bell)</author></item><item><title>Measuring cannibalization before you sign a lease</title><link>https://mapdove.com/blog/cannibalization/</link><guid isPermaLink="true">https://mapdove.com/blog/cannibalization/</guid><description>Use before/after Huff runs to separate net new visits from visits transferred away from your own stores and competitors.</description><pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The most expensive mistake in network expansion rarely shows up as a bad store. It shows up as a good store that made two other stores worse. The new location hits its forecast, the regional total barely moves, and a year later someone runs a same-store sales report and finds out where the visits came from.&lt;/p&gt;
&lt;p&gt;Cannibalization can be measured before you sign. Here is how MapDove does it and how to read the results.&lt;/p&gt;
&lt;h2 id=&quot;before-and-after-same-model&quot;&gt;Before and after, same model&lt;/h2&gt;
&lt;p&gt;The method is simple and deliberately symmetric. MapDove runs the category’s Huff model for the city twice:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Before&lt;/strong&gt;: every existing store, no candidate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;After&lt;/strong&gt;: the same stores plus the candidate, with attractiveness &lt;code&gt;(sqft / base_sqft)^0.7 × brand_strength&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For each existing store &lt;em&gt;j&lt;/em&gt;, the modeled demand it captures is summed across every hex in its trade radius. Its change is converted to visits using the same calibration factor k that produces the headline forecast:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Δvisits_j = k × (E_after,j − E_before,j)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;k is the ratio of observed average daily visits in the last 90 days to modeled expected demand, across the existing stores in that city and category. Since the forecast and the losses share one k, they are directly comparable. A candidate forecast at 400 visits a day and total losses of 300 a day means 300 of those 400 visits are transferred.&lt;/p&gt;
&lt;h2 id=&quot;where-net-new-visits-come-from&quot;&gt;Where net new visits come from&lt;/h2&gt;
&lt;p&gt;This point is the core of the method, and people often miss it.&lt;/p&gt;
&lt;p&gt;In MapDove’s Huff formulation each hex has an &lt;strong&gt;outside option&lt;/strong&gt; with utility &lt;code&gt;u0 = 1 / (0.6 · R)^λ&lt;/code&gt;. It represents the trips residents make somewhere the model doesn’t track: another city, home, or an untracked format. When the candidate opens, it takes share from the existing stores &lt;em&gt;and&lt;/em&gt; from the outside option. Only the second part is genuinely new to the category.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;predicted visits  = transferred from existing stores  +  net new (from the outside option)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;net new           = predicted visits − total cannibalized&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The implication is structural. &lt;strong&gt;In dense, well-served markets the outside option is small, so most of a new store’s visits are transferred.&lt;/strong&gt; In thinly served growth areas, a much larger share is net new. The model is telling you what experienced operators already know: infill in a saturated core mostly moves customers around, while the frontier creates them.&lt;/p&gt;
&lt;h2 id=&quot;reading-the-impacted-list&quot;&gt;Reading the impacted list&lt;/h2&gt;
&lt;p&gt;The Huff result includes &lt;strong&gt;total cannibalized daily visits&lt;/strong&gt; across all stores in the category, plus the most affected stores (up to ten, with a loss of at least half a visit per day). For each one you get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;distance from the candidate,&lt;/li&gt;
&lt;li&gt;current average daily visits,&lt;/li&gt;
&lt;li&gt;the modeled change in daily visits and as a percentage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The list includes &lt;strong&gt;competitors as well as your own stores&lt;/strong&gt;. That distinction is the whole point:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source of the candidate’s visits&lt;/th&gt;
&lt;th&gt;Effect on your network&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Your own existing stores&lt;/td&gt;
&lt;td&gt;Cannibalization, a cost to you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Competitors’ stores&lt;/td&gt;
&lt;td&gt;Share gain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outside option&lt;/td&gt;
&lt;td&gt;Category growth (net new)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Filter the impacted list by brand. Suppose a Bean Republic candidate takes 120 visits a day from Copperline Coffee and 60 from two Bean Republic stores. Its network value is about the forecast minus 60, not the forecast minus 180.&lt;/p&gt;
&lt;h2 id=&quot;an-illustrative-example&quot;&gt;An illustrative example&lt;/h2&gt;
&lt;p&gt;Picture a FreshCart Market candidate on the growth edge of a Sunbelt city. Grocery uses λ = 1.8 and a 9 km trade radius. The model returns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;predicted daily visits: &lt;strong&gt;1,450&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;total cannibalized: &lt;strong&gt;980&lt;/strong&gt;, so about &lt;strong&gt;470 net new&lt;/strong&gt; per day&lt;/li&gt;
&lt;li&gt;impacted: a competitor 2.1 km away (−410, −18%), FreshCart’s own store 3.4 km away (−260, −11%), another competitor 4.8 km away (−150), and smaller losses beyond&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FreshCart’s own-network loss is about 260 visits a day plus whatever smaller own-brand losses appear further down the list. The question for the committee is whether a store with 1,450 daily visits, of which roughly 1,190 are new &lt;em&gt;to FreshCart&lt;/em&gt;, justifies the rent. It is not whether 1,450 is a good number. These figures are illustrative and drawn from synthetic demo parameters, but the framing transfers directly to a real decision.&lt;/p&gt;
&lt;p&gt;Also watch the &lt;strong&gt;percentage&lt;/strong&gt; column. An 11% loss at a store already near break-even matters more than a 15% loss at a flagship with headroom.&lt;/p&gt;
&lt;h2 id=&quot;ways-to-reduce-cannibalization&quot;&gt;Ways to reduce cannibalization&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Move the pin.&lt;/strong&gt; Distance decay is steep. Shifting a candidate 1–2 km away from your own store often cuts own-brand losses sharply while keeping most of the forecast. Compare variants side by side with &lt;a href=&quot;/docs/compare-sites/&quot;&gt;compare sites&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Change the format.&lt;/strong&gt; A smaller floor plate lowers attractiveness through the 0.7 exponent, which reduces both the forecast and the draw from nearby stores.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use suitability spacing.&lt;/strong&gt; Setting the MCDA minimum spacing near your format’s typical p50 trade area distance keeps shortlists from piling up in one place.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consider relocation.&lt;/strong&gt; If an existing store loses 30% or more to a candidate, the real question may be whether to move it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;limits-worth-stating&quot;&gt;Limits worth stating&lt;/h2&gt;
&lt;p&gt;The model holds k and the existing stores’ attractiveness fixed, so it doesn’t capture competitor responses, promotions, or loyalty programs that blunt switching. It reads distance as straight-line, not drive time. Use it to rank and size options, and combine it with drive-time &lt;a href=&quot;/docs/catchments/&quot;&gt;catchments&lt;/a&gt; and local knowledge.&lt;/p&gt;
&lt;h2 id=&quot;practical-takeaways&quot;&gt;Practical takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Report three numbers, not one:&lt;/strong&gt; predicted visits, own-brand cannibalization and net new.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filter the impacted list by brand.&lt;/strong&gt; Losses at competitor stores are gains for you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expect high transfer in saturated cores&lt;/strong&gt; and treat a high net-new share there with skepticism.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test pin moves and floor plate variants&lt;/strong&gt; before you negotiate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the &lt;a href=&quot;/docs/cannibalization/&quot;&gt;cannibalization docs&lt;/a&gt; for the full output schema.&lt;/p&gt;</content:encoded><category>cannibalization</category><category>huff-model</category><category>site-selection</category><author>hello@mapdove.com (Priya Natarajan)</author></item><item><title>Seasonality in Sunbelt retail: Austin, Houston, Phoenix and Miami compared</title><link>https://mapdove.com/blog/sunbelt-seasonality/</link><guid isPermaLink="true">https://mapdove.com/blog/sunbelt-seasonality/</guid><description>Four Sunbelt metros, four different calendars. How seasonal swings and holiday effects distort foot traffic, and how to deseasonalize YoY comparisons.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;“Visits are down 9% since March” is one of the most common sentences in a retail operations review, and one of the least informative. In much of the Sunbelt, a spring-to-summer decline is not a signal about your store. It is the calendar.&lt;/p&gt;
&lt;p&gt;The four US metros in MapDove’s demo dataset (Austin, Houston, Phoenix and Miami) all sit in the warm southern belt, but they do not share a seasonal shape. Treating them as one “Sunbelt” pattern is a quick way to misread a portfolio.&lt;/p&gt;
&lt;p&gt;A note on data: everything below refers to MapDove’s &lt;a href=&quot;/docs/demo-data/&quot;&gt;demo dataset&lt;/a&gt;, which is modeled from neighborhood-level parameters, not from a device panel. The seasonal parameters are deliberately chosen to reflect well-known regional patterns, which makes the dataset a useful sandbox for practicing the analysis.&lt;/p&gt;
&lt;h2 id=&quot;four-cities-four-calendars&quot;&gt;Four cities, four calendars&lt;/h2&gt;
&lt;p&gt;Each city in the demo data has a seasonal amplitude (how far traffic swings above and below its annual baseline) and a peak day of the year:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;th&gt;Amplitude&lt;/th&gt;
&lt;th&gt;Seasonal peak&lt;/th&gt;
&lt;th&gt;What drives it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Austin&lt;/td&gt;
&lt;td&gt;±6%&lt;/td&gt;
&lt;td&gt;~late April&lt;/td&gt;
&lt;td&gt;Mild spring, festival season, university calendar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Houston&lt;/td&gt;
&lt;td&gt;±5%&lt;/td&gt;
&lt;td&gt;~early April&lt;/td&gt;
&lt;td&gt;Humid summers, relatively flat year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phoenix&lt;/td&gt;
&lt;td&gt;±12%&lt;/td&gt;
&lt;td&gt;~mid-February&lt;/td&gt;
&lt;td&gt;Winter visitors; deep summer heat dip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Miami&lt;/td&gt;
&lt;td&gt;±12%&lt;/td&gt;
&lt;td&gt;~early February&lt;/td&gt;
&lt;td&gt;Winter high season, tourism&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Two clusters jump out. &lt;strong&gt;Austin and Houston&lt;/strong&gt; are gentle: a mid-single-digit swing with a spring crest. &lt;strong&gt;Phoenix and Miami&lt;/strong&gt; are pronounced: roughly double the amplitude, peaking in winter, with a trough in late summer.&lt;/p&gt;
&lt;p&gt;The practical consequence: a Phoenix store that is 20% below its February level in August may be performing perfectly normally. An Austin store showing the same drop has a problem worth investigating.&lt;/p&gt;
&lt;h2 id=&quot;holiday-effects-sit-on-top-of-the-season&quot;&gt;Holiday effects sit on top of the season&lt;/h2&gt;
&lt;p&gt;Layered on the smooth seasonal curve are a handful of sharp calendar effects that hit all four markets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Black Friday spike.&lt;/strong&gt; A one-day surge concentrated in apparel, department stores and big-box categories.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Holiday peak around December 20.&lt;/strong&gt; A broad lift across most retail categories through the last shopping week before Christmas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Closures on Thanksgiving and Christmas Day.&lt;/strong&gt; Visits near zero for most store categories.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These matter more than their size suggests. A single closure day removes about 3% of a month’s traffic. If Thanksgiving falls in a different week relative to your comparison window, a naive week-over-week or month-over-month number can swing several points for no operational reason.&lt;/p&gt;
&lt;p&gt;Day-of-week mix matters too. A month with five Saturdays will outperform a month with four for most consumer categories, all else equal.&lt;/p&gt;
&lt;h2 id=&quot;why-year-over-year-isnt-automatically-clean&quot;&gt;Why year-over-year isn’t automatically clean&lt;/h2&gt;
&lt;p&gt;YoY is the standard fix for seasonality, and it removes the bulk of it. But it leaves three distortions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Calendar drift.&lt;/strong&gt; Holidays tied to weekdays (Thanksgiving, Black Friday) move against fixed dates. November YoY can look strong or weak depending on where the Thursday falls.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weekday composition.&lt;/strong&gt; The same calendar month has a different mix of weekdays each year.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shifting base.&lt;/strong&gt; If the prior year was itself unusual (an extended closure, a remodel, a new competitor nearby), YoY inherits that noise.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;a-practical-deseasonalization-workflow&quot;&gt;A practical deseasonalization workflow&lt;/h2&gt;
&lt;p&gt;You don’t need a time-series PhD to get to an honest comparison. This is the routine we recommend:&lt;/p&gt;
&lt;h3 id=&quot;1-compare-like-with-like-on-the-calendar&quot;&gt;1. Compare like with like on the calendar&lt;/h3&gt;
&lt;p&gt;Align comparison windows by weekday, not by date: compare the 52 weeks ending on a Sunday against the 52 weeks ending on the matching Sunday a year earlier. For holiday periods, compare “Thanksgiving week” with “Thanksgiving week,” not “November 22–28” with “November 22–28.”&lt;/p&gt;
&lt;h3 id=&quot;2-strip-the-holiday-days&quot;&gt;2. Strip the holiday days&lt;/h3&gt;
&lt;p&gt;Exclude closure days and the Black Friday spike from routine trend analysis, then report them separately. They are events, not trend.&lt;/p&gt;
&lt;h3 id=&quot;3-benchmark-against-the-category-in-the-same-city&quot;&gt;3. Benchmark against the category in the same city&lt;/h3&gt;
&lt;p&gt;The fastest way to neutralize seasonality is to divide it out. MapDove’s visit series for every place ships with a &lt;strong&gt;benchmark&lt;/strong&gt;: the average per-place visits for the same category in the same city, at the same granularity. If your Phoenix FreshCart Market location is down 18% from February but the Phoenix grocery benchmark is down 19%, your store is slightly &lt;em&gt;outperforming&lt;/em&gt; its market.&lt;/p&gt;
&lt;p&gt;An index such as &lt;code&gt;store visits / category benchmark × 100&lt;/code&gt; is seasonally adjusted by construction, as long as your comparison set lives in the same city. Pull it from the place view or via &lt;a href=&quot;/docs/api-overview/&quot;&gt;&lt;code&gt;/places/:id/visits&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;4-never-pool-cities-without-adjusting&quot;&gt;4. Never pool cities without adjusting&lt;/h3&gt;
&lt;p&gt;When you roll a Sunbelt portfolio into a single number, a heavy Phoenix and Miami weighting will make the whole network look seasonal. Index each store to its own city benchmark first, then aggregate the indices.&lt;/p&gt;
&lt;h2 id=&quot;what-this-means-for-site-selection&quot;&gt;What this means for site selection&lt;/h2&gt;
&lt;p&gt;Seasonality is not just a reporting headache; it affects underwriting.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Peak-to-trough swing sets staffing and inventory risk.&lt;/strong&gt; A ±12% market requires more operating flexibility than a ±5% one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Annualize before you compare.&lt;/strong&gt; A site evaluated from three winter months in Miami will look systematically stronger than one evaluated from three summer months in Houston. Use the full year of history, which the &lt;a href=&quot;/pricing/&quot;&gt;Pro plan&lt;/a&gt; provides; the Free plan’s 90-day window is fine for exploring, but it is not enough to underwrite a seasonal market.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forecasts should be annual.&lt;/strong&gt; The &lt;a href=&quot;/docs/huff-forecast/&quot;&gt;Huff forecast&lt;/a&gt; produces annualized expected visits; resist the temptation to sanity-check it against a single peak month.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;takeaway&quot;&gt;Takeaway&lt;/h2&gt;
&lt;p&gt;Before you react to a decline in a Sunbelt store, ask which calendar it lives on. Austin and Houston swing gently and peak in spring; Phoenix and Miami swing twice as hard and peak in winter. Align windows by weekday, pull holiday days out of trend, and index every store to its own city-and-category benchmark. Do those three things and most “seasonal mysteries” resolve themselves. The &lt;a href=&quot;/docs/methodology/&quot;&gt;methodology docs&lt;/a&gt; cover how the benchmark is computed.&lt;/p&gt;</content:encoded><category>seasonality</category><category>sunbelt</category><category>foot-traffic</category><category>methodology</category><author>hello@mapdove.com (Lena Ortiz)</author></item><item><title>How to read a trade area</title><link>https://mapdove.com/blog/reading-trade-areas/</link><guid isPermaLink="true">https://mapdove.com/blog/reading-trade-areas/</guid><description>What the 85% visitor-origin hexes, distance quantiles, segment mix and the shape of a trade area tell you about a store.</description><pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A trade area map is one of the most shared screenshots in retail real estate, and one of the least read. People notice the blob, say “it’s bigger than I expected,” and move on. The useful information is in the details: which hexes make the cut, how quickly the share falls off with distance, who lives there, and why the shape looks the way it does.&lt;/p&gt;
&lt;p&gt;This post covers how MapDove builds a trade area and how to interpret each part of it.&lt;/p&gt;
&lt;h2 id=&quot;what-the-map-actually-shows&quot;&gt;What the map actually shows&lt;/h2&gt;
&lt;p&gt;For any place, MapDove models where its visitors come from. It runs the category’s Huff model over the city’s hex grid (cells of roughly 0.8 km²). Each hex’s flow to the store is its demand (population + 0.4 × daytime population) multiplied by the probability that its residents choose this store over every competitor and over the outside option. Divide each flow by the total and you get the hex’s &lt;strong&gt;share&lt;/strong&gt; of the store’s modeled visitors.&lt;/p&gt;
&lt;p&gt;The hexes are then ranked by share, and MapDove keeps the smallest set that covers &lt;strong&gt;85% of modeled visitors&lt;/strong&gt;. Every hex carries both its own share and a &lt;strong&gt;cumulative share&lt;/strong&gt;, so you can see whether the store’s top 10 hexes account for 40% of visitors or 70%.&lt;/p&gt;
&lt;p&gt;Why 85% and not 100%? The last 15% is a long, thin tail of cells that each contribute a fraction of a percent. Including them makes the trade area look huge and hides its real core. In the demo dataset, all visitor figures are synthetic, modeled from neighborhood-level parameters, so read the trade area as &lt;em&gt;modeled visitor origins&lt;/em&gt; and not as a device trace.&lt;/p&gt;
&lt;h2 id=&quot;distance-quantiles-the-shape-of-decay&quot;&gt;Distance quantiles: the shape of decay&lt;/h2&gt;
&lt;p&gt;The summary reports two distances:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Median (p50) distance&lt;/strong&gt;: half of modeled visitors come from closer than this.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average distance&lt;/strong&gt;: the visitor-weighted mean.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The gap between the two is the diagnostic. When average and median are close, the store pulls evenly from a compact area, which is typical for fuel &amp;#x26; convenience or quick service. When the average is well above the median, a small group of distant hexes is carrying weight. Usually that means a destination format such as a shopping center, cinema or department store, or a store at the edge of town whose nearest competitors are far away.&lt;/p&gt;
&lt;p&gt;Compare distances against the category’s character. Grocery has a 9 km modeled trade radius and moderate distance decay. A grocery store with a 1.5 km median is a neighborhood store. One with a 5 km median is acting as a regional anchor, and you should ask why.&lt;/p&gt;
&lt;h2 id=&quot;segment-mix-who-not-just-where&quot;&gt;Segment mix: who, not just where&lt;/h2&gt;
&lt;p&gt;Each hex has a dominant lifestyle segment, and the summary weights those segments by visitor share. MapDove’s segments include Urban Professionals, Young Renters, Suburban Families, Working Families, Golden Years and Value Seekers, among others.&lt;/p&gt;
&lt;p&gt;Three ways to use the mix:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check fit.&lt;/strong&gt; A premium Urban Loom apparel store drawing 45% from Value Seekers has a positioning problem or a location problem.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compare with the catchment.&lt;/strong&gt; A 3-mile ring shows who &lt;em&gt;lives&lt;/em&gt; around the store. The trade area shows who the model expects to &lt;em&gt;visit&lt;/em&gt;. When the two differ, competitors are capturing part of the ring.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Find lookalikes.&lt;/strong&gt; A strong store’s segment mix is a profile you can look for elsewhere. Combine it with the &lt;a href=&quot;/docs/segments/&quot;&gt;segments docs&lt;/a&gt; and suitability weights to find similar territory.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The neighborhood breakdown does the same job in plainer language: “31% Downtown, 18% East Austin” is easier to bring to a leasing meeting than a hex map.&lt;/p&gt;
&lt;h2 id=&quot;what-shapes-mean&quot;&gt;What shapes mean&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shape&lt;/th&gt;
&lt;th&gt;Typical cause&lt;/th&gt;
&lt;th&gt;What to ask&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compact, roughly circular&lt;/td&gt;
&lt;td&gt;Steep decay (fuel, coffee, pharmacy), evenly spread competition&lt;/td&gt;
&lt;td&gt;Is the store simply serving its neighborhood?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lopsided or crescent&lt;/td&gt;
&lt;td&gt;A strong competitor on one side takes the near hexes&lt;/td&gt;
&lt;td&gt;Is the competitor’s share vulnerable or entrenched?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elongated along a corridor&lt;/td&gt;
&lt;td&gt;Demand concentrated along a linear spine&lt;/td&gt;
&lt;td&gt;Dubai’s Sheikh Zayed Road, or I-35 north of Austin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fragmented, several lobes&lt;/td&gt;
&lt;td&gt;Polycentric demand, with employment clusters that compete&lt;/td&gt;
&lt;td&gt;Typical of Houston’s multiple centers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Very large, diffuse&lt;/td&gt;
&lt;td&gt;Destination category or no nearby competition&lt;/td&gt;
&lt;td&gt;Is the store a draw, or simply alone?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A &lt;strong&gt;lopsided&lt;/strong&gt; trade area is the most useful shape for planning. It shows exactly where a competitor is winning, and therefore where a second location, or a relocation, would capture demand the current store can’t reach.&lt;/p&gt;
&lt;p&gt;Shapes also have a hard edge. A store only competes for hexes within its category’s trade radius (6 km for coffee, 25 km for shopping centers), so a trade area that runs right up to that radius in one direction usually means demand there is underserved.&lt;/p&gt;
&lt;h2 id=&quot;common-misreadings&quot;&gt;Common misreadings&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;“Bigger is better.”&lt;/strong&gt; A large trade area often means weak local density, not strong pull. Look at visits per hex alongside area.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treating share as penetration.&lt;/strong&gt; A hex with 6% of the store’s visitors may still send 90% of its own category trips elsewhere. Share is about the store’s visitor base, not about the hex.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ignoring daytime population.&lt;/strong&gt; Downtown hexes with few residents can rank high because of the 0.4 × daytime weight. That’s correct for coffee and lunch formats and misleading for grocery.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;practical-takeaways&quot;&gt;Practical takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Read cumulative share first.&lt;/strong&gt; How many hexes make up 50% of visitors tells you how concentrated the store is.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use the average-to-median distance gap&lt;/strong&gt; to tell convenience behavior from destination behavior.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Put the segment mix next to the ring catchment&lt;/strong&gt; to see what competitors are taking.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Treat lopsided shapes as leads&lt;/strong&gt; for infill or relocation analysis.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Explore any store’s trade area in &lt;a href=&quot;/product/trade-areas/&quot;&gt;Trade Areas&lt;/a&gt;, and see the &lt;a href=&quot;/docs/trade-areas/&quot;&gt;trade area docs&lt;/a&gt; for field definitions.&lt;/p&gt;</content:encoded><category>trade-areas</category><category>foot-traffic</category><category>methodology</category><author>hello@mapdove.com (Marcus Bell)</author></item><item><title>Market note: mall-centric retail in Dubai</title><link>https://mapdove.com/blog/dubai-mall-retail-note/</link><guid isPermaLink="true">https://mapdove.com/blog/dubai-mall-retail-note/</guid><description>A linear city, a cool-season peak and fast-growing master-planned communities. What makes Dubai retail different, and how to read it in MapDove.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Teams that arrive in Dubai with a playbook built in North American or European markets usually get two things wrong in their first month. They underestimate how much retail is concentrated inside enclosed malls, and they overestimate how much a single straight-line radius tells them about who will visit.&lt;/p&gt;
&lt;p&gt;This note walks through the structural features of the market as they appear in MapDove’s Dubai &lt;a href=&quot;/docs/demo-data/&quot;&gt;demo dataset&lt;/a&gt;, modeled from neighborhood-level parameters across 16 neighborhoods, 247 places and 14 categories. Figures are reported in AED and metric units.&lt;/p&gt;
&lt;h2 id=&quot;a-linear-city&quot;&gt;A linear city&lt;/h2&gt;
&lt;p&gt;Dubai’s geography is shaped by the coast and by one road. Sheikh Zayed Road runs parallel to the Gulf, and most of the city’s commercial energy is strung along it: DIFC and Downtown Dubai at the northern end of the corridor, Business Bay beside them, Al Barsha and Al Quoz in the middle, and Dubai Marina and JLT at the southwestern end.&lt;/p&gt;
&lt;p&gt;That shape has consequences for catchments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Trade areas are elongated.&lt;/strong&gt; A strong location draws along the corridor far more than across it. A circular ring will overcount the desert-side and sea-side edges and undercount the corridor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Distance is cheap, crossings are not.&lt;/strong&gt; Dubai has the highest average travel speed of the five demo cities (55 km/h in the model), so a 15-minute drive covers nearly 14 km. But a handful of interchanges determine who can actually make that trip conveniently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The old city works differently.&lt;/strong&gt; Deira, Bur Dubai and Al Karama, on and around the Creek, are dense, walkable and street-retail-oriented, with lower incomes and very high density. They behave much more like a traditional high street than the corridor does.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you run a &lt;a href=&quot;/docs/catchments/&quot;&gt;drive-time catchment&lt;/a&gt; in Dubai, remember that MapDove converts minutes to a radius using the city’s average speed. That is a sound first pass for comparing sites, but compare it against the &lt;a href=&quot;/docs/trade-areas/&quot;&gt;modeled trade area&lt;/a&gt; before drawing conclusions about a site next to the Creek or the coast.&lt;/p&gt;
&lt;h2 id=&quot;the-mall-is-the-high-street&quot;&gt;The mall is the high street&lt;/h2&gt;
&lt;p&gt;In much of the city, the enclosed mall is not one retail format among many; it is the default. Climate is the main reason, but not the only one. Malls bundle parking, entertainment, dining and anchors into a single trip, and they set the rhythm of the week: evenings and weekends dominate, and dwell times are long.&lt;/p&gt;
&lt;p&gt;For an analyst, that means three adjustments:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Think in co-tenancy, not frontage.&lt;/strong&gt; A unit’s performance depends heavily on the anchors and adjacencies around it. &lt;a href=&quot;/docs/cross-shopping/&quot;&gt;Cross-shopping&lt;/a&gt; is the most useful lens: which other places do this store’s visitors also visit?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dwell time is a primary KPI.&lt;/strong&gt; In a super-regional mall on Sheikh Zayed Road, a café that holds visitors for 40 minutes is doing something different from a kiosk that sees ten times the footfall for five.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visits per location understate concentration.&lt;/strong&gt; A mall-based Copperline Coffee unit and a standalone neighborhood Copperline Coffee are not comparable on raw visits. Benchmark each against its category in the same city, and segment by setting.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;a-cool-season-market&quot;&gt;A cool-season market&lt;/h2&gt;
&lt;p&gt;Dubai has the strongest seasonal swing of any city in the demo data: an amplitude of about ±15%, peaking around mid-January. The cooler months bring visitors, outdoor events and more discretionary trips; the hottest summer months pull traffic down, especially for anything outdoors or along the waterfront.&lt;/p&gt;
&lt;p&gt;Two practical notes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Indoor formats compress the swing.&lt;/strong&gt; Mall-based units see a softer summer trough than street retail, because the mall itself is the climate refuge. When comparing a mall unit with a street unit, deseasonalize both against the city category benchmark first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Never underwrite on winter alone.&lt;/strong&gt; Three strong months from December to February can make almost any site look attractive. Use a full year of history before committing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;three-contrasting-submarkets&quot;&gt;Three contrasting submarkets&lt;/h2&gt;
&lt;h3 id=&quot;downtown-dubai-and-difc&quot;&gt;Downtown Dubai and DIFC&lt;/h3&gt;
&lt;p&gt;The highest commercial intensity in the city and high incomes. Visitor-heavy, tourism-exposed, and dominated by destination retail and dining. Excellent for flagships and brand presence; expensive, and highly seasonal.&lt;/p&gt;
&lt;h3 id=&quot;dubai-marina-and-jlt&quot;&gt;Dubai Marina and JLT&lt;/h3&gt;
&lt;p&gt;Dense, high-rise residential with a strong lifestyle and dining scene. A large resident base walks to everyday retail, while the waterfront draws visitors. Good for convenience categories (coffee, pharmacy, fitness) where a resident base supports repeat visits.&lt;/p&gt;
&lt;h3 id=&quot;deira-and-the-creek&quot;&gt;Deira and the Creek&lt;/h3&gt;
&lt;p&gt;Lower incomes, very high density and a long-established trading culture. Street-level retail, value-oriented formats and strong weekday traffic. Underweighted by teams that only look at mall data, and often where the most efficient value-tier locations are.&lt;/p&gt;
&lt;h2 id=&quot;master-planned-communities-the-growth-story&quot;&gt;Master-planned communities: the growth story&lt;/h2&gt;
&lt;p&gt;The fastest-growing neighborhoods in the demo dataset are the master-planned communities further inland, with Dubai Hills and Jumeirah Village showing the highest growth parameters in the city. Silicon Oasis and Mirdif follow a similar logic: family-oriented, car-dependent, built around a community center or a neighborhood mall.&lt;/p&gt;
&lt;p&gt;These communities reward a specific kind of site strategy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Be early, and be in the community center.&lt;/strong&gt; Residents default to the closest convenient cluster for grocery, pharmacy, coffee and fitness.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch cannibalization.&lt;/strong&gt; As a community fills in, operators often open a second unit nearby. Use the &lt;a href=&quot;/docs/cannibalization/&quot;&gt;cannibalization view&lt;/a&gt; in the Huff forecast to estimate how much of a new unit’s volume will be drawn from your own existing locations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use suitability with a growth weight.&lt;/strong&gt; In the &lt;a href=&quot;/docs/site-suitability/&quot;&gt;site suitability&lt;/a&gt; model, increasing the growth criterion’s weight shifts the top-ranked hexes noticeably toward these communities.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;takeaway&quot;&gt;Takeaway&lt;/h2&gt;
&lt;p&gt;Read Dubai along the corridor, not in circles; treat the mall as the high street and judge units by co-tenancy and dwell, not frontage; underwrite on a full year because of the strong cool-season peak; and look inland to the master-planned communities for growth. For a guided starting point, open the &lt;a href=&quot;/cities/dubai/&quot;&gt;Dubai city page&lt;/a&gt; and run a cross-shopping analysis on any mall-based place.&lt;/p&gt;</content:encoded><category>market-notes</category><category>dubai</category><category>seasonality</category><category>trade-areas</category><author>hello@mapdove.com (Omar Haddad)</author></item><item><title>MCDA weighted overlay for site selection, explained</title><link>https://mapdove.com/blog/mcda-weighted-overlay/</link><guid isPermaLink="true">https://mapdove.com/blog/mcda-weighted-overlay/</guid><description>How MapDove scores every hex for suitability: criteria, min-max normalization, inverted cost criteria, weight sensitivity and spacing of top sites.</description><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A Huff forecast answers a narrow question about one candidate address. Before you can ask it, you need a shortlist. Multi-criteria decision analysis (MCDA) produces that shortlist. It scores every hex cell in a city against the factors that matter for your format, so you can see where to look before you see what a site is worth.&lt;/p&gt;
&lt;p&gt;MapDove uses a weighted linear overlay. It is the most transparent form of MCDA: every score can be traced back to a few normalized inputs and the weights you chose. This post covers how it works and how to keep it from misleading you.&lt;/p&gt;
&lt;h2 id=&quot;the-criteria&quot;&gt;The criteria&lt;/h2&gt;
&lt;p&gt;Each hex (about 0.8 km²) carries nine criteria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Population density&lt;/strong&gt;: residents per km².&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Income&lt;/strong&gt;: median household income.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Daytime density&lt;/strong&gt;: workers and visitors per km².&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traffic index&lt;/strong&gt;: relative road and pedestrian activity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Growth&lt;/strong&gt;: projected population growth rate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Competition&lt;/strong&gt;: same-category stores, weighted by a distance-decay kernel &lt;code&gt;exp(−d / 1.5 km)&lt;/code&gt; for every store within 4 km, then log-scaled. &lt;em&gt;Inverted&lt;/em&gt;: less is better.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complementary businesses&lt;/strong&gt;: nearby categories that send you customers, such as fitness and apparel for coffee or pharmacy and fuel for grocery. Weighted by &lt;code&gt;exp(−d / 0.8 km)&lt;/code&gt; within 2.5 km, also log-scaled.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rent&lt;/strong&gt;: the rent index. &lt;em&gt;Inverted&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Demand gap&lt;/strong&gt;: demand that is poorly served today (defined below).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The kernels matter. A raw count of competitors within 4 km treats a store next door the same as one at the edge of the radius. With a 1.5 km decay, a competitor 500 m away counts about 0.72, one at 3 km counts about 0.14. Complementary businesses use a tighter 0.8 km kernel, because co-tenancy only helps when people can walk or make a quick stop between stores.&lt;/p&gt;
&lt;p&gt;The log transform (&lt;code&gt;ln(1 + x)&lt;/code&gt;) stops one dense cluster, such as a downtown core, from flattening every other part of the city to zero.&lt;/p&gt;
&lt;h2 id=&quot;min-max-normalization-per-city&quot;&gt;Min-max normalization, per city&lt;/h2&gt;
&lt;p&gt;Criteria come in different units: dollars, people per km², index points. Each one is rescaled to 0–1 across all hexes in the selected city:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;x_norm = (x − min_city) / (max_city − min_city)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For cost criteria (competition and rent) MapDove uses &lt;code&gt;1 − x_norm&lt;/code&gt;, so a high normalized value always means “better for the site”.&lt;/p&gt;
&lt;p&gt;Normalization is per city, so scores are &lt;strong&gt;relative to the market&lt;/strong&gt;. A 0.9 on income in Phoenix and a 0.9 in Miami are not the same dollar figure. Each means “near the top of this city”. Compare rankings within a city. Don’t compare raw scores between cities.&lt;/p&gt;
&lt;h2 id=&quot;the-demand-gap-criterion&quot;&gt;The demand gap criterion&lt;/h2&gt;
&lt;p&gt;The demand gap combines demand with existing access:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;gap = demand_norm × (1 − access_norm)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Demand is population + 0.4 × daytime population. Access is the summed Huff-style utility of existing stores in the category, log-scaled and normalized. A hex with many people and little nearby supply scores high. A dense hex that is already saturated scores low. Of all the criteria, the gap is the one most closely tied to what the Huff model will later reward.&lt;/p&gt;
&lt;h2 id=&quot;the-score&quot;&gt;The score&lt;/h2&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;score = 100 × Σ (w_c · x_c) / Σ w_c          with w_c ∈ [0, 10]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A weight of 0 removes a criterion. Dividing by the sum of weights keeps every score on 0–100 however many criteria you switch on. That means the &lt;em&gt;ratios&lt;/em&gt; between weights are what matter, not their absolute values: weights of 8/4 and 4/2 give the same map.&lt;/p&gt;
&lt;h2 id=&quot;weight-sensitivity-the-part-people-skip&quot;&gt;Weight sensitivity: the part people skip&lt;/h2&gt;
&lt;p&gt;Weights look like a statement of priorities, but a criterion’s real influence also depends on how much it varies across the city. If almost every hex scores 0.6–0.7 on traffic, a traffic weight of 10 hardly reorders anything. A criterion with values spread from 0 to 1 decides the ranking even at a moderate weight.&lt;/p&gt;
&lt;p&gt;Two more traps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Correlated criteria double-count.&lt;/strong&gt; Population density, daytime density and demand gap all carry “lots of people”. Weight all three at 8 and you’ve made a population model with extra steps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outliers compress the scale.&lt;/strong&gt; A single extreme hex, such as a stadium or an airport, can push everything else into a narrow band. The log scaling on kernel criteria reduces this, but it doesn’t remove it for linear criteria like income.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is an illustrative comparison of two hexes under two weight sets:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hex&lt;/th&gt;
&lt;th&gt;Pop.&lt;/th&gt;
&lt;th&gt;Income&lt;/th&gt;
&lt;th&gt;Competition (inv.)&lt;/th&gt;
&lt;th&gt;Rent (inv.)&lt;/th&gt;
&lt;th&gt;Gap&lt;/th&gt;
&lt;th&gt;Score A*&lt;/th&gt;
&lt;th&gt;Score B**&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;H1 – urban core&lt;/td&gt;
&lt;td&gt;0.92&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;td&gt;0.20&lt;/td&gt;
&lt;td&gt;0.15&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;H2 – growth edge&lt;/td&gt;
&lt;td&gt;0.45&lt;/td&gt;
&lt;td&gt;0.65&lt;/td&gt;
&lt;td&gt;0.85&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;*A: population 8, income 4, competition 4, rent 2, gap 4. **B: population 4, income 4, competition 6, rent 4, gap 8.&lt;/p&gt;
&lt;p&gt;H2 wins under both sets, but the margin grows from 7 to 29 points. That is a robust result. When the leader changes under modest weight shifts, the decision depends on the weights, and you need a real conversation about priorities.&lt;/p&gt;
&lt;p&gt;A practical routine: change each major weight by ±2, re-run, and see which top sites stay in the top ten. Those are your durable candidates.&lt;/p&gt;
&lt;h2 id=&quot;top-sites-and-minimum-spacing&quot;&gt;Top sites and minimum spacing&lt;/h2&gt;
&lt;p&gt;The ten highest-scoring hexes are often neighbors on the same street corner. That tells you little. MapDove picks top sites greedily. It takes the best hex, excludes everything within the &lt;strong&gt;minimum spacing&lt;/strong&gt; (1.5 km by default), takes the next best remaining hex, and repeats.&lt;/p&gt;
&lt;p&gt;Set the spacing to your format’s trade area scale. About 1–1.5 km works for coffee or quick service in a dense core. 4–6 km or more suits grocery or home improvement. Spacing that is too tight wastes shortlist slots on duplicates. Spacing that is too wide skips good second sites in strong districts.&lt;/p&gt;
&lt;h2 id=&quot;practical-takeaways&quot;&gt;Practical takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Start with five or fewer criteria&lt;/strong&gt; that you can defend to a real estate committee, then add more only if they change the answer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid stacking correlated criteria&lt;/strong&gt;, and remember that only weight ratios matter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run a ±2 sensitivity pass&lt;/strong&gt; and treat sites that stay near the top as the real shortlist.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hand the shortlist to the Huff model.&lt;/strong&gt; Suitability says where to look. The &lt;a href=&quot;/docs/huff-forecast/&quot;&gt;Huff forecast&lt;/a&gt; and &lt;a href=&quot;/docs/compare-sites/&quot;&gt;compare sites&lt;/a&gt; tell you what each site is worth.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the &lt;a href=&quot;/docs/site-suitability/&quot;&gt;site suitability docs&lt;/a&gt; for the full criteria reference, or try it in &lt;a href=&quot;/product/site-selection/&quot;&gt;Site Selection&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>mcda</category><category>site-selection</category><category>methodology</category><author>hello@mapdove.com (Priya Natarajan)</author></item><item><title>How the Huff model forecasts visits for a new store</title><link>https://mapdove.com/blog/huff-model-forecast/</link><guid isPermaLink="true">https://mapdove.com/blog/huff-model-forecast/</guid><description>A practitioner&apos;s walk-through of Huff gravity forecasts in MapDove: utilities, the outside option, calibration and a worked example.</description><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every site selection conversation eventually reaches the same question: &lt;em&gt;if we open here, how many people will walk through the door?&lt;/em&gt; In MapDove that forecast comes from a calibrated Huff gravity model. This post covers what the model does, where its assumptions sit, and how to read the numbers it returns.&lt;/p&gt;
&lt;h2 id=&quot;the-idea-shoppers-split-their-trips-by-attraction-and-distance&quot;&gt;The idea: shoppers split their trips by attraction and distance&lt;/h2&gt;
&lt;p&gt;The Huff model treats every origin, which for us is a hex cell of roughly 0.8 km², as a pool of demand. That demand gets divided among every store in the category that residents could plausibly reach. Each store gets a &lt;em&gt;utility&lt;/em&gt; for each hex. Bigger or stronger stores have higher utility, and utility falls as distance grows.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;U_ij = A_j / d_ij^λ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;P_ij = U_ij / ( Σ_k U_ik + u0 )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A_j&lt;/strong&gt; is the store’s attractiveness.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;d_ij&lt;/strong&gt; is the distance from hex &lt;em&gt;i&lt;/em&gt; to store &lt;em&gt;j&lt;/em&gt; in km. It is floored at 0.4 km so a store sitting on top of a hex centroid doesn’t get infinite utility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;λ&lt;/strong&gt; is the category’s distance-decay exponent. Higher values mean shoppers are less willing to travel. In the demo dataset fuel &amp;#x26; convenience uses 2.6, coffee 2.2, grocery 1.8 and shopping centers 1.3.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;P_ij&lt;/strong&gt; is the probability that a trip starting in hex &lt;em&gt;i&lt;/em&gt; goes to store &lt;em&gt;j&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A store only competes for hexes inside the category’s &lt;strong&gt;trade radius R&lt;/strong&gt;: 5 km for fuel, 6 km for coffee, 9 km for grocery, 25 km for shopping centers.&lt;/p&gt;
&lt;h2 id=&quot;the-outside-option-why-probabilities-dont-sum-to-one&quot;&gt;The outside option: why probabilities don’t sum to one&lt;/h2&gt;
&lt;p&gt;A textbook Huff model assumes every trip lands at one of the modeled stores. That breaks at the edge of a city. A household 5 km from the nearest café is not guaranteed to visit a café you know about. It might brew at home, buy coffee near the office or go somewhere outside the dataset.&lt;/p&gt;
&lt;p&gt;So MapDove adds an &lt;strong&gt;outside option&lt;/strong&gt; to the denominator:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;u0 = 1 / (0.6 · R)^λ&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Read u0 as the utility of a standard store at 60% of the trade radius. Where a hex is well served, the store utilities swamp u0 and almost all demand is captured. In thin areas, u0 holds a meaningful share. This one term does three jobs. It stops sparse suburbs from producing inflated forecasts. It gives a new store somewhere to win &lt;em&gt;net new&lt;/em&gt; demand from. And it keeps cannibalization estimates honest (more on that in the &lt;a href=&quot;/docs/cannibalization/&quot;&gt;cannibalization guide&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id=&quot;demand-and-attractiveness&quot;&gt;Demand and attractiveness&lt;/h2&gt;
&lt;p&gt;Each hex’s demand is a blend of residents and daytime population:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;demand_i = population_i + 0.4 × daytime_population_i&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The 0.4 weight reflects that workers and visitors shop near where they spend the day, but less than residents shop near home.&lt;/p&gt;
&lt;p&gt;For a candidate site, attractiveness comes from its size relative to a typical store in the category, scaled by brand strength:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;A = (sqft / category_base_sqft)^0.7 × brand_strength      (brand_strength 0.6 – 1.5)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The 0.7 exponent captures diminishing returns: double the floor plate and attractiveness rises by about 62%, not 100%. Brand strength is a judgment call: 1.2–1.4 for a well-loved chain, below 1.0 for an unknown independent.&lt;/p&gt;
&lt;h2 id=&quot;calibration-turning-model-units-into-visits&quot;&gt;Calibration: turning model units into visits&lt;/h2&gt;
&lt;p&gt;Raw Huff output is “expected demand captured”, which is in population units, not visits. To convert it, MapDove calibrates against the stores that already exist:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark&quot; style=&quot;background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;text&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;k = Σ observed avg daily visits (last 90 days, existing stores)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ÷ Σ modeled expected demand of those same stores&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;predicted daily visits = k × modeled demand captured by the candidate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;k is a single scalar for the city–category pair. It absorbs everything the gravity model doesn’t represent: trip frequency, conversion and how often a resident visits that category at all. Because it is fitted to recent visits in the demo dataset, the forecast reflects how stores in that market perform.&lt;/p&gt;
&lt;h2 id=&quot;an-illustrative-worked-example&quot;&gt;An illustrative worked example&lt;/h2&gt;
&lt;p&gt;Take one hex in a coffee market (λ = 2.2, R = 6 km) with 4,000 residents and 6,000 daytime workers. Its demand is 4,000 + 0.4 × 6,000 = &lt;strong&gt;6,400&lt;/strong&gt;. The outside option is u0 = 1 / 3.6^2.2 ≈ &lt;strong&gt;0.060&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Two cafés already serve it. Bean Republic is 1.0 km away with A = 1.2. Copperline Coffee is 2.0 km away with A = 1.0. We test a candidate with 2,200 sq ft (category base is 1,800) and brand strength 1.1, located 0.8 km from the hex. Its attractiveness is (2,200/1,800)^0.7 × 1.1 ≈ &lt;strong&gt;1.27&lt;/strong&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Utility&lt;/th&gt;
&lt;th&gt;Share before&lt;/th&gt;
&lt;th&gt;Share after&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bean Republic (1.0 km)&lt;/td&gt;
&lt;td&gt;1.200&lt;/td&gt;
&lt;td&gt;81.2%&lt;/td&gt;
&lt;td&gt;33.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copperline (2.0 km)&lt;/td&gt;
&lt;td&gt;0.218&lt;/td&gt;
&lt;td&gt;14.7%&lt;/td&gt;
&lt;td&gt;6.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Candidate (0.8 km)&lt;/td&gt;
&lt;td&gt;2.068&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;58.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outside option&lt;/td&gt;
&lt;td&gt;0.060&lt;/td&gt;
&lt;td&gt;4.0%&lt;/td&gt;
&lt;td&gt;1.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The candidate captures 58.3% × 6,400 ≈ 3,733 demand units from this hex. With an illustrative k of 0.0138, that comes to about &lt;strong&gt;51 visits per day&lt;/strong&gt; from this one cell. MapDove repeats this calculation for every hex within 6 km and sums the results.&lt;/p&gt;
&lt;p&gt;Look at where those 51 visits come from: about 42 from Bean Republic, 7.6 from Copperline and only about 2 from the outside option. In a dense, well-served hex, nearly everything the new store wins is &lt;em&gt;transferred&lt;/em&gt;, not new. That is the most useful thing the model will tell you.&lt;/p&gt;
&lt;h2 id=&quot;reading-the-output&quot;&gt;Reading the output&lt;/h2&gt;
&lt;p&gt;A Huff run in &lt;a href=&quot;/product/site-selection/&quot;&gt;Site Selection&lt;/a&gt; returns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Predicted daily and annual visits&lt;/strong&gt;, already calibrated with k.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Market share&lt;/strong&gt;: the candidate’s share of modeled category demand after it opens.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Category average daily visits&lt;/strong&gt;, so you can tell whether the forecast is plausible for the format.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total cannibalized visits&lt;/strong&gt; and the most affected existing stores, with distances.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A forecast trade area&lt;/strong&gt;: the hexes that make up the first 80% of the candidate’s modeled visitors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A forecast well above the category average deserves suspicion. Check whether a generous brand strength or an oversized floor plate is doing the work.&lt;/p&gt;
&lt;h2 id=&quot;practical-takeaways&quot;&gt;Practical takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Treat brand strength as a scenario input.&lt;/strong&gt; Run 0.8, 1.0 and 1.2 and present a range, not a single number.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compare the forecast with the category average&lt;/strong&gt; before you trust it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Always read the cannibalization list next to the headline.&lt;/strong&gt; A high forecast that is mostly transferred demand may add nothing at network level.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remember the model’s limits.&lt;/strong&gt; It knows distance, size and competition. It does not know about parking, visibility or a bad left turn. Walk the site.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the full parameter reference, see the &lt;a href=&quot;/docs/huff-forecast/&quot;&gt;Huff forecast docs&lt;/a&gt; and &lt;a href=&quot;/docs/methodology/&quot;&gt;methodology&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>huff-model</category><category>site-selection</category><category>methodology</category><author>hello@mapdove.com (Lena Ortiz)</author></item></channel></rss>