---
title: "Notifications"
description: "In-app notification types, preferences, and delivery channels — including GAME_REQUEST / GAME_UPDATED for Peer Games"
locale: "en"
---
# Notification System

> **Info**
> Use **Founder** / **Developer** tabs in the docs sidebar. Deep FCM setup lives on [Push Notifications (FCM)](/docs/features/push-notifications-fcm.md).

Ring delivers in-app and push notifications for opportunities, messages, entity updates, wallet events, and **peer-game challenges**.

## Verified notification types (partial)

| Type | Purpose |
|------|---------|
| `OPPORTUNITY` | New opportunities and applications |
| `MESSAGE` | New messages and conversations |
| `ENTITY` | Entity updates and invitations |
| `SYSTEM` | Platform announcements |
| `WALLET` | Transaction and balance notifications |
| `GAME_REQUEST` | Peer-game challenge in chat (`game_request`) |
| `GAME_UPDATED` | Game accepted / finished updates |
| `CALL_INVITE` | Incoming WebRTC call when the callee tab is hidden or closed |

`GAME_*` types appear in notification preferences UI and interactive notify (`features/chat/lib/interactive-notify.ts`). Offline FCM for game invites: after `!deliveredLive`, `createInvite` waits ~500ms and rechecks `getTunnelHub().isUserConnected(peer)` before `NotificationType.GAME_REQUEST` + FCM (not the call ringtone). Hub presence is process-local today — multi-pod false offline is backlog. See [Peer Games](/docs/features/peer-games.md).

### Delivery channels

- **In-app** — Tunnel `notifications:inbox` / bell UI
- **Push (FCM + RFC dual-stack, shipped)** — [Push Notifications with FCM](/docs/features/push-notifications-fcm.md). Chrome uses Firebase Console Web Push **certificate** (`getFcmVapidKey()` / `NEXT_PUBLIC_FIREBASE_VAPID_KEY`) → `fcm_tokens`. Safari / empty PushManager uses dedicated `VAPID_*` → `push_subscriptions`. Server PUSH fans out both tables; empty RFC on Chrome is a no-op, not a second delivery.
- **Email / SMS** — preference-gated where wired

### User preferences

Granular enable/disable by type and channel, including quiet hours — see preferences components under `features/notifications/`.

## Related documentation

  
- [features/push-notifications-fcm](/docs/features/push-notifications-fcm.md) — Deep-dive: per-user FCM + RFC fan-out, iOS Home Screen, and empty RFC-on-Chrome no-op.

  
- [features/webrtc-calls](/docs/features/webrtc-calls.md) — Same-workflow: CALL_INVITE uses the same PUSH channel (90s TTL, data-only FCM).

  
- [features/peer-games](/docs/features/peer-games.md) — Same-workflow: GAME_REQUEST / GAME_UPDATED for challenges and session updates.

  
- [features/tunnel-protocol](/docs/features/tunnel-protocol.md) — Depends-on: live inbox fan-out on notifications:* channels.

  
- [features/messaging](/docs/features/messaging.md) — See-also: interactive notify kit that emits typed notifications.

  Broader notifications triggers and preferences API docs are still expanding; treat the type table above as the verified Peer Games addendum.
