Custom branding no longer working after switching to grouped connections

**We recently upgrade to Growth plan and migrated all our users to a grouped google / email auth connector. Since then, we’ve been unable to get the custom branding work.. not in our staging nor prod environments.. both share the same branding configs from the portal, but when sending emails we just see the web3auth logo and we no longer get our custom logo..

Also we defaulted to “Spanish” language but we’re getting portuguese translations.. We tried reaching out twice from the dashboard itself, no answer still.. could anyone help us?

Thanks!**

Hi Diego — thanks for the clear report. I’m sorry you’re seeing this after the migration; I’ll help get it escalated. I pulled the key details you gave and added what we still need to investigate further.

Summary of what you reported

  • SDK: MetaMask Embedded Wallets (Web3Auth)
  • Platform / environments: Web — staging and production (both affected)
  • Recent change: Upgraded to Growth plan and migrated users to a grouped Google / Email auth connector
  • Symptoms: Custom branding (logo) no longer appears in emails — shows Web3Auth logo instead. Default language set to Spanish but emails/UI show Portuguese translations.
  • Attempts to contact support: Reached out twice via dashboard, no response yet

Missing / unclear items we’ll need to escalate
(please only share what you’re comfortable with; these help the support team reproduce and fix the issue)

  • SDK version number (from package.json / package-lock / yarn.lock) — important to know which Web3Auth / Embedded SDK you’re running
  • The clientId / projectId you’re using for staging and prod (or confirm whether the same clientId is used across both)
  • Initialization snippet for the Embedded Wallet / Web3Auth (the code where you construct Web3Auth / EmbeddedWallet and pass UI/branding or locale options)
  • Whether you’re using custom email templates in Web3Auth (or relying on default templates)
  • Screenshot of the email you received showing the Web3Auth logo (helps confirm which template/logo is being used)
  • Screenshot of your branding settings in the Web3Auth / MetaMask portal (so the team can confirm the assets and which project they belong to)
  • Any support ticket ID(s) you created from the dashboard (so we can correlate prior outreach)
  • Browser console logs / network logs from a session where the wrong language/logo appears (if possible)

Quick checks you can try right now

  • Confirm the clientId/project you configured in your app is the same project in the portal where you uploaded the custom branding (migration could have created a new project)
  • Confirm branding assets are uploaded to the correct project/environment in the portal
  • Clear app/browser cache or open an incognito window to rule out cached assets/templates
  • Confirm you’re explicitly passing the locale (language) param in your Web3Auth / Embedded init (ensure it’s set to ‘es’ / ‘es-ES’ as appropriate, and not ‘pt’)
  • Verify whether grouped-connector creation changed the project linkage (grouping can sometimes create or reference different connections)

Helpful docs

Next steps from my side

  • If you can paste the SDK version + the init snippet + one screenshot of the email and one screenshot of the portal branding, I’ll escalate this to the support team immediately and include these details so they can investigate the branding/template mapping and locale behavior.

Thanks again for flagging this, Diego — once you share the items above I’ll make sure the team gets all details and follows up. If you already have a dashboard support ticket ID, drop it here and I’ll reference it.

Note: This response was generated by an AI bot and may require further verification. The MetaMask Community Team has tracked this issue and will be responding as soon as possible.

Additionally, we would recommend you to join our biweekly Office Hours to get this resolved even faster. MetaMask Developer Office Hours

I attach the screenshot of the first ticket we opened:

We currently use “@web3auth/modal”: “10.8.0”, but it’s been happening since we grouped connections (at 10.5 or so I’d say, we bump regularly).

here’s the snippet:
export const web3AuthOptions = (lang: “es” | “en”): Web3AuthOptions => ({

clientId,

web3AuthNetwork,

chains,

// defaultChainId,

// Session configuration

sessionTime: 86400 * 7, // 7 days (in seconds)

storageType: “local”, // ‘local’ (persistent across tabs) or ‘session’ (single tab only)

walletServicesConfig: {

confirmationStrategy: "auto-approve"

},

uiConfig: {

logoLight: "https://app.aniwaid.com/logo.png",

logoDark: "https://app.aniwaid.com/logo.png",

uxMode: "redirect",

defaultLanguage: *lang*

},

modalConfig: {

connectors: {

  \[WALLET_CONNECTORS.AUTH\]: {

    label: "auth",

    loginMethods: {

      google: {

        name: "google login",

        authConnectionId: "aniwa-googleauth-custom",

        groupedAuthConnectionId: "aniwa-google-email-group"

      },

      email_passwordless: {

        name: "email passwordless login",

        authConnectionId: "w3a-email-passwordless-aniwa",

        groupedAuthConnectionId: "aniwa-google-email-group"

      }

    }

  }

}

}

});

The shared ticket includes screenshots and more details already..

Hi note that we’ve shared internally waiting for the team

Hey @dmilla
Can you please check if the client id for the dashboard you’re making changes to and the client id you’re passing via your dapp are the same?
And if the web3auth network is the same as well (sapphire_devnet or sapphire_mainnet)?

Hello, yes I’ve double checked client ids and environments.. I’m unable to get the whitelabel working on both environments.. it was working fine until we switched to grouped connections ids to group google and email logins (same client ids, same networks).

Can you please share the Web3Auth code that you’ve modified to pass grouped connection ids?

Sure, I’ll copy relevant code below. The only difference is that before we didn’t send any groupedAuthConnectionId param, and the authConnectionId where the default ones offered by web3auth (the same you can currently see for Apple login which is not part of the group).
Google works fine, we see our custom connection “continue to Aniwa”, email works fine too in grouping the accounts and everything but the email content is not whitelabeled anymore..

Here’s login code (react app):

import { useWeb3AuthConnect } from “@web3auth/modal/react”;

import { AUTH_CONNECTION, WALLET_CONNECTORS } from “@web3auth/modal”;

import { useQueryClient } from “@tanstack/react-query”;

type LoginProps = {

isAdmin?: boolean;

};

const showMetamask = false;

export const Login: FC = ({ isAdmin = false }) => {

const { t } = useTranslation();

const queryClient = useQueryClient();

const { connectTo } = useWeb3AuthConnect();

const { successToast, errorToast } = useCustomToast();

const [searchParams] = useSearchParams();

const [email, setEmail] = useState(“”);

const [isLoading, setIsLoading] = useState<{

email: boolean;

google: boolean;

apple: boolean;

metamask: boolean;

}>({

email: false,

google: false,

apple: false,

metamask: false

});

const handleLoginError = (error: any) => {

console.error(*error*);

if (

  *error*?.message?.includes("popup") &&

  *error*?.message?.includes("closed")

) {

  errorToast(t("loginPopupClosed", { ns: "login" }), false);

} else {

  errorToast(t("loginError", { ns: "login" }), false);

}

};

const connectWithEmail = async (email: string) => {

if (!validateEmail(*email*)) {

  errorToast(t("invalidEmail", { ns: "login" }), false);

  return;

}

queryClient.invalidateQueries();



setIsLoading((*prev*) => ({ ...*prev*, email: true }));

sendLoginStartEvent("email");

try {

  await connectTo(WALLET_CONNECTORS.AUTH, {

    authConnection: AUTH_CONNECTION.EMAIL_PASSWORDLESS,

    authConnectionId: "w3a-email-passwordless-aniwa",

    groupedAuthConnectionId: "aniwa-google-email-group",

    extraLoginOptions: {

      login_hint: *email*.trim().toLowerCase(),

      isUserIdCaseSensitive: false

    },

    appState: CONNECTING_STATE

  });

} catch (error) {

  handleLoginError(error);

} finally {

  setIsLoading((*prev*) => ({ ...*prev*, email: false }));

}

};

const connectWithApple = async () => {

queryClient.invalidateQueries();

setIsLoading((*prev*) => ({ ...*prev*, apple: true }));

sendLoginStartEvent("apple");

try {

  await connectTo(WALLET_CONNECTORS.AUTH, {

    authConnection: AUTH_CONNECTION.APPLE,

    extraLoginOptions: {

      isUserIdCaseSensitive: false

    },

    appState: CONNECTING_STATE

  });

} catch (error) {

  handleLoginError(error);

} finally {

  setIsLoading((*prev*) => ({ ...*prev*, apple: false }));

}

};

const connectWithGoogle = async () => {

queryClient.invalidateQueries();

setIsLoading((*prev*) => ({ ...*prev*, google: true }));

sendLoginStartEvent("google");

try {

  await connectTo(WALLET_CONNECTORS.AUTH, {

    authConnection: AUTH_CONNECTION.GOOGLE,

    authConnectionId: "aniwa-googleauth-custom",

    groupedAuthConnectionId: "aniwa-google-email-group",

    extraLoginOptions: {

      isUserIdCaseSensitive: false

    },

    appState: CONNECTING_STATE

  });

} catch (error) {

  handleLoginError(error);

} finally {

  setIsLoading((*prev*) => ({ ...*prev*, google: false }));

}

};

const connectWithMetamask = async () => {

queryClient.invalidateQueries();

setIsLoading((*prev*) => ({ ...*prev*, metamask: true }));

sendLoginStartEvent("metamask");

try {

  await connectTo(WALLET_CONNECTORS.METAMASK);

} catch (error) {

  handleLoginError(error);

} finally {

  setIsLoading((*prev*) => ({ ...*prev*, metamask: false }));

}

};

return (

<Flex

…..

Sorry seems posting broke formatting.. pasting again:

import { useWeb3AuthConnect } from “@web3auth/modal/react”;

import { AUTH_CONNECTION, WALLET_CONNECTORS } from “@web3auth/modal”;

import { useQueryClient } from “@tanstack/react-query”;

type LoginProps = {

isAdmin?: boolean;

};

const showMetamask = false;

export const Login: FC = ({ isAdmin = false }) => {

const { t } = useTranslation();

const queryClient = useQueryClient();

const { connectTo } = useWeb3AuthConnect();

const { successToast, errorToast } = useCustomToast();

const [searchParams] = useSearchParams();

const [email, setEmail] = useState(“”);

const [isLoading, setIsLoading] = useState<{

email: boolean;

google: boolean;

apple: boolean;

metamask: boolean;
}>({

email: false,

google: false,

apple: false,

metamask: false
});

const handleLoginError = (error: any) => {

console.error(*error*);

if (

  *error*?.message?.includes("popup") &&

  *error*?.message?.includes("closed")

) {

  errorToast(t("loginPopupClosed", { ns: "login" }), false);

} else {

  errorToast(t("loginError", { ns: "login" }), false);

}
};

const connectWithEmail = async (email: string) => {

if (!validateEmail(*email*)) {

  errorToast(t("invalidEmail", { ns: "login" }), false);

  return;

}

queryClient.invalidateQueries();



setIsLoading((*prev*) => ({ ...*prev*, email: true }));

sendLoginStartEvent("email");

try {

  await connectTo(WALLET_CONNECTORS.AUTH, {

    authConnection: AUTH_CONNECTION.EMAIL_PASSWORDLESS,

    authConnectionId: "w3a-email-passwordless-aniwa",

    groupedAuthConnectionId: "aniwa-google-email-group",

    extraLoginOptions: {

      login_hint: *email*.trim().toLowerCase(),

      isUserIdCaseSensitive: false

    },

    appState: CONNECTING_STATE

  });

} catch (error) {

  handleLoginError(error);

} finally {

  setIsLoading((*prev*) => ({ ...*prev*, email: false }));

}
};

const connectWithApple = async () => {

queryClient.invalidateQueries();

setIsLoading((*prev*) => ({ ...*prev*, apple: true }));

sendLoginStartEvent("apple");

try {

  await connectTo(WALLET_CONNECTORS.AUTH, {

    authConnection: AUTH_CONNECTION.APPLE,

    extraLoginOptions: {

      isUserIdCaseSensitive: false

    },

    appState: CONNECTING_STATE

  });

} catch (error) {

  handleLoginError(error);

} finally {

  setIsLoading((*prev*) => ({ ...*prev*, apple: false }));

}
};

const connectWithGoogle = async () => {

queryClient.invalidateQueries();

setIsLoading((*prev*) => ({ ...*prev*, google: true }));

sendLoginStartEvent("google");

try {

  await connectTo(WALLET_CONNECTORS.AUTH, {

    authConnection: AUTH_CONNECTION.GOOGLE,

    authConnectionId: "aniwa-googleauth-custom",

    groupedAuthConnectionId: "aniwa-google-email-group",

    extraLoginOptions: {

      isUserIdCaseSensitive: false

    },

    appState: CONNECTING_STATE

  });

} catch (error) {

  handleLoginError(error);

} finally {

  setIsLoading((*prev*) => ({ ...*prev*, google: false }));

}
};

const connectWithMetamask = async () => {

queryClient.invalidateQueries();

setIsLoading((*prev*) => ({ ...*prev*, metamask: true }));

sendLoginStartEvent("metamask");

try {

  await connectTo(WALLET_CONNECTORS.METAMASK);

} catch (error) {

  handleLoginError(error);

} finally {

  setIsLoading((*prev*) => ({ ...*prev*, metamask: false }));

}
};

return (

<Flex
…..

Hey @maharshi any updates on this? thanks!