Mobile sale alerts

Get a push notification on your phone for every sale and refund across all your sites, with per-account toggles and a test button.

The RevKlik mobile app (iOS and Android) pings your phone the moment money moves, for every site you own or have been invited to, in one place. It also has an earnings view across all of your products.

What triggers an alert

Any revenue event that is not zero, stored from a verified source:

  • a sale (positive revenue) shows New sale · <site name>
  • a refund (negative revenue) shows Refund · <site name>

The message body reads <product or event name> · <amount> · net <net>. The amount is in the event’s own currency (IDR without decimals). The net part is left out when it equals the gross amount or is unknown. Tapping the notification opens the Earnings tab.

Only verified sources alert: the authenticated server events API (POST /api/v1/events/server) and the signature-verified Polar, Stripe, Lemon Squeezy, Midtrans, Xendit, DOKU, Mayar and Paywuz webhooks. Revenue sent by the browser tracker (/track) never alerts, because anyone who knows a site id can call that endpoint. A retried delivery of the same payment (same external_id or provider order) never alerts twice.

Who gets them

The site owner and every team member who accepted their invitation, as long as that person has signed in on the app (which registers the phone) and has the matching toggle on. Alerts are not gated on your plan: a lapsed account still hears about money arriving.

Turning alerts on and off

In the app, Settings has two switches, Sales and Refunds (both on by default), and a Send test notification button that pushes to every phone signed in to your account. Signing out removes that phone.

Self-hosting

Alerts go through the Expo push service, which relays to Apple and Google with the credentials of the app’s Expo project. Nothing to configure for the default setup. If you enable “enhanced push security” on the Expo project, set the EXPO_ACCESS_TOKEN secret on the Worker. The Worker’s */5 * * * * cron trigger retries failed sends and removes phones that no longer accept pushes, so keep it in your wrangler config.

API

All endpoints take a session token (Authorization: Bearer kp_...).

Method and pathBodyResult
POST /api/push/devices{ "expo_token", "platform": "ios" | "android", "locale?", "app_version?" }{ "success": true }
DELETE /api/push/devices{ "expo_token" }{ "success": true }
GET /api/push/prefs{ "sales": true, "refunds": true }
PUT /api/push/prefs{ "sales?": boolean, "refunds?": boolean }the saved prefs
POST /api/push/test{ "sent", "tickets" }

Registering a token that another account used before moves it to the current account.