Sign in with Apple
What is Sign in with Apple?
Sign in with Apple lets your end-users create an account and log in with the Apple Account they already have. On iOS, the sign-in sheet is presented by the operating system and confirmed with Face ID, Touch ID, or the device passcode. The end-user never leaves your app and never types a password. On Android and on the web, they sign in through Apple's page in the system browser.

Apple is a built-in login provider in Bubble. There's no plugin to install: you add the Apple Sign-In Button element, fill in a few credentials in Settings, and Bubble handles the rest.
Where it works
iOS
Apple's native sign-in sheet
Bundle ID
Android
Apple's sign-in page in the system browser
Service ID
Web
Apple's sign-in page
Service ID
Apple publishes no native Android SDK and blocks Sign in with Apple inside embedded webviews, which is why Android goes out to the system browser.
Apple sign-in button availability
The Apple Sign-In Button element is available in mobile views only. On the web you can still trigger the flow from any button using the Signup/login with a social network action.
When you're required to offer it
Apple's App Review Guideline 4.8 (Design: Login Services) applies to any app using a third-party or social login service (Google, Facebook, LinkedIn, X, Amazon) to set up or authenticate an end-user's primary account.
If your app does that, it must also offer an equivalent login option that limits data collection to name and email address, lets the end-user keep their email address private, and doesn't collect in-app interactions for advertising without consent. Sign in with Apple meets all three, which makes it the most direct way to comply.
External page: Apple app Review Guidelines
Before you start
You'll need:
Custom domains
You don't need a custom domain to offer Sign in with Apple, on any platform. For Android and the web, the Return URL Bubble gives you falls back to your app's built-in .bubbleapps.io subdomain, and you can register that subdomain with Apple when you configure your Services ID (Step 2).
A custom domain only matters if you want to send email to end-users who chose Hide My Email. See Step 4 for the details and the limitation.
Security: This setup produces a private key file (.p8) that can authenticate as your app. Treat it like a password: store it securely, keep a backup, and never commit it anywhere public. It's the same class of credential as your APNs key and your App Store Connect API key — and a different key from both.
Setting up Sign in with Apple
Start in Bubble. Turning on the Sign in with Apple permission (Step 1) is usually all it takes to enable the capability on Apple's side, because Bubble configures your App ID for you.
Steps 2 to 4 happen in the Apple Developer portal, at developer.apple.com/account under Certificates, Identifiers & Profiles. Steps 2 and 4 are only needed if you're offering Sign in with Apple on Android or the web (Step 2) or emailing Hide My Email end-users (Step 4).
Turn on the Sign in with Apple permission in Bubble
Go to Settings → Device permissions and turn on Sign in with Apple. Placing the Apple Sign-In Button element (see Adding the button to your app) turns it on for you.
That's normally the whole step. When you deploy, Bubble automatically adds the Sign in with Apple capability to your Bundle ID through the App Store Connect API. You don't need to touch the Apple Developer portal for this.
The automatic step is best-effort, and it can fail silently, most often when your App Store Connect API key doesn't have permission to manage identifiers.
If a build fails, enable the capability by hand in the Apple Developer portal:
Log into developer.apple.com.
Go to Certificates, Identifiers & Profiles → Identifiers and select your App ID.
Scroll the Capabilities list to Sign In with Apple and check it.
Click Edit, choose Enable as a primary App ID, and Save.
Save the App ID configuration in the top right corner.
Apple asks you to confirm that your provisioning profile needs updating. This is fine: Bubble generates a new profile with your next app build.

Create a Services ID (Android and web only)

Go to Identifiers, click +, choose Services IDs, and click Continue.
Enter a description and an identifier. The convention is your Bundle ID with a suffix, for example com.mycompany.myapp.siwa.
Register it, then select it from the list and check Sign in with Apple.
Click Configure:
Set Primary App ID to your app's App ID.
Under Domains and Subdomains, add your app's domain, without the https:// part. If you don't have a custom domain, enter your app's built-in Bubble subdomain, for example myapp.bubbleapps.io.
Under Return URLs, paste the Return URL shown in Bubble's Sign in with Apple settings (Step 5). If your app has no custom domain, this URL is on your bubbleapps.io subdomain, which works fine.
Save and continue.
Create a Sign in with Apple key
Bubble uses this key to sign its requests to Apple on your behalf: the token exchange on Android and the web, and revoking an end-user's token when they delete their account.
In the Apple Developer portal, click Keys in the sidebar, then +.
Name the key so you can identify the app later, for example Sign in with Apple.
Check Sign in with Apple, click Configure, select your Primary App ID, and Save.
Click Continue, then Register.
Download the
.p8file.Copy the Key ID from the confirmation page.

Warning: You can download the .p8 file only once. If you leave the page without downloading it, revoke the key and create a new one.
Register your sending domain for private email relay (optional)
End-users can choose Hide My Email during signup. Apple then gives your app a relay address ending in @privaterelay.appleid.com and forwards messages to the end-user's real inbox, but only from domains you've registered.
This step is optional for sign-in itself. Sign in with Apple works end to end on every platform without it. You only need to configure the relay if your app sends emails to end-users, like password resets, receipts, or notifications, and some of those end-users chose Hide My Email. Without it, Apple's relay rejects messages sent from your app to those end-users.
Warning: Without a custom domain, you can't email end-users who chose Hide My Email. Registering a domain here requires adding a TXT record to its DNS and passing SPF and DKIM checks, so it must be a domain you control.
If your app sends email through Bubble's built-in email service and you don't have a custom domain, you can't complete this step, and there's currently no way to deliver email to end-users who chose Hide My Email. Sign-in itself isn't affected: those end-users can still create accounts and log in.
If emailing your end-users matters to your app, set up a custom domain and your own email-sending configuration first.
Go to Certificates, Identifiers & Profiles → Services.
Under Sign in with Apple for Email Communication, click Configure.
Register each domain or subdomain you send email from, as a comma-separated list, and click Register.
Verify each domain and make sure SPF or DKIM is in place. The envelope sender domain of your outbound email must exactly match a registered domain and pass SPF.
Reference: Configure private email relay service (Apple)
Configure Sign in with Apple in Bubble
Go to Settings → Apple app store. Below the App Store Connect card you'll find the Sign in with Apple section.
The section looks like this:


The fields are grouped by what they're needed for.
Required for all platforms
Key ID
From Step 3. Bubble uses this key to sign two kinds of requests to Apple: the token exchange when an end-user signs in on Android or the web, and revoking an end-user's Apple token when they delete their account, as Apple requires.
Private key (.p8)
Upload the file from Step 3.
Web and Android (optional)
Service ID
The identifier from Step 2, for example com.mycompany.myapp.siwa. Required for Android and web. Not used on iOS.
Return URL
Read-only, with a copy button. Copy this into your Service ID's Return URLs field in the Apple Developer portal. Only the Android and web flows use it.
Validate your credentials
Once the required fields are filled in, click Validate. Bubble checks your credentials against Apple and surfaces any problem immediately: a wrong Key ID or a .p8 file that doesn't match it fails validation with a specific error, instead of failing silently when an end-user tries to sign in.
After validation succeeds, the button is disabled and the section shows Credentials validated; the form collapses into its configured state, with the Web and Android fields still visible. Editing any relevant field clears the validated state and requires you to validate again.
Below the fields, an information block headed Emails to "Hide My Email" users repeats the private relay guidance from Step 4.
Adding the button to your app
The Sign in with Apple permission
You already turned this on in Step 1, and placing the Apple Sign-In Button turns it on automatically, so you'll usually find it enabled.

The permission card in Settings → Device permissions reads:
Adds the Sign in with Apple capability to your iOS builds. Requires the capability to be enabled on your App ID in the Apple Developer portal.
Warning: This permission is what puts the capability into your iOS binary. If you deploy with it off, Sign in with Apple stops working in that build, and you'll need a new build (not an OTA update) to fix it.
Adding the element
In a mobile view, open the element palette and find Apple Sign-In Button under Authentication.

When you place it, Bubble does three things: creates the element, wires up a workflow (Apple Sign-In Button A is tapped → Signup/login with Apple), and turns on the Sign in with Apple device permission. For the standard sign-in flow, that's the whole setup — you don't need to add anything to the workflow.
Styling the button
Apple controls how its button looks, and App Review checks it. Bubble exposes Apple's own options and locks the rest.
Button type
Label and icon, or Logo only
Button style
Black, White, or White with outline
Text
Sign in with Apple, Sign up with Apple, or Continue with Apple.
Hidden when Button type is Logo only.



You can change size, position and corner roundness. Opacity is locked: Apple's guidelines require the button background to stay pure black or white. Font, colours, padding, the Apple logo and shadows are rendered by Apple's component and can't be edited. Reusable styles don't apply.
When Button type is Logo only, the button keeps a 1:1 aspect ratio, and Bubble enforces Apple's minimum button size.
External page: Creating a custom Sign in with Apple button (Apple Developer documentation)
Note: Don't make the Apple button smaller or less prominent than your other login buttons. Apple treats a de-emphasized Sign in with Apple button as a Guideline 4.8 violation.
Workflows
The button exposes a single event: is tapped. There are no separate success or failure events, and the element has no exposed states.
The auto-created workflow uses the standard Signup/login with a social network action with the OAuth provider set to Apple. You can add actions after it, such as navigating to a view or creating related data, and they run once sign-in completes. If the end-user cancels the Apple sheet, the workflow stops.
You can also add the action manually to any workflow, including on web pages, without using the element.

What Apple sends your app, and what you can use
On success, the end-user is signed up or logged in as a Bubble User, through the same path as any other OAuth provider.
The email address becomes the User's email. If the end-user chose Hide My Email, that's their relay address: Bubble stores it and treats it as a normal, confirmed email address. Current User's email returns it.
The name and the Apple user identifier are stored on the User internally, but are not currently exposed anywhere you can reach them — no field, no data source, no expression.
Warning: Apple sends the end-user's full name only on the very first authorization, and never again. Bubble captures and stores it, but there is currently no way for your app to read it back. If you need the end-user's name, collect it in your own form after signup.
Hidden email addresses
Relay addresses (a1b2c3d4e5@privaterelay.appleid.com) work like normal addresses, provided you completed Step 4.
Things to know:
The end-user can turn off forwarding at any time in their Apple Account settings. Your email then stops being delivered, with no signal to your app.
The relay address is unique to your app, so you can't use it to match the end-user to an account created another way.
If you haven't (or can't) complete Step 4, for example because your app has no custom domain and uses Bubble's built-in email sending, Apple's relay rejects email to these addresses. Sign-in still works; delivery doesn't.
How Apple sign-in interacts with existing accounts
Sign in with Apple follows Bubble's general OAuth behavior:
A new end-user signs in with Apple. A User is created and the Apple identity is stored on it.
An end-user who is already logged in signs in with Apple. Bubble links their existing account to Apple, and they can then use either method. If a different User already holds that Apple identity, the link fails with "We cannot link your account to this email because there is already an account for this email".
Someone signs in with Apple while logged out, and the email Apple returns already belongs to another User: for example, they originally signed up with that email and a password. This fails: they stay logged out and see your app's standard "email already used" message. No account is created and nothing is linked.
Warning: There is no automatic merge between an Apple sign-in and an existing email/password account with the same address. If you're adding Sign in with Apple to an app that already has end-users, they need to log in first and then sign in with Apple to link the two. Signing in with Apple while logged out will fail for them.
Account deletion
Apple requires two things of apps offering Sign in with Apple, and both are checked at review:
Guideline 5.1.1(v): end-users must be able to delete their account from within the app.
The app must revoke the Apple tokens for a deleted account.
Bubble handles revocation for you. Whenever a User is deleted server-side, Bubble calls Apple's revoke endpoint automatically. You don't need to add anything to your delete-account workflow beyond deleting the User.
Revocation needs your Team ID, Key ID, and .p8 private key to be configured. If they're missing, deletion still succeeds and Bubble skips the revocation with a warning in your server logs.
Note: Accounts created by signing in through BubbleGo don't have a stored refresh token, so revocation is skipped for them. This doesn't affect end-users of your published app.
You still need to build the delete-account flow itself; Apple requires it to be reachable from inside the app.
Testing
BubbleGo
Sign in with Apple works. Requires a recent BubbleGo build.
Mobile web preview
Works, using the Android/web flow rather than the native sheet. Requires the Service ID, Team ID, Key ID, and .p8 all to be configured.
TestFlight and App Store builds
The only way to test the native iOS sheet in context.
To test the first-time flow again: after an end-user authorizes your app once, later sign-ins are silent and return no name. To reset, on the device open Settings, tap your name, tap Sign in with Apple, select your app and tap Stop using Apple Account.
Warning: Turning the Sign in with Apple permission on or off changes your binary. Test on a build made after you enabled it — an OTA update won't add the capability.
Troubleshooting
Issues flagged in the editor
FAQ: Sign in with Apple
Last updated
Was this helpful?