Skip to content
Skip to content
Goodspeed

BUILT INTO EVERY GOODSPEED APP

Push Notifications (End-to-End)

The full push pipeline is pre-built: lazy permission prompt triggered at the 'aha moment', token registration to push_tokens, server-side fan-out via Expo Push API in batches of 100, automatic deletion of DeviceNotRegistered tokens, and per-category opt-out (transactional/product/marketing).

  • Tier: Common
  • Status: Config-toggled
  • Config: features.pushNotifications.enabled

WHY IT MATTERS

Most mobile app projects spend weeks plumbing the same infrastructure before writing a single line of product code. Push Notifications (End-to-End) is one of those cross-cutting concerns that every app eventually needs but almost none get right the first time. Permissions are handled incorrectly, tokens expire silently, or the feature breaks after an OS update nobody tested against.

Goodspeed solves this by shipping push notifications (end-to-end) as a production-grade, tested implementation inside every generated app. The code follows the patterns in the GAS template - the same 246-feature catalog that powers every app we build. Controlled by `features.pushNotifications.enabled` in gas.config.ts. You own the code from day one, can read every line, and can hire any React Native developer to extend it. The build pipeline verifies the feature compiles and routes resolve before the app lands in your repository, so you are not the one catching the integration error at 2 am before launch.

HOW IT IS WIRED

Real code from the GAS template

The excerpt below is lifted verbatim from lib/notifications.ts in the gas-template repository. This is the code your generated app gets, not pseudocode, not a description of intent.

// lib/notifications.ts — push token registration
export async function requestPermissionAndRegister(
  userId: string
): Promise<string | null> {
  if (isWeb || !ExpoNotifications || !Device) return null;
  if (!Device.isDevice) return null;

  const { status: existing } = await ExpoNotifications.getPermissionsAsync();
  const finalStatus =
    existing === 'granted'
      ? existing
      : (await ExpoNotifications.requestPermissionsAsync()).status;

  if (finalStatus !== 'granted') return null;

  // Create Android channels from gasConfig.features.pushNotifications.channels
  if (Platform.OS === 'android') {
    for (const channel of gasConfig.features.pushNotifications.channels) {
      await ExpoNotifications.setNotificationChannelAsync(channel, {
        name: channel.charAt(0).toUpperCase() + channel.slice(1),
        importance: ExpoNotifications.AndroidImportance.MAX,
      });
    }
  }

  const token = (await ExpoNotifications.getExpoPushTokenAsync()).data;

  // Upsert token into Supabase for server-side delivery
  await supabase.from('push_tokens').upsert({
    user_id: userId, token, platform: Platform.OS,
    updated_at: new Date().toISOString(),
  });
  return token;
}

Source: goodspeed-apps/gas-template lib/notifications.ts

HONEST LIMITS

When Push Notifications (End-to-End) is the wrong choice

If you need time-critical delivery guarantees (trading alerts, 911 dispatch), use a dedicated push provider with delivery receipts rather than Expo's best-effort API.

Tier: Common · Config-toggled

  1. Evaluate your use case

    Check whether push notifications (end-to-end) aligns with your target audience, platform constraints, and regulatory environment before enabling it.

  2. Audit the config

    The `features.pushNotifications.enabled` flag controls this feature. Set it to false in gas.config.ts to disable the feature entirely with no residual code paths.

  3. Seek alternatives

    If the built-in implementation does not fit, the generated codebase is standard React Native + Expo code. Any library in the Expo ecosystem can replace the default.

APPS USING THIS FEATURE

Apps built with Push Notifications (End-to-End)

These apps were generated by Goodspeed and use push notifications (end-to-end) as a core part of their experience. Each link goes to the full app marketing page.

CAPABILITIES

Push Notifications (End-to-End) capability breakdown

Concrete dimensions of what the built-in push notifications (end-to-end) implementation covers. These reflect the actual template code, not a marketing summary.

ItemDescriptionStrength
Permission modelRespects iOS and Android runtime permission status. Re-prompts via a priming screen before the OS dialog.iOS + Android
Token storageExpo push tokens are upserted to a Supabase push_tokens table keyed by user_id + platform.Supabase
Android channelsNotification channels are created from gasConfig.features.pushNotifications.channels at registration time.Config-driven
Local schedulingLocal notifications can be scheduled for arbitrary future timestamps without a server round-trip.Built in
Web supportAll notification functions are no-ops on web. The feature degrades gracefully to zero-error silent behavior.No-op on web

GET IT BUILT INTO YOUR APP

Score your idea and get push notifications (end-to-end) wired in from day one