Configuring OAuth & Third-Party Integrations
When you run create-stackr, the CLI auto-fills every secret it can generate
itself — the database and Redis passwords, and the 64-character hex
BETTER_AUTH_SECRET. Those are ready to use the moment init finishes.
Third-party secrets are different: stackr can't invent a Google client ID or a
RevenueCat API key for you. Those land in your .env and app.json files as
placeholders (for example YOUR_GOOGLE_WEB_CLIENT_ID) that you replace with
real values from each provider's dashboard.
Find what's still unconfigured
Rather than grepping for placeholder strings by hand, run the config command.
It reports every integration that is enabled for your monorepo but still
holding a placeholder:
npx stackr configTo fill the values in without hand-editing files, run it interactively — it
prompts for each unconfigured field and writes the value back to the right
.env or app.json:
npx stackr config --interactiveOnly what you enabled
stackr config only reports integrations that are actually turned
on for a service — Google OAuth only if you enabled the Google provider, the
mobile SDKs only if that service has a mobile app. Disabled integrations are
never flagged as unconfigured.
The rest of this page walks through where each integration's values live and how to obtain them from the provider.
Google OAuth
The web client ID and secret live in the auth service's backend/.env. The
iOS and Android client IDs are configured separately in mobile/app.json under
extra.googleOAuth.
| Variable | Where | Purpose |
|---|---|---|
| GOOGLE_WEB_CLIENT_ID | auth backend/.env | ID token audience verification on the backend |
| GOOGLE_CLIENT_SECRET | auth backend/.env | Backend token exchange |
Dashboard: console.cloud.google.com
- Open the Google Cloud Console.
- Create OAuth 2.0 credentials for Web, iOS, and Android.
- Copy the Web client ID into
GOOGLE_WEB_CLIENT_IDand the client secret intoGOOGLE_CLIENT_SECRETin the backend.env. - iOS and Android client IDs are configured in
mobile/app.jsonunderextra.googleOAuth.
GOOGLE_WEB_CLIENT_ID=1234567890-abcdefg.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-your-real-secretApple Sign In
Apple's values all live in the auth service's backend/.env.
| Variable | Where | Purpose |
|---|---|---|
| APPLE_SERVICE_ID | auth backend/.env | The web OAuth flow |
| APPLE_BUNDLE_ID | auth backend/.env | Native iOS ID token verification (must match your app) |
| APPLE_CLIENT_SECRET | auth backend/.env | JWT signed with your Apple private key |
Dashboard: developer.apple.com
- Open the Apple Developer portal.
- Create a Service ID for the web OAuth flow and set
APPLE_SERVICE_ID. - Set
APPLE_BUNDLE_IDto your app bundle id for native iOS ID token verification. - Generate a client secret JWT signed with your Apple private key and set
APPLE_CLIENT_SECRET.
The Apple client secret expires
APPLE_CLIENT_SECRET is a JWT that expires every 180
days. Set a reminder to regenerate and redeploy it before it lapses,
or Apple Sign In will start failing.
GitHub OAuth
Both GitHub values live in the auth service's backend/.env.
| Variable | Where | Purpose |
|---|---|---|
| GITHUB_CLIENT_ID | auth backend/.env | OAuth app client ID |
| GITHUB_CLIENT_SECRET | auth backend/.env | OAuth app client secret |
Dashboard: github.com/settings/developers
- Open GitHub Developer settings and register a new OAuth app.
- Copy the client ID into
GITHUB_CLIENT_IDin the backend.env. - Generate a client secret and copy it into
GITHUB_CLIENT_SECRET.
Email (SMTP)
Email verification and password reset both send mail through SMTP. The
credentials live in the auth service's backend/.env, and the template
defaults to Gmail (smtp.gmail.com:587).
| Variable | Where | Purpose |
|---|---|---|
| SMTP_USER | auth backend/.env | The sending account |
| SMTP_PASS | auth backend/.env | SMTP password (Gmail: an app password) |
| EMAIL_FROM | auth backend/.env | The from address shown to recipients |
Dashboard: Gmail app passwords
- Choose an SMTP provider (the template defaults to Gmail at
smtp.gmail.com:587). - For Gmail, create an app password and set it as
SMTP_PASS. - Set
SMTP_USERto the sending account andEMAIL_FROMto the from address.
SMTP_USER=notifications@yourcompany.com
SMTP_PASS=your-app-password
EMAIL_FROM=notifications@yourcompany.comDon't use your account password
For Gmail, SMTP_PASS must be an
app password,
not your normal account password — accounts with 2FA reject the latter for
SMTP.
Mobile SDKs
The mobile integrations store their keys in mobile/app.json under extra.*
rather than in .env, because Expo embeds them into the native build via
expo-constants. After changing any of these, rebuild the app so the new
values are picked up.
RevenueCat
| Field | Where | Purpose |
|---|---|---|
| extra.revenueCat.iosKey | mobile/app.json | iOS public API key |
| extra.revenueCat.androidKey | mobile/app.json | Android public API key |
Dashboard: app.revenuecat.com
- Open the RevenueCat dashboard and create a project.
- Copy the iOS public API key into
extra.revenueCat.iosKeyinmobile/app.json. - Copy the Android public API key into
extra.revenueCat.androidKeyinmobile/app.json. - Rebuild the app so the keys are embedded via
expo-constants.
{
"expo": {
"extra": {
"revenueCat": {
"iosKey": "appl_yourRealIosKey",
"androidKey": "goog_yourRealAndroidKey"
}
}
}
}Adjust
| Field | Where | Purpose |
|---|---|---|
| extra.adjust.appToken | mobile/app.json | Adjust app token |
| extra.adjust.environment | mobile/app.json | "sandbox" while testing, "production" for release |
Dashboard: dash.adjust.com
- Open the Adjust dashboard and create an app.
- Copy the app token into
extra.adjust.appTokeninmobile/app.json. - Set
extra.adjust.environmentto"sandbox"while testing and"production"for release. - Rebuild the app so the values are embedded via
expo-constants.
App Tracking Transparency is a toggle, not a secret
ATT has no key to fill in — it's a build-time toggle on the mobile service,
not a third-party credential. Enable or disable it when you generate the
mobile app; there's nothing for stackr config to report.