
A Bluetooth Beacon deployment that looks perfect on a floor plan often falls apart in the real building. Drywall, shelving, freezers, and human bodies all eat RF, and a 3 dB mistake at the planning stage becomes a coverage hole a meter wide on the floor. The fix is not a bigger battery — it is a proper site survey and a per-zone RF model before a single gateway is mounted.
This article is the engineer’s field guide to planning Beacon coverage: the propagation math, the material loss table, the field-measurement loop, and the validation that proves the design actually works.
Why a survey instead of a guess
Coverage holes are expensive in two ways. First, a missing reading at a gateway means an asset “disappears” until it wanders back into range — exactly when you needed to know where it was. Second, fixing it after install means a technician, a lift, and a re-commissioning pass. A half-day survey costs less than one truck roll.
A survey answers three questions precisely:
1. Where do the gateways go (ceiling, wall, column)?
2. How many are needed for the target detectability?
3. What Tx power should the Beacon use to hit the threshold without wasting battery?
The propagation model you should actually use
Free-space path loss is not your friend indoors. Use the log-distance path loss model:
L(d) = L0 + 10 * n * log10(d / d0) + X_sigma # dB
L0 : path loss at reference distance d0 (1 m)
n : path-loss exponent (environment dependent)
X_sigma : Gaussian shadowing (std deviation sigma, dB)
d : distance from Beacon to gateway
At 1 m, BLE at 0 dBm Tx typically measures L0 ≈ -41 dBm at the gateway antenna. The exponent n is what kills you indoors:
| Environment | n (path-loss exponent) | sigma (dB) |
|---|---|---|
| Open outdoor / lobby | 2.0 – 2.3 | 3 – 4 |
| Open office | 2.6 – 2.9 | 4 – 6 |
| Warehouse (open) | 2.8 – 3.2 | 5 – 7 |
| Retail with shelving | 3.0 – 3.5 | 6 – 9 |
| Concrete/multi-wall | 3.5 – 4.5 | 7 – 10 |
| Through floor slabs | 4.5 – 6.0 | 8 – 12 |
Work backward from a detectability threshold. If the gateway decodes a packet at -85 dBm, and the Beacon transmits at 0 dBm, the usable path budget is 85 dB. With n = 3.0 and L0 = -41:
85 = 41 + 10 * 3.0 * log10(d) -> 44 = 30 * log10(d)
log10(d) = 1.467 -> d ≈ 29 m
Drop to n = 4.0 (concrete) and the same budget gives d ≈ 12 m. That is a 2.4x difference in range from one parameter — and the reason generic “30 m range” specs lie.
Material attenuation: the real-world tax
Path-loss exponent is a coarse average. For hard obstructions, add explicit attenuation. Measured values at 2.4 GHz:
| Obstruction | Extra attenuation (dB) |
|---|---|
| Drywall (single) | 2 – 4 |
| Glass window (no film) | 2 – 6 |
| Wood shelf / pallet rack | 3 – 8 |
| Brick wall | 8 – 12 |
| Concrete wall (100 mm) | 12 – 20 |
| Metal rack / steel door | 20 – 30 (often blocks) |
| Human body (in path) | 3 – 5 |
| Freezer / cold wall | 10 – 20 |
| Cardboard (stacked) | 1 – 3 |
Rule of thumb: if a Beacon sits *inside* a metal rack, assume line-of-sight is gone and plan an external repeater or a second gateway. Metal is not “weak signal” — it is a Faraday cage.
The field-measurement loop
The model gets you to 80%; the survey closes the last 20%. The loop:
for each candidate gateway position P:
place a test Beacon at known Tx power
walk a grid of sample points around P (1-2 m spacing)
log RSSI from the gateway over >= 30 s at each point
compute median RSSI and detectability (packets seen / sent)
if detectability < 0.99 at the coverage edge:
move P, raise Tx, or add a gateway
Tools: a phone running nRF Connect for quick checks, a dedicated sniffer (nRF52840 dongle) for ground truth, and a logging gateway that writes RSSI + timestamp to a file. Sample on all three advertising channels (37/38/39) — a channel blocked by WiFi can silently halve your detectability.
Gateway placement that survives reality
- Mount at 2.5 – 3.5 m on ceilings; higher is not always better (down-tilt to the floor where tags live).
- Keep 0.3 m clear of metal above and behind the antenna — a steel deck turns the radiation pattern into a pancake.
- Rotate channel assignments between adjacent gateways so co-channel reuse is spaced out.
- Beware the “ceiling tile trap”: the tile grid is convenient but often sits under ductwork and cabling that attenuate the upward path.
- For tall racks, mount gateways *between* aisles at mid-height, not just on the perimeter.
Coverage contour and overlap
A single gateway hearing a tag is fragile. Design for N-fold overlap — at least two gateways above threshold at every point in a critical zone:
coverage_ok(point) = count(gateways where RSSI(point, gw) > -85 dBm) >= 2
A heatmap is just coverage_ok() evaluated on a grid and colored. The overlap factor trades gateway count for robustness; in a warehouse, 2x overlap typically needs 30–50% more gateways than 1x but eliminates the single-point failure.
Interference and co-channel load
BLE advertising shares 2.4 GHz with WiFi, Zigbee, and microwave ovens. You cannot avoid it, but you can reduce its bite:
- Use all three ADV channels; a WiFi AP on channel 1 mostly hurts ADV 37, channel 6 hurts 38, channel 11 hurts 39.
- Keep gateway WiFi radios on channels 1/6/11 and stagger them; never put a WiFi AP *on* a gateway’s antenna.
- Microwaves spike -60 dBm noise for 30 s — tags near a break room need closer gateways or a different band.
Capacity: how many Beacons per gateway
A gateway scanning at 100% duty hears roughly its airtime budget. With Beacon intervals of 500 ms and 31-byte packets, one Beacon occupies ~0.05% of airtime — so hundreds fit in theory. In practice, the gateway’s scan window and CPU parse rate cap it:
| Scan window | Beacons @ 500 ms interval | Notes |
|---|---|---|
| 50% | ~1500 | High CPU, more misses |
| 25% | ~800 | Balanced |
| 10% | ~300 | Safe, lower power |
Under-scanning a dense zone raises the miss probability (see the collision math in the advertising-density article). When in doubt, split the zone.
Calibrate per zone, not globally
The biggest survey mistake is one global n. A lobby is n=2.2; the freezer behind it is n=4.5. Measure n and sigma per zone during the walk test and store a per-zone model:
zone_model[zone_id] = fit_path_loss(sample_points_in_zone)
The gateway then localizes and flags low-confidence reads using the right exponent for where the tag actually is.
Validation before you sign off
After install, re-run the walk test with production Beacons at production Tx power. Accept the deployment only when:
- Detectability ≥ 99% at every coverage point,
- At least the target overlap factor holds in critical zones,
- No gateway shows a sustained miss rate above its budget.
A Beacon that passes the model but fails the field check is a planning error, not a hardware defect.
Field checklist
- [ ] Per-zone `n` and `sigma` measured, not assumed
- [ ] Metal racks/freezers flagged and mitigated
- [ ] Gateway antennas clear of metal, rotated channels
- [ ] 2x overlap in critical zones
- [ ] All 3 ADV channels sampled during survey
- [ ] Production Tx power used in final validation
- [ ] Miss-rate budget agreed and met
A Bluetooth Beacon network planned this way costs a little more in survey time and lands a lot cheaper in service calls. Measure first, mount once.