Skip to content
FeaturesPricingAffiliateBlogHelpAboutContact
Get StartedSign In
Back to Blog
guides2026-08-018 min read

Geo-Triggered Push Promotions: Lunch Specials Within 200m Radius

How a 14-table Istanbul kofte spot sends sub-1-second push notifications to anyone within 200 meters at 11:30 daily — the Web Push API + Service Worker stack.

th

thMenu Team

thmenu.com

On a side street off Buyukdere Avenue in Istanbul's Maslak business district, the 14-table kofte spot "Halil Usta" sends a short notification to phones within 200 meters every weekday at 11:30: "Get here in 30 minutes for 15% off kofte today." No app to install. Anyone who scanned the menu QR before and granted permission receives it.

Before the system went live, lunch service averaged 38 covers. After the geo-push flow rolled out, 11:30–13:00 climbed to 51 covers — a 34% lift with zero printed flyers and zero extra payroll.

Why Web Push Skips the App Store

Native iOS and Android notifications require a separate app and store approval. The Web Push API plus a Service Worker grants permission directly in the browser as soon as a customer opens your menu page. One line — Notification.requestPermission() — is enough to ask.

Apple finally shipped Web Push to Safari and home-screen PWAs in iOS 16.4 in March 2023. Android Chrome has supported it since version 50. As of 2026 you reach roughly 92% of active smartphone users in Turkey through this single channel.

Any geo push notification restaurant 200m radius workflow has three layers: permission, subscription endpoint storage, and server-triggered fanout. Done right, end-to-end delivery is under one second.

Defining the 200m Geofence

The HTML5 Geolocation API returns the user's coordinates on demand, but browsers block continuous background tracking. The pragmatic workaround is to capture location once when the customer first opens the menu, store it, then check on the server with the Haversine formula whether they are inside the 200m circle before sending.

In our Maslak example the restaurant sits at 41.1075°N, 29.0188°E. 200 meters maps to roughly 0.0018° latitude and 0.0024° longitude at the 40th parallel. A Cloudflare Workers cron fires at 11:30, queries recent visitor coords, and pushes the offer to everyone in the radius. Total fanout latency: 600ms.

Permission UX and KVKK / GDPR Compliance

Turkey's KVKK (and GDPR more broadly) treat location as sensitive data. A simple "Allow / Block" modal is not enough — you must state the purpose, retention period, and triggering conditions in plain language.

Working template: "We use your location only to notify you about offers when you pass near the restaurant. Stored 30 days, revocable anytime." Keep it under 280 characters. One modal, one consent button, and a visible opt-out link in the menu footer.

For push bildirim restoran konum bazlı kampanya flows in Turkey, the KVKK aydınlatma metni must also surface the controller (business name), registered address, and a contact email. Put it behind the privacy link in the modal.

Notification Copy That Converts

Halil Usta's A/B tests landed on this shape: 36-character title, 65-character body, emoji + urgency in the CTA. Example: title "Got a lunch plan?" body "15% off kofte if you arrive in 30 min. Maslak. Your table is ready 🍽️".

Numbers from the same test: notifications without emoji ran a 4.2% CTR; with emoji 7.1%. Without an explicit time window, the average read happened 18 minutes after delivery; adding "30 min" pulled that down to 9 minutes. Time pressure works.

Frequency cap is non-negotiable: no more than 2 pushes per week per user. The third one rockets unsubscribe rates from 3% to 18%. thMenu's Pro+ tier enforces this by default; on roll-your-own setups you have to wire the limit yourself.

Service Worker Edge Cases You Will Hit

Three unclean states show up in real traffic. First: Safari Private Browsing wipes the subscription endpoint — those users silently drop off. Second: Android Doze mode can delay push by 4–6 hours. Third: certain mobile carriers in Turkey introduce 8–10 second FCM latency from DPI inspection.

Mitigation: poll delivery reports 5 minutes after dispatch. Healthy threshold is 85%+ delivered; below that, alert. thMenu surfaces this metric on the campaign dashboard automatically.

Step-by-Step Rollout

  1. Register a service worker on the menu page (5 minutes)
  2. Generate a VAPID keypair via web-push-libs.org
  3. Add KVKK / GDPR consent copy to the permission modal
  4. Run the first campaign as a 14-day A/B test
  5. Iterate copy if CTR is under 5% or arrival time exceeds 30 minutes
  6. If on thMenu Pro+, configure radius, time slots, and copy in Settings → Push Campaigns

FAQ

Which browser versions actually work? iOS 16.4+, Android Chrome 50+, macOS Safari 16+, all current Firefox. That's roughly 92% of Turkish smartphone users in 2026.

Does the customer have to keep a tab open? No. Service workers run in the background; pushes arrive even with the browser closed.

Is the user tracked continuously? No. Location is captured only when the user opens the menu page. No background tracking is allowed in browsers anyway.

How far out does geo-push remain effective? Practical ceiling is 1 km; beyond that CTR drops under 1%. 200–500m is the sweet spot.

Should I build this myself instead of using thMenu? For one location, a custom build is feasible. For 3+ branches or if you need ongoing KVKK / GDPR audit logging, a managed platform is usually cheaper end-to-end.

Found this helpful? Share it.