Why iBeacon on iOS produces false positives
iBeacon on iOS is not a beacon that "knows" distance, but a chain of transformations: the app receives the signal level, the system smooths it over a sliding window, and from the smoothed value derives an approximate distance and zone.
Each layer introduces error, so the "guest entered" event does not arrive where and when the scenario expects it.
Signal attenuation is nonlinear: right next to the beacon the level changes violently, while at the far edge of the zone the difference between "inside" and "outside" is almost imperceptible against the noise.
The owner's body, phone orientation in hand, humidity, and metal in the wall shift the value — at the same point the app gets a different distance.
Reflections from display windows, racks, and partitions add multipath: the level briefly spikes, and the system decides the person has come right up close, though they are at the other end of the sales floor.
Averaging distance smooths noise but pays with delay, and with a single entry/exit threshold a guest at the zone boundary generates dozens of events — the very in/out chatter.
Hysteresis with two thresholds, a time hold, and accounting for movement speed rather than the instantaneous value help.
In the background only region monitoring works, ranging is disabled: events arrive with a delay and in batches, an "exit" may arrive after the person has already returned to the zone, and the number of simultaneously tracked regions is limited by the system.
A scenario that worked perfectly on the desk falls apart at the site — we explain how this is addressed at the project level.
What stable proximity detection in the app delivers
Proximity detection in an iOS app is built on an iBeacon region: the system keeps monitoring in the background and wakes the app when a boundary is crossed, while inside the zone ranging by signal level works.
The first-trigger delay is not a property of the beacon, but a consequence of region configuration and entry thresholds. With correct calibration of signal power per meter, the event arrives 1–2 seconds after entering the zone instead of 10–15 in the first version.
False events are almost always born at the boundary, where the signal level fluctuates around the threshold due to reflections from walls, metal shelving, and glass.
We separate entry and exit thresholds (hysteresis) and confirm an event with a series of measurements rather than one. The share of false positives drops from tens of percent to single digits, and "chatter" between neighboring zones disappears.
Zone stability near walls and shelving comes from beacon placement, not their power: overlap of neighboring zones, height and orientation, radius limitation so the display window does not "shine" into the aisle.
Before release, we walk the points with a signal-level map and record actual boundaries — this is cheaper than chasing complaints on the sales floor.
The number of support requests falls primarily due to the eliminated class of failures: "did not trigger" and "triggered in the wrong zone." Processing logic and the event queue live on the device: loss of connectivity does not turn into a missed interaction, and events arrive after network restoration.
We calculate latency, false-positive rate, and requests from the app's own events — degradation is visible earlier than users notice it.
iBeacon formats on iOS: modes and limitations
In iBeacon on iOS, proximity is built with two mechanisms, and the choice here is not "which is better," but which is permissible in the scenario.
Monitoring mode holds declared regions and sends an entry or exit event, including when the app is minimized; presence mode gives distance to the tag, but lives only while the app is active on screen.
The system polls the air rarely in the background: an event may arrive with a delay, and the number of simultaneously tracked zones is capped. A room with a hundred tags cannot be covered directly this way — zones are grouped or the logic is moved to the server.
| Option | When it fits | What it cannot do |
|---|---|---|
| Region monitoring | Scenario starts on entry or exit, including from the background: notification, pickup, shift checklist | Does not provide distance — only "inside" or "outside," and the zone boundary drifts near walls and metal |
| Presence mode | Need a proximity scale: shelf hint, indoor navigation | Turns off when the app is minimized; distance is an estimate and depends on the phone body and orientation |
| Tags with sensors | Need telemetry beyond proximity: temperature, motion, enclosure tampering | Packet payload is small — you need your own data parsing and tag battery monitoring |
| Manual confirmation | Need a guarantee that the person is actually on site: check-in, reporting, warehouse | Is not automated and does not provide distance — only the fact of user confirmation |
We keep manual confirmation as a fallback for disputed cases: it does not replace proximity, but it closes reporting where automation cannot be trusted.
Implementation order: point survey, configuration, verification
The work order is structured so that scenarios do not have to be redone after tag installation: first we record room geometry and the real physics of the signal, then configure thresholds, and only then test behavior with people.
Each stage ends with an artifact — a diagram, configuration, or measurement protocol, not a verbal agreement.
- Premises survey — we walk user routes and measure the signal level at control points. We mark metal, glass display windows, refrigeration equipment, and partitions: these are what create reflections and "floating" zones.
- Tag placement map — a diagram tied to the floor plan: installation points, height and orientation, spacing between tags. We calculate zone overlap in advance so transitions between them are predictable and do not depend on how a person turns their phone.
- Configuration of trigger rules — thresholds by signal level and hysteresis so the zone does not "shiver" at the boundary; hold time and delay before display; zone priority when overlapping. Separate rules for entry, being inside, and exit.
- Background behavior and permissions — we check access requests to Bluetooth and location, restoration of monitoring after a cold start and device reboot. Without this, the scenario works in a demo and stays silent in real operation.
- Acceptance checks — running scenarios along routes: share of correct triggers, time to first event, number of false transitions between zones. Measurements on different device models and at peak hours, when the air is noisy.
- Handover to operation — we provide the configuration, tag map, battery replacement schedule, and diagnostic checklist. After that, scenarios are edited in settings, without rebuilding the app.
This order removes the main project risk — tags are already installed, but app behavior does not match the intended scenario.
Scope of delivery: configurations, diagrams, and maintenance procedures
Implementation is considered complete not when the beacons broadcast a signal, but when your team can maintain the system without us.
Therefore all settings, diagrams, and agreements are recorded in artifacts — with them, a new point is added by your in-house engineer, not a contractor on a separate request.
- Tag registry — a single table with all installed beacons: identifiers, room assignment, installation date, responsible person, battery status, and planned replacement.
- Placement diagrams — floor plans with actual installation points and marked reliable-reception zones, so a new tag is placed in a verified location rather than by eye.
- Tag-to-scenario mapping — which beacon triggers which action in the iOS app, where zone boundaries run, and what margin is included so the event does not trigger in bursts at the edge.
- Event access policies — which employees change scenarios, who sees only statistics, how rights are granted and revoked, and what goes into the action log.
- Scenario documentation — a description of each user journey: trigger conditions, priority when two zones conflict, behavior with the wireless module disabled and in the background.
- Point maintenance procedure — inspection frequency, battery and tag integrity checks, replacement and recalibration procedure, and response times for deviations.
- New point deployment procedure — step-by-step instructions from installation to verification, so expanding coverage remains a routine task.
- Acceptance protocol and limitations log — what has been checked on the bench and in the field, which conditions reduce accuracy, and how this affects the scenario.
Each document is kept in your repository or knowledge base and updated as changes occur. Describe the task — we will come back with an estimate and plan, including the composition of these artifacts for your site.
Case study: reduced false positives in a sales floor
A chain of sales floors with several dozen points came with a task typical for iBeacon iOS: the app shows a product card when a customer approaches a display window and stays silent the rest of the time.
We had already used Apple technology in similar projects, so we expected predictable behavior — but in real sales floors the zones worked differently.
Initial situation
The share of false positives reached 38%: the card popped up at the entrance and at checkout counters where there are no beacons — the signal passed through walls and shelving.
A new point went live in 6–9 days: the beacon was configured manually and checked by walking the sales floor. Support received 20–25 requests per week — "zone did not trigger," "opened twice."
What we changed
- We calculate thresholds by hold time rather than a one-off spike: the card opens only with stable proximity to the display window.
- We calibrate each beacon for the geometry of a specific sales floor and tie it to the room plan — instead of one value for the entire chain.
- We introduced a remote point registry: a new display window is described by configuration, without rebuilding and re-approving the app.
False positives fell from 38% to 4%, and launching a new point was reduced from 6–9 days to one business day — the configuration goes to the sales floor along with beacon installation.
Support requests dropped to 4–5 per week, and almost all are about battery replacement, not zone logic.
Rolling back to previous thresholds takes minutes: the configuration is versioned, so experiments with new scenarios go ahead without risk to the sales floor and without an engineer visit.
What to do if the app already uses geofences?
Yes, both mechanisms coexist peacefully in one app — they operate at different scales.
A geofence provides the fact that "the user is in the zone" with accuracy down to hundreds of meters and triggers on entry and exit; a tag determines proximity to a specific point within tens of meters.
The conflict arises not in the system but in the code: two independent event streams trigger one scenario, and it fires twice.
The solution is a common event layer. Each trigger is normalized into a single event with source type, point identifier, and confidence score, and scenarios subscribe to this stream rather than to a specific mechanism.
We build the layer on native Apple tools, without third-party services or additional hardware — everything is calculated on the device.
| Option | When it fits | Limitations |
|---|---|---|
| Two independent streams | scenarios do not intersect | duplicates at zone boundaries, logic diverges |
| Common event layer | the app is already large, we are adding points | source priority rules are needed |
| Gradual migration by scenario | zones are known, precise proximity is needed | transition period, both sources are active |
| Full transition to tags | all points are equipped with tags | without a tag the scenario stays silent, a geofence fallback is needed |
We set source priority explicitly: when times coincide, the tag event wins as more reliable; the geofence remains confirmation and a safety net if the tag was not read.
Migration proceeds one scenario per release — first we move the most valuable one, compare trigger statistics, then shut down the duplicate branch in geofences. Rollback is returning the scenario to its previous source without rebuilding the logic.
Technical concerns: polling frequency, batteries, background operation
Before starting, the same questions usually come up: how often to poll tags, what about batteries, how the app behaves in the background, and whether the scenario can be changed without a new release.
All of them are resolved at the architecture level, not by tweaking parameters after launch — so we verify the answers below before the first line of code.
How often should tags be polled so as not to drain the phone battery?
The frequency is tied to the task, not set once and for all. On entering a zone, infrequent polling is enough, while continuous proximity measurement is enabled only on the required screen and muted when going to the background. Energy consumption drops by an order of magnitude, and the scenario is not lost.
Will the app work in the background?
Yes, but according to system rules. Background mode delivers entry and exit events for a zone, not a continuous stream of measurements.
We show accuracy in meters when the app is active — this way the system will not unload the process and will not show the user an extra permission request.
How long do iBeacon tags last?
Tag service life depends on the advertising interval and signal power: with infrequent advertising it works for years.
We include a battery replacement procedure in the project, and the identifier is tied to the point, not to a specific device — replacing the tag does not break the scenario logic.
Can the scenario be changed without rebuilding the app?
We move zones, identifiers, trigger rules, and texts into a remote configuration that the client fetches at launch. A new store, moving tags, or editing logic is a data update, not a new version release in the app store and not waiting for review.
Let's discuss the task: we'll review scenarios and come back with a plan
For the estimate to be based on the actual scope of work rather than guesses, we need to go through several points together.
iBeacon on iOS works on top of regions and permissions, so the behavior scenario and beacon placement scheme determine the app architecture more than the interface. Below is a list of questions that we close during the task discussion.
- List of points and zones: where beacons are located, how many there are, what the trigger radius is, and where zones overlap — this determines the region map and the logic of switching between them.
- Event scenarios: what happens on entering a zone, on hold, and on exit — notification, screen, history entry, server action.
- Background and closed-app behavior: which permissions we request, what we do if they are denied, how the app recovers after a system restart.
- Accuracy calibration: signal power, trigger thresholds and hysteresis, so the zone does not "chatter" at the boundary and the guest does not receive two notifications in a row.
- Beacon owner: installation, battery replacement, identifier registry, who updates the configuration when a point moves.
- Integration with the accounting system and analytics: which events we log, in what form they go to the server, what the customer sees in reports.
- Acceptance criteria: how many zones we check, at what distance, what share of correct triggers is considered normal, and how quickly the response arrives.
Describe the task and answer the points that are already known — we will come back with an estimate and a phased work plan, with fixed acceptance criteria.







