1. The premise
Most apps use a single notification profile, written by a developer who lives somewhere specific. If the developer commutes by subway, the geofence radius is tight. If the developer drives to work, the radius is wide. Whichever choice the developer made gets shipped to every user, regardless of whether the user is on the same kind of street.
This produces two failure modes that look opposite but share a cause:
- Urban users get false positives. A 500-meter geofence in Manhattan trips on every Starbucks within three avenues. The user gets seven alerts walking to lunch. They turn off notifications. The wallet falls silent forever.
- Rural users get false negatives. A 150-meter geofence on a country road never trips. The user passes the only Walmart in the county at 45mph and the wallet says nothing because the geometry doesn't allow time for the dwell timer to engage. The gift card expires unredeemed. The user assumes the app is broken.
Both failures come from the same engineering decision: pretending the world has one default. Smart Profiles rejects that pretense.
The neighborhood is part of the user, and a wallet that ignores the neighborhood is ignoring the user.
2. What a profile actually controls
Every Smart Profile bundles five tunable behaviors:
| Knob | Urban | Suburban | Rural | Smart |
|---|---|---|---|---|
| Geofence radius | 150m | 350m | 800m | re-tunes per movement |
| Dwell timer | 30s | 45s | 75s | re-tunes per movement |
| Quiet hours | 22:00–07:00 | 22:00–07:30 | 22:30–06:30 | adapts |
| Driving threshold | 25 mph | 35 mph | 45 mph | adapts |
| CarPlay default (planned, v2) | off | off | ON | recommends |
Radius and dwell are the two that matter most. They're the gates between "I happened to be near a place" and "I'm actually considering walking in." Set them wrong and every alert is either spam or silence.
The Smart preset doesn't lock these values; it picks new ones based on where you currently are. Drive from suburb to country and the radius widens during the drive. Walk into a city and it tightens. The user sees only the alerts they would have wanted at each location, the engineering work happens invisibly.
3. How the classifier works (privacy-first)
Smart needs to know what kind of place you're in. The naive implementation is "send your location to a server, ask what kind of neighborhood it is." That's a privacy violation dressed up as intelligence.
Step 1, Round before lookup
Before any classification call, the iOS app rounds your latitude and longitude to a 1km grid square. Times Square is at (40.7589, -73.9851); the grid cell is (40.75, -73.98). A half-mile in any direction lands in the same cell. The server never sees a finer-grained coordinate than that 1km square, and the rounding happens client-side, before the network call, so the fine-grained number doesn't even exist on the wire.
Step 2, Cache hit (most calls)
The server checks a density_cache table keyed on the grid cell. If another user in the same neighborhood already classified this cell within the last 90 days, the answer is returned instantly. Two users on the same block share the same answer, but neither appears in the other's request log, the cache is keyed on geometry, not identity.
Step 3, Cache miss → Claude classifier
On a miss, the server asks Claude Haiku to classify the grid cell by population density: urban, suburban, rural, or unknown. The prompt receives ONLY the rounded coordinate. Claude has no user ID, no card list, no purchase history. The classification returns one word, gets cached, and the request is gone.
Step 4, Profile-on-the-fly
The iOS app reads the answer and re-tunes the active profile. Urban → tighter rings, faster dwell. Rural → wider rings, longer dwell. The actual radius/dwell values live in WizardProfile.swift so they're version-controlled and auditable; the classifier just picks which preset to apply.
Step 5, Re-tune on travel
When the user moves more than 1km from their last classified cell, Smart fires a new lookup. The cached answer for the new cell is usually instant (someone else has been there); on first visit it's a single Anthropic call.
4. What the user sees
The notification wizard step labeled "Pick a profile that fits" shows four options:
- Smart, recommended for everyone. Adapts as you travel. Visually distinct in violet, separate from the brand-blue accent that other profiles use, so the recommendation reads as a different beat from the other choices.
- Urban, tight rings (150m), quick dwell (30s).
- Suburban, medium rings (350m), 45s dwell. Universal default for users who decline Smart.
- Rural, wide rings (800m), longer dwell (75s).
- Custom, drops the user into Advanced settings to tune every dial individually.
Every option shows a one-line plain-English explanation of how the alerts will feel. No engineering jargon. The words "geofence" and "dwell" never appear in the wizard copy, those are inside words.
A small explainer card sits above the four options answering "What's a profile?", three sentences explaining that a profile is a bundle of settings that controls when Cue can interrupt you, and that picking the right one means fewer interruptions worth tapping. The same explainer is reachable from Settings → Notifications via a tappable disclosure row, for users who skipped the wizard or want to revisit the question later.
5. Why this matters more than it sounds
Notification quality is binary. Either the user trusts the app enough to leave alerts on, or they don't. There's no "sometimes-on, sometimes-off" middle state in iOS, once a user disables notifications, the app's most useful feature is permanently severed from the user's attention.
Apps that fail the trust test do so the same way: they alert too often when the user is wrong-context. Three false positives in a row is enough; the user opens Settings, finds the toggle, flips it. They never look back.
Smart Profiles is the engineering work to NOT fail the trust test. Every alert that fires is one that survived the right preset for the location. Urban users don't get rural alerts. Rural users don't get urban silence. Both populations stay opted in, which is the only metric that matters.
6. The deeper philosophy
The Smart Profiles work expresses a thesis the team believes more broadly:
Apps should adjust to the user's environment, not the other way around.
The wallet that demands "open the app and check it before going shopping" is asking the user to manage the wallet's needs. The wallet that says "I noticed you walk to lunch on Tuesdays, here's the $50 Sweetgreen card before you walk past it" is managing its own needs.
Smart Profiles is one chunk of a larger pattern that runs through CardCue Pro, alongside the Notification Wizard, quiet zones, driving detection, and per-card daily caps. Together they make a wallet that lives quietly on your phone for months at a time, then says exactly one thing on the day a $50 card was about to expire, and gets it right.
7. What's next
The Smart classification today covers the four density buckets (urban / suburban / rural / unknown). Future iterations will add:
- Highway detection. A grid cell straddling a highway should apply rural rules during drive-time and suburban rules at rest.
- Tourist mode. Visiting a city different from the user's classified home cell should temporarily widen rings (the user doesn't know the neighborhood; alerts should err toward inclusion).
- Time-of-day modulation. A grid cell that's urban-by-day and suburban-by-night (downtown after 7pm, when foot traffic vanishes) could shift behavior with the clock.
None of these are launch features. They're the obvious next steps for a system whose foundation already works.
CardCue Pro, by Pika Product Lab LLC. Built on CoreLocation, Anthropic Haiku, and the belief that a notification should feel like a helpful friend, not a pushy salesperson.