- Accordion
- Action Sheet
- Alert Dialog
- Alert
- Audio Player
- Audio Recorder
- Audio Waveform
- Avatar
- AvoidKeyboard
- Badge
- BottomSheet
- Button
- Camera Preview
- Camera
- Card
- Carousel
- Checkbox
- Collapsible
- Color Picker
- Combobox
- Date Picker
- File Picker
- Gallery
- Hello Wave
- Icon
- Image
- Input OTP
- Input
- Link
- MediaPicker
- Mode Toggle
- Onboarding
- ParallaxScrollView
- Picker
- Popover
- Progress
- Radio
- ScrollView
- SearchBar
- Separator
- Share
- Sheet
- Skeleton
- Spinner
- Switch
- Table
- Tabs
- Text
- Toast
- Toggle
- Video
- View
The starter's Google button works as soon as the provider is configured on your Convex deployment. No code changes — it shares the browser flow with Apple.
Before you start
- A Google account. Any account works; you do not need a paid plan or a verified domain to sign in during development.
- A Convex deployment, so you have an HTTP Actions URL to point Google at.
npx convex dev --onceis enough — see the auth installation guide.
Create the OAuth client
Create or select a Google Cloud project
- Open the Google Cloud console and click Select a project in the top bar.
- Click New project in the dialog.
- Give the project a name. This one is internal — your users never see it.
- Click Create and wait for it to finish provisioning.
- Click Select a project again.
- Pick the project you just created.





Open the Google Auth Platform
- From Quick access, click APIs & Services.
- In the left navigation, click OAuth consent screen.
- Click Get started.



Fill in the app information
- App name — this one is shown to users on the consent screen.
- User support email — pick one from the dropdown.
- Click Next.

Choose the audience
- Pick External unless this is a Workspace-only app. Internal is limited to accounts in your organization.
- Click Next.

While the app is in Testing, only accounts you list under Audience → Test users can sign in — everyone else gets "access blocked." Add your own account there before you try the flow, and publish the app before you launch.
Add contact information and create the configuration
- Enter one or more email addresses. Google uses these to notify you about project changes.
- Click Next.
- Check I agree to the Google API Services: User Data Policy.
- Click Continue.
- Click Create.


Create the OAuth client
- In the left navigation, click Clients.
- Click Create client.
- Set Application type to Web application. Web, not Android or iOS: the browser flow authenticates against Convex's HTTP Actions endpoint, which is a web endpoint.
- Give the client a name. This one is only used to identify it in the console.



Find your Convex HTTP Actions URL
Leave that tab open and switch to the Convex dashboard.
- Open Settings.
- Open URL & Deploy Key.
- Copy the HTTP Actions URL. It ends in
.site.

Every Convex deployment has two URLs: *.convex.cloud for the client SDK, and
*.convex.site for HTTP Actions — which is what serves the OAuth callback.
Pasting the .cloud URL into Google's redirect URI is the single most common
cause of redirect_uri_mismatch here.
Add the authorized redirect URI
Back in the Google console:
- Under Authorized redirect URIs, click Add URI.
- Paste the HTTP Actions URL and append
/api/auth/callback/google. - Click Create.
{HTTP_ACTIONS_URL}/api/auth/callback/google
For example, if your HTTP Actions URL is https://fast-horse-123.convex.site:
https://fast-horse-123.convex.site/api/auth/callback/google
Authorized JavaScript origins can stay empty. The starter's flow never
calls Google from a browser origin you control — it hands off to Convex's
.site endpoint, which is already covered by the redirect URI.

Copy the client ID and secret
- Copy the Client ID from the confirmation dialog, then click OK.
- Back on the Clients list, click the client you just made.
- Under Client secrets, use the existing secret or click Add secret.
- Copy the Client secret.
Google no longer lets you view a secret after you leave the page, so copy it now — if you lose it, add a new one and delete the old.



Set the environment variables
From your project directory:
pnpm dlx convex env set AUTH_GOOGLE_ID your_client_id npx convex env set AUTH_GOOGLE_SECRET your_client_secret
- Or paste them into the Convex dashboard under Settings → Environment Variables and click Save All.

The deep-link scheme
One more variable, and the one people forget: EXPO_URL is your app's
deep-link scheme, and it is what lets Convex redirect back into the app after
Google hands the browser back. It has to match the scheme in your app.json.
pnpm dlx convex env set EXPO_URL my-app://
Without it the browser sheet closes and nothing happens — see the redirect allow-list.
Test it
pnpm dlx expo start
Tap Login with Google. A browser sheet opens, you pick an account, and it closes; the session lands and you're routed into the app.
What the starter does
const redirectTo = makeRedirectUri();
const { redirect } = await signIn('google', { redirectTo });
if (Platform.OS === 'web') return;
const result = await openAuthSessionAsync(redirect!.toString(), redirectTo);
if (result.type === 'success') {
const code = new URL(result.url).searchParams.get('code')!;
await signIn('google', { code });
}signIn('google', { redirectTo }) kicks off the flow and hands back the URL
to open; the second signIn call, with the code Google returned, is what
actually completes it. See authentication for how
Apple reuses the same shape.
When it does not work
| What you see | Usually |
|---|---|
redirect_uri_mismatch | The .cloud URL was used instead of .site, or the path has a typo |
| Browser closes, nothing happens | EXPO_URL/SITE_URL don't cover the redirect Convex sent back — see the redirect allow-list |
| "Access blocked: app not verified" | Consent screen still in Testing and this account isn't a test user |
Works after npx convex env set, still fails | The deployment needs a moment to pick up new env vars — retry once |
| Nothing changed after editing the OAuth client | Google warns it can take 5 minutes to a few hours for client settings to propagate |