diff --git a/packages/react/src/auth/index.ts b/packages/react/src/auth/index.ts
index 024d9a34..20ee2f62 100644
--- a/packages/react/src/auth/index.ts
+++ b/packages/react/src/auth/index.ts
@@ -33,9 +33,8 @@ export { useUpdateCurrentUserMutation } from "./useUpdateCurrentUserMutation";
// useValidatePasswordMutation
// useVerifyPasswordResetCodeMutation
export { useVerifyPasswordResetCodeMutation } from "./useVerifyPasswordResetCodeMutation";
-// useDeleteUserMutation
+export { useLinkWithCredentialMutation } from "./useLinkWithCredentialMutation";
export { useDeleteUserMutation } from "./useDeleteUserMutation";
-// useLinkWithCredentialMutation
// useLinkWithPhoneNumberMutation
// useLinkWithPopupMutation
// useLinkWithRedirectMutation
diff --git a/packages/react/src/auth/useLinkWithCredentialMutation.test.tsx b/packages/react/src/auth/useLinkWithCredentialMutation.test.tsx
new file mode 100644
index 00000000..844f0b75
--- /dev/null
+++ b/packages/react/src/auth/useLinkWithCredentialMutation.test.tsx
@@ -0,0 +1,41 @@
+import React from "react";
+import { describe, expect, test, beforeEach, afterEach, vi } from "vitest";
+import { renderHook, act, waitFor } from "@testing-library/react";
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+import { auth, wipeAuth } from "~/testing-utils";
+import { createUserWithEmailAndPassword, type User } from "firebase/auth";
+
+const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: { retry: false },
+ mutations: { retry: false },
+ },
+});
+
+const wrapper = ({ children }: { children: React.ReactNode }) => (
+ {children}
+);
+
+describe("useLinkWithCredentialMutation", () => {
+ const email = "tqf@invertase.io";
+ const password = "TanstackQueryFirebase#123";
+ let user: User;
+
+ beforeEach(async () => {
+ queryClient.clear();
+ await wipeAuth();
+ const userCredential = await createUserWithEmailAndPassword(
+ auth,
+ email,
+ password
+ );
+ user = userCredential.user;
+ });
+
+ afterEach(async () => {
+ vi.clearAllMocks();
+ await auth.signOut();
+ });
+
+ test("", async () => {});
+});
diff --git a/packages/react/src/auth/useLinkWithCredentialMutation.ts b/packages/react/src/auth/useLinkWithCredentialMutation.ts
new file mode 100644
index 00000000..9c7bce7a
--- /dev/null
+++ b/packages/react/src/auth/useLinkWithCredentialMutation.ts
@@ -0,0 +1,25 @@
+import { useMutation, type UseMutationOptions } from "@tanstack/react-query";
+import {
+ linkWithCredential,
+ type UserCredential,
+ type User,
+ type AuthCredential,
+ type AuthError,
+} from "firebase/auth";
+
+type AuthMutationOptions<
+ TData = unknown,
+ TError = Error,
+ TVariables = void
+> = Omit, "mutationFn">;
+
+export function useLinkWithCredentialMutation(
+ user: User,
+ options?: AuthMutationOptions
+) {
+ return useMutation({
+ ...options,
+ mutationFn: (credential: AuthCredential) =>
+ linkWithCredential(user, credential),
+ });
+}