dubinc/dub · error

Failed to update workspace.

Error message

Failed to update workspace.

What it means

updateWorkspace in the Stripe app calls the Dub API to update workspace properties (e.g. Stripe connect metadata); when response.ok is false it throws this generic message, attaching the API error payload as `cause` for diagnosis. The generic text hides the real reason, which must be read from error.cause.

Source

Thrown at packages/stripe-app/src/utils/dub.ts:28

  token: Token;
  accountId: string | null;
  stripeMode: StripeMode;
}) {
  const response = await fetch(`${DUB_API_HOST}/stripe/integration`, {
    method: "PATCH",
    headers: {
      Authorization: `Bearer ${token.access_token}`,
    },
    body: JSON.stringify({
      stripeAccountId: accountId,
      stripeMode,
    }),
  });

  if (!response.ok) {
    const data = await response.json();

    throw new Error("Failed to update workspace.", {
      cause: data.error,
    });
  }
}

View on GitHub (pinned to f216b94a24)

Solutions

  1. Log/inspect error.cause — it holds the API's error object with the concrete code and message.
  2. Re-run the Dub OAuth flow to obtain a fresh token if the cause indicates authentication failure.
  3. Verify the workspace id being sent still exists in Dub.
  4. Retry the update; if persistent, check the request payload against the Dub API docs.

Example fix

// before
catch (e) { console.error(e.message); } // "Failed to update workspace."
// after
catch (e) { console.error(e.message, e.cause); } // includes API error detail
Defensive patterns

Strategy: try-catch

Validate before calling

const token = await getSecret({ stripe, name: "dub_token" });
if (!token) throw new Error("Dub not connected for this account; skipping workspace update");
if (!workspaceId) throw new Error("workspaceId is required before calling updateWorkspace");

Type guard

function hasErrorCause(e: unknown): e is Error & { cause: { code?: string; message?: string } } {
  return e instanceof Error && typeof e.cause === "object" && e.cause !== null;
}

Try / catch

try {
  await updateWorkspace({ ... });
} catch (e) {
  if (hasErrorCause(e)) console.error("Workspace update failed:", e.message, e.cause);
  else throw e;
}

Prevention

When it happens

Trigger: The workspace-update request (packages/stripe-app/src/utils/dub.ts) receives a non-OK status: invalid/explicitly missing bearer token, workspace id mismatch, or the Dub API rejecting the update payload with 4xx/5xx.

Common situations: User disconnects/reconnects Stripe with a stale Dub token; workspace was deleted on Dub's side; API validation rejects the update during Stripe webhook/account session flows.

Related errors


AI-assisted analysis of dubinc/dub@f216b94a24 (2026-08-31). Data as JSON: /api/errors/bbb071ff5deb134e. Report an issue: GitHub.