Impulse AI Docs
Intern dokumentasjon
skipLink.label

Monitorering

Komplett oversikt over monitorering, logging, analytics, infrastrukturkostnader og rate limiting.

Observability-stack

heading.anchorLabel
Hva gikk galt? Hva gjoer brukerne?
┌─────────────┐ ┌────────────────┐
│ Sentry │ │ TelemetryDeck │
│ (errors) │ │ (analytics) │
└──────┬──────┘ └───────┬────────┘
│ │
┌──────────────────┼────────────────────────┼──────────┐
│ │ App │ │
│ ┌──────────────┴───┐ ┌───────┴───────┐ │
│ │ API (Fastify) │ │ iOS (SwiftUI) │ │
│ │ • Sentry (5xx) │ │ • Sentry │ │
│ │ • Pino (events) │ │ (crashes) │ │
│ │ • Queue errors │ │ • TelemetryDeck│ │
│ └────────┬─────────┘ │ (18 signals)│ │
│ │ └───────────────┘ │
│ ┌────────┴─────────┐ │
│ │ Railway │ │
│ │ (logs + metrics) │ │
│ └──────────────────┘ │
└──────────────────────────────────────────────────────┘
VerktoeyJobbLagKostnad
SentryErrors, crashes, ANRAPI + iOS$0 (5K events/mnd)
TelemetryDeckBrukeratferd, funnelsiOS$0 (100K signals/mnd)
Pino structured logsBusiness events, audit trailAPI → Railway$0
Railway MetricsCPU, memory, requestsInfrastruktur$0

Sentry — Error Monitoring

heading.anchorLabel
KildeFanges automatiskIgnoreres
API 5xx errorsJa4xx, validering, business errors
Queue final failures (etter 3 retries)JaRetry-forsoek
Queue worker errorsJa
Queue stalled jobsWarning
iOS crashesJa
iOS app hangs (>5s)Ja
iOS KMP bridge errorsSelektivt manueltNettverksfeil, forventede feil

Konfigurasjon

heading.anchorLabel
  • API: @sentry/node i Fastify. Init i apps/api/src/lib/sentry.ts
  • iOS: sentry-cocoa via SPM. Init i iosApp/Services/SentryService.swift
  • PII-scrubbing: Brukerinnhold (impulstekst, refleksjoner, notater) redigeres i beforeSend
  • Aktivert: Kun production (NODE_ENV=production for API, #if !DEBUG for iOS)
  • Sample rates: sampleRate=1.0, tracesSampleRate=0, profilesSampleRate=0

Viktige filer

heading.anchorLabel

API:

FilHva
src/lib/sentry.tsConfig, PII scrubbing, hjelpefunksjoner
src/server.tsFoerste import, Fastify-integrasjon, shutdown flush
src/middleware/error-handler.tsKun 5xx-fangst
src/middleware/auth.tsUser context (userId, tier)
src/queues/base/bullmq-job-queue.tsFinal failures, worker errors, stalled jobs

iOS:

FilHva
Services/SentryService.swiftConfig, PII scrubbing, hjelpefunksjoner
ImpulseApp.swiftInit (foer KMP), user context etter auth
ContentView.swiftTab navigation breadcrumbs
Stores/KMPStoreProvider.swiftError bridge, clear user paa logout

Environment-variabler

heading.anchorLabel
VariabelHvorKilde
SENTRY_DSNRailway (Doppler)Sentry project settings (im-api)
RAILWAY_GIT_COMMIT_SHARailwayAutomatisk
DSN (iOS)Hardkodet i SentryService.swiftSentry project settings (im-ios)

TelemetryDeck — User Analytics

heading.anchorLabel

Privacy-first, GDPR-compliant (ingen samtykke-dialog noedvendig). Signals sendes kun fra iOS.

Signals (18 totalt)

heading.anchorLabel

Konverteringsflow (8):

SignalParametereTrigger
app.launchedApp start
onboarding.completedpersonalizedOnboarding ferdig
onboarding.skippedOnboarding hoppet over
impulse.capturedclassification, sourceImpuls opprettet
session.startedclassificationSesjon startet
session.completedclassification, durationSecondsAlle 5 steg fullfoert
session.abandonedclassification, lastStepSesjon avbrutt
checkin.completedoutcomeAI-vurdering mottatt

Monetisering (5):

SignalParametereTrigger
paywall.showntriggerPaywall vist
paywall.dismissedtriggerPaywall lukket uten kjoep
purchase.completedtier, fromTrialStoreKit-kjoep vellykket
purchase.failedtier, errorTypeStoreKit-kjoep feilet
trial.expiredTrial utloept uten konvertering

Engasjement (2):

SignalParametereTrigger
journey.searchedSoek brukt i Journey
feedback.submittedhasRatingFeedback sendt

Konfigurasjon:

  • Fil: iosApp/Services/Analytics.swift
  • App ID: CE8DB336-B6B9-4B6A-A725-915EE4B2E24F
  • Test mode: true i DEBUG builds (filtreres i dashboard)
  • Signal-budsjett: ~3-5/dag per bruker (100K signals/mnd gratis = ~800 MAU)

Pino Business Events — API Structured Logging

heading.anchorLabel

Business events logges til Railway via Pino. Soekbart paa event-feltet.

Events (14 totalt)

heading.anchorLabel
Revenue:
subscription.trial_started — Trial startet
subscription.converted — Trial → betalt
subscription.churned — Abonnement utloept/kansellert
Kjerneaktivitet:
impulse.created — Impuls fanget
impulse.classified — AI-klassifisering fullfoert
impulse.resolved — Impuls markert som resolved
session.started — Sesjon startet
session.completed — Sesjon fullfoert
Feature adoption:
checkin.completed — Sjekk-inn vurdering ferdig
checkin.converted — Sjekk-inn → impuls
Verdilevering:
insights.regenerated — Innsiktsprodukter oppdatert
Kostnad:
ai.tokens.used — AI token-forbruk (brukerrettede workloads)
Churn & sentiment:
account.deleted — Konto permanent slettet
feedback.submitted — Brukertilbakemelding sendt

Format:

{
"level": "info",
"event": "session.completed",
"userId": "uuid",
"sessionId": "uuid",
"msg": "Business event"
}

Filter i Railway logs: soek etter "Business event" eller spesifikt "event": "session.completed".

Hva som IKKE logges

heading.anchorLabel
  • CRUD-operasjoner (arkiver, oppdater, slett)
  • Leseoperasjoner (list, get, view)
  • Hoeyfrekvente events (scroll, tap, navigasjon)
  • Interne AI-workloads (distillation, narrative, pulse) — sporet i DB, ikke logger
  • Brukerinnhold (PII scrubbed)

Logging-standarder

heading.anchorLabel
LagProduksjonUtvikling
API (Pino)Strukturert JSON til stdout → Railway logsPretty-printed med pino-pretty
iOS (AppLogger)Kun error() og warning()debug() tilgjengelig
KMP (Logger)LogLevel.WARNLogLevel.INFO

Rate Limiting

heading.anchorLabel

Tre nivaaer av rate limiting, drevet av Redis (fallback til in-memory):

TypeGrenseTidsvinduEndepunkter
Global100 requests1 minuttAlle
AI20 requests1 minuttAI-endepunkter
GET200 requests1 minuttLeseoperasjoner

Verdiene kan overstyres via environment-variabler:

  • RATE_LIMIT_GLOBAL_MAX (default: 100)
  • RATE_LIMIT_AI_MAX (default: 20)
  • RATE_LIMIT_GET_MAX (default: 200)
  • RATE_LIMIT_TIME_WINDOW (default: “1 minute”)

Abuse detection

heading.anchorLabel

Brukere som treffer 429-grensen 10+ ganger innen 5 minutter rapporteres automatisk til Sentry som RateLimitAbuse. Cooldown paa 15 minutter foer re-rapportering.

Response headers

heading.anchorLabel

Alle responses inkluderer rate limit headers:

  • X-RateLimit-Limit
  • X-RateLimit-Remaining
  • X-RateLimit-Reset
  • Retry-After (kun ved 429)

AI-kostnadsmodell

heading.anchorLabel

~$0.056 per sesjonssyklus (klassifisering + 5 steg guidance + summary).

Per aktiv bruker per maaned

heading.anchorLabel
BrukereAI/bruker/mndReduksjonMekanisme
10K$0.38Ingen caching
100K$0.25-35%Prompt caching
1M$0.18-28%Batch API + caching

AI-kostnad utgjoer ~9% av revenue (blandet paa tvers av tiers).

Infrastrukturkostnader

heading.anchorLabel

Naavaerende drift (~$38-53/mnd)

heading.anchorLabel
TjenesteStagingProdTotalt
SupabaseGratis$25/mnd$25/mnd
Railway (API + Redis)Inkludert$5-20/mnd$5-20/mnd
VercelGratisGratis$0
GitHub Actions2000 min/mnd gratisInkludert$0
SentryGratis (5K events)$0
TelemetryDeckGratis (100K signals)$0
Apple Developer$99/aar$8/mnd

Skaleringsgrenser

heading.anchorLabel
BrukereFlaskehalsTiltakEkstra kostnad
0-10KIngentingNaavaerende oppsett$0/mnd
10K-50KSentry + TelemetryDeck gratis-tierOppgrader begge~$35/mnd
50K-200KRailway single instanceSkaler til 3 instanser~$30/mnd
200K-500KSupabase connectionsOppgrader til Team plan~$300/mnd
500K-1MAnthropic rate limitsVolumavtale med AnthropicVarierer

Observability-kostnad per MAU

heading.anchorLabel
MAUSentryTelemetryDeckTotalt
1K$0$0$0
5K$0$0$0
7K$26/mnd~$19/mnd~$47/mnd
10K$26/mnd~$19/mnd~$47/mnd

Begge verktoeyen forblir gratis til ~5-7K MAU.

Nyttige lenker

heading.anchorLabel
TjenesteDashboardStatus
Railwayrailway.appstatus.railway.app
Supabasesupabase.com/dashboardstatus.supabase.com
Anthropicconsole.anthropic.comstatus.anthropic.com
Sentrysentry.iostatus.sentry.io
TelemetryDeckdashboard.telemetrydeck.com
App Store Connectappstoreconnect.apple.comdeveloper.apple.com/system-status