Group Connections
Group Connections enable multiple login methods to be linked to the same on-chain user identity. This means that users logging in with different authentication providers (e.g., Google and Email Passwordless) can still access the same wallet address—ensuring a unified user experience.
Before setting up a group connection, developers must first configure individual login connections that are eligible.
Set Up a Group Connection
Create Group Connection on Dashboard
To use this feature, developers must go to the Group Connections tab in the Embedded Wallets Dashboard.

Follow these steps:
- Visit the Embedded Wallets Dashboard.
- Go to the
Group Connectionssection. - Click on the
Create Groupbutton. - Enter your custom
Group Name. - Select
1st social connectionand2nd social connection. - Click
Create Group.


Usage
Since, the Group Connections details are available from Dashboard, developers don't need to pass any additional parameters to the Web3AuthProvider.
Follow our Quick Starts to setup the basic flow.
- Modal Connection
- Google [Implicit] + Auth0 [Implicit]
- Google One Tap [JWT] + Auth0 [JWT]
- Google [Implicit] + Firebase [JWT]
web3authContext.tsx
import { WALLET_CONNECTORS, WEB3AUTH_NETWORK } from "@web3auth/modal";
import { type Web3AuthContextConfig } from "@web3auth/modal/react";
const web3AuthContextConfig: Web3AuthContextConfig = {
web3AuthOptions: {
clientId: "YOUR_CLIENT_ID",
web3AuthNetwork: WEB3AUTH_NETWORK.SAPPHIRE_MAINNET,
modalConfig: {
connectors: {
[WALLET_CONNECTORS.AUTH]: {
label: "auth",
loginMethods: {
google: {
name: "google login",
authConnectionId: "w3a-google",
groupedAuthConnectionId: "aggregate-sapphire",
},
facebook: {
name: "facebook login",
authConnectionId: "w3a-facebook",
groupedAuthConnectionId: "aggregate-sapphire",
},
email_passwordless: {
name: "email passwordless login",
authConnectionId: "w3a-email-passwordless",
groupedAuthConnectionId: "aggregate-sapphire",
},
},
},
},
},
},
};
export default web3AuthContextConfig;
App.tsx
const loginWithGoogle = async () => {
await connectTo(WALLET_CONNECTORS.AUTH, {
groupedAuthConnectionId: "aggregate-sapphire",
authConnectionId: "w3a-google",
authConnection: AUTH_CONNECTION.GOOGLE,
});
};
const loginWithAuth0Google = async () => {
await connectTo(WALLET_CONNECTORS.AUTH, {
groupedAuthConnectionId: "aggregate-sapphire",
authConnectionId: "w3a-a0-google",
authConnection: AUTH_CONNECTION.CUSTOM,
extraLoginOptions: {
connection: "google-oauth2",
},
});
};
const loginWithAuth0GitHub = async () => {
await connectTo(WALLET_CONNECTORS.AUTH, {
groupedAuthConnectionId: "aggregate-sapphire",
authConnectionId: "w3a-a0-github",
authConnection: AUTH_CONNECTION.CUSTOM,
extraLoginOptions: {
connection: "github",
},
});
};
App.tsx
const loginWithGoogle = async (response: CredentialResponse) => {
const idToken = response.credential;
await connectTo(WALLET_CONNECTORS.AUTH, {
groupedAuthConnectionId: "aggregate-sapphire",
authConnectionId: "w3a-google",
authConnection: AUTH_CONNECTION.GOOGLE,
idToken,
extraLoginOptions: {
isUserIdCaseSensitive: false,
verifierIdField: "email",
},
});
};
const loginWithAuth0 = async () => {
try {
await loginWithPopup();
const idToken = (await getIdTokenClaims())?.__raw.toString();
if (!idToken) {
throw new Error("No id token found");
}
await connectTo(WALLET_CONNECTORS.AUTH, {
groupedAuthConnectionId: "aggregate-sapphire",
authConnectionId: "w3a-a0-github",
authConnection: AUTH_CONNECTION.CUSTOM,
idToken,
extraLoginOptions: {
isUserIdCaseSensitive: false,
verifierIdField: "email",
},
});
} catch (err) {
console.error(err);
}
};
App.tsx
const loginWithGoogle = async () => {
await connectTo(WALLET_CONNECTORS.AUTH, {
groupedAuthConnectionId: "aggregate-sapphire",
authConnectionId: "w3a-google",
authConnection: AUTH_CONNECTION.GOOGLE,
});
};
const loginWithFirebaseGithub = async () => {
const app = initializeApp(firebaseConfig);
const auth = getAuth(app);
const githubProvider = new GithubAuthProvider();
const result = await signInWithPopup(auth, githubProvider);
const idToken = await result.user.getIdToken(true);
connectTo(WALLET_CONNECTORS.AUTH, {
groupedAuthConnectionId: "aggregate-sapphire",
authConnectionId: "w3a-firebase",
authConnection: AUTH_CONNECTION.CUSTOM,
idToken,
extraLoginOptions: {
isUserIdCaseSensitive: false,
},
});
};