Skip to content

Subscriber Stores

Cryyer supports four subscriber store backends. Set the SUBSCRIBER_STORE environment variable to choose yours. Default is supabase.

StoreBest forFeatures
JSON FileLocal dev, small listsSimplest setup, file-based
GitHub GistPublic repos, small listsPrivate storage, no extra services
SupabaseProduction, dynamic listsFull CRUD, email logging
Google SheetsNon-technical teamsSpreadsheet UI, easy sharing

All stores implement the same interface:

  • getSubscribers(productId) — returns active subscribers for a product
  • recordEmailSent(email, productId) — logs a sent email
  • addSubscriber(email, productId, name?) — adds a new subscriber
  • removeSubscriber(email, productId) — unsubscribes someone

When using audiences, subscriber lookups use a compound key: productId:audienceId. For example, a subscriber to the beta audience of my-app would have "my-app:beta" in their product list. Products without audiences use the plain product ID as before.

Terminal window
# JSON (simplest)
SUBSCRIBER_STORE=json
# GitHub Gist (private storage for public repos)
SUBSCRIBER_STORE=gist
# Supabase (default, production-ready)
SUBSCRIBER_STORE=supabase
# Google Sheets (spreadsheet-based)
SUBSCRIBER_STORE=google-sheets