diff --git a/apps/web/app/(ee)/api/stripe/webhook/checkout-session-completed.ts b/apps/web/app/(ee)/api/stripe/webhook/checkout-session-completed.ts
index b6b565be0f9..a427a43c914 100644
--- a/apps/web/app/(ee)/api/stripe/webhook/checkout-session-completed.ts
+++ b/apps/web/app/(ee)/api/stripe/webhook/checkout-session-completed.ts
@@ -133,15 +133,6 @@ export async function checkoutSessionCompleted(
variant: "marketing",
})),
),
- // enable dub.link premium default domain for the workspace
- prisma.defaultDomains.update({
- where: {
- projectId: workspaceId,
- },
- data: {
- dublink: true,
- },
- }),
// expire tokens cache
tokenCache.expireMany({
hashedKeys: updatedWorkspace.restrictedTokens.map(
diff --git a/apps/web/app/(ee)/api/stripe/webhook/customer-subscription-deleted.ts b/apps/web/app/(ee)/api/stripe/webhook/customer-subscription-deleted.ts
index 692c3d65197..dbfa3ae87a0 100644
--- a/apps/web/app/(ee)/api/stripe/webhook/customer-subscription-deleted.ts
+++ b/apps/web/app/(ee)/api/stripe/webhook/customer-subscription-deleted.ts
@@ -118,17 +118,6 @@ export async function customerSubscriptionDeleted(
paymentFailedAt: null,
},
}),
-
- // disable dub.link premium default domain for the workspace
- prisma.defaultDomains.update({
- where: {
- projectId: workspace.id,
- },
- data: {
- dublink: false,
- },
- }),
-
// remove logo from all domains for the workspace
prisma.domain.updateMany({
where: {
diff --git a/apps/web/app/api/domains/default/route.ts b/apps/web/app/api/domains/default/route.ts
index 0bdf0e92153..a88af222933 100644
--- a/apps/web/app/api/domains/default/route.ts
+++ b/apps/web/app/api/domains/default/route.ts
@@ -1,4 +1,3 @@
-import { DubApiError } from "@/lib/api/errors";
import { withWorkspace } from "@/lib/auth";
import { getDefaultDomainsQuerySchema } from "@/lib/zod/schemas/domains";
import { prisma } from "@dub/prisma";
@@ -17,7 +16,6 @@ export const GET = withWorkspace(
},
select: {
dubsh: true,
- dublink: true,
chatgpt: true,
sptifi: true,
gitnew: true,
@@ -60,21 +58,12 @@ export const PATCH = withWorkspace(
await req.json(),
);
- if (workspace.plan === "free" && defaultDomains.includes("dub.link")) {
- throw new DubApiError({
- code: "forbidden",
- message:
- "You can only use dub.link on a Pro plan and above. Upgrade to Pro to use this domain.",
- });
- }
-
const response = await prisma.defaultDomains.update({
where: {
projectId: workspace.id,
},
data: {
dubsh: defaultDomains.includes("dub.sh"),
- dublink: defaultDomains.includes("dub.link"),
chatgpt: defaultDomains.includes("chatg.pt"),
sptifi: defaultDomains.includes("spti.fi"),
gitnew: defaultDomains.includes("git.new"),
diff --git a/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/settings/domains/default/page-client.tsx b/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/settings/domains/default/page-client.tsx
index d115c3f03e7..b4ef38e81a5 100644
--- a/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/settings/domains/default/page-client.tsx
+++ b/apps/web/app/app.dub.co/(dashboard)/[slug]/(ee)/settings/domains/default/page-client.tsx
@@ -5,7 +5,7 @@ import useDefaultDomains from "@/lib/swr/use-default-domains";
import useWorkspace from "@/lib/swr/use-workspace";
import { DomainCardTitleColumn } from "@/ui/domains/domain-card-title-column";
import { UpgradeRequiredToast } from "@/ui/shared/upgrade-required-toast";
-import { Logo, Switch, TooltipContent } from "@dub/ui";
+import { Logo, Switch } from "@dub/ui";
import {
Amazon,
CalendarDays,
@@ -75,9 +75,7 @@ export function DefaultDomains() {
- {DUB_DOMAINS.filter(
- (domain) => domain.slug !== "dub.link" || !flags?.noDubLink,
- ).map(({ slug, description }) => {
+ {DUB_DOMAINS.map(({ slug, description }) => {
return (
- ) : undefined)
- }
+ disabledTooltip={permissionsError ?? undefined}
checked={defaultDomains?.includes(slug)}
fn={() => {
const oldDefaultDomains = defaultDomains.slice();
diff --git a/apps/web/lib/edge-config/get-feature-flags.ts b/apps/web/lib/edge-config/get-feature-flags.ts
index 8e2aa591870..95d219d69bc 100644
--- a/apps/web/lib/edge-config/get-feature-flags.ts
+++ b/apps/web/lib/edge-config/get-feature-flags.ts
@@ -16,7 +16,6 @@ export const getFeatureFlags = async ({
}
const workspaceFeatures: Record
= {
- noDubLink: false,
analyticsSettingsSiteVisitTracking: false,
};
diff --git a/apps/web/lib/edge-config/is-reserved-username.ts b/apps/web/lib/edge-config/is-reserved-username.ts
index f8798a036df..48a4e23a666 100644
--- a/apps/web/lib/edge-config/is-reserved-username.ts
+++ b/apps/web/lib/edge-config/is-reserved-username.ts
@@ -1,7 +1,7 @@
import { get } from "@vercel/edge-config";
/**
- * Only for dub.sh / dub.link domains
+ * Only for dub.sh domain
* Check if a username is reserved – should only be available on Pro+
*/
export const isReservedUsername = async (key: string) => {
diff --git a/apps/web/lib/swr/use-default-domains.ts b/apps/web/lib/swr/use-default-domains.ts
index 39bd7b5db48..5aee474b00a 100644
--- a/apps/web/lib/swr/use-default-domains.ts
+++ b/apps/web/lib/swr/use-default-domains.ts
@@ -1,10 +1,9 @@
import { fetcher } from "@dub/utils";
-import { useMemo } from "react";
import useSWR from "swr";
import useWorkspace from "./use-workspace";
export default function useDefaultDomains(opts: { search?: string } = {}) {
- const { id: workspaceId, flags } = useWorkspace();
+ const { id: workspaceId } = useWorkspace();
const { data, error, mutate } = useSWR(
workspaceId &&
@@ -18,14 +17,8 @@ export default function useDefaultDomains(opts: { search?: string } = {}) {
},
);
- const defaultDomains = useMemo(() => {
- return flags?.noDubLink
- ? data?.filter((domain) => domain !== "dub.link")
- : data;
- }, [data, flags]);
-
return {
- defaultDomains,
+ defaultDomains: data,
loading: !data && !error,
mutate,
error,
diff --git a/apps/web/lib/swr/use-domains.ts b/apps/web/lib/swr/use-domains.ts
index 12b8228223a..de00121bcc1 100644
--- a/apps/web/lib/swr/use-domains.ts
+++ b/apps/web/lib/swr/use-domains.ts
@@ -87,8 +87,6 @@ export default function useDomains({
activeWorkspaceDomains.find(({ primary }) => primary)?.slug ||
activeWorkspaceDomains[0].slug
);
- } else if (activeDefaultDomains.find(({ slug }) => slug === "dub.link")) {
- return "dub.link";
}
return SHORT_DOMAIN;
}, [activeDefaultDomains, activeWorkspaceDomains]);
diff --git a/apps/web/lib/types.ts b/apps/web/lib/types.ts
index ef5d375ca9f..8a2d017e50a 100644
--- a/apps/web/lib/types.ts
+++ b/apps/web/lib/types.ts
@@ -260,7 +260,7 @@ export type UtmTemplateWithUserProps = UtmTemplateProps & {
export type PlanProps = (typeof plans)[number];
-export type BetaFeatures = "noDubLink" | "analyticsSettingsSiteVisitTracking";
+export type BetaFeatures = "analyticsSettingsSiteVisitTracking";
export type PartnerBetaFeatures = "postbacks";
diff --git a/apps/web/lib/zod/schemas/workspaces.ts b/apps/web/lib/zod/schemas/workspaces.ts
index b4f8250b95a..7ea0a99494f 100644
--- a/apps/web/lib/zod/schemas/workspaces.ts
+++ b/apps/web/lib/zod/schemas/workspaces.ts
@@ -102,9 +102,7 @@ export const WorkspaceSchema = z
),
dotLinkClaimed: z
.boolean()
- .describe(
- "Whether the workspace has claimed a free .link domain. (dub.link/free)",
- ),
+ .describe("Whether the workspace has claimed a free .link domain."),
createdAt: z
.date()
.describe("The date and time when the workspace was created."),
diff --git a/apps/web/ui/domains/domain-card-title-column.tsx b/apps/web/ui/domains/domain-card-title-column.tsx
index 049fd3c4e70..31157c9ec07 100644
--- a/apps/web/ui/domains/domain-card-title-column.tsx
+++ b/apps/web/ui/domains/domain-card-title-column.tsx
@@ -1,6 +1,5 @@
import { ArrowTurnRight2, Flag2, Globe } from "@dub/ui/icons";
import { cn, getPrettyUrl, punycode } from "@dub/utils";
-import { Star } from "lucide-react";
export function DomainCardTitleColumn({
domain,
@@ -51,11 +50,6 @@ export function DomainCardTitleColumn({
Primary
- ) : defaultDomain && domain === "dub.link" ? (
-
-
- Premium
-
) : null}
{(!defaultDomain || description) && (
diff --git a/apps/web/ui/links/use-available-domains.ts b/apps/web/ui/links/use-available-domains.ts
index be48f059d77..fdac2b2e877 100644
--- a/apps/web/ui/links/use-available-domains.ts
+++ b/apps/web/ui/links/use-available-domains.ts
@@ -60,7 +60,7 @@ export function useAvailableDomains(
// If domain not found at all, return all active domains
return [
...sortDomains(activeWorkspaceDomains || []),
- ...sortDomains(activeDefaultDomains, "dub.link"),
+ ...sortDomains(activeDefaultDomains, "dub.sh"),
];
}
@@ -71,7 +71,7 @@ export function useAvailableDomains(
return [
...sortDomains(activeWorkspaceDomains || []),
...(isDefaultDomain ? [] : [domain]),
- ...sortDomains(activeDefaultDomains, "dub.link"),
+ ...sortDomains(activeDefaultDomains, "dub.sh"),
...(isDefaultDomain ? [domain] : []),
];
}
@@ -83,8 +83,8 @@ export function useAvailableDomains(
...domain,
isWorkspaceDomain: true,
})),
- // Default domains next, with dub.link first, then alphabetically
- ...sortDomains(activeDefaultDomains, "dub.link").map((domain) => ({
+ // Default domains next, with dub.sh first, then alphabetically
+ ...sortDomains(activeDefaultDomains, "dub.sh").map((domain) => ({
...domain,
isWorkspaceDomain: false,
})),
diff --git a/packages/prisma/schema/domain.prisma b/packages/prisma/schema/domain.prisma
index 5bb19ddbfd5..2ae451e303b 100644
--- a/packages/prisma/schema/domain.prisma
+++ b/packages/prisma/schema/domain.prisma
@@ -47,7 +47,6 @@ model RegisteredDomain {
model DefaultDomains {
id String @id @default(cuid())
- dublink Boolean @default(false)
dubsh Boolean @default(true)
chatgpt Boolean @default(true)
sptifi Boolean @default(true)
diff --git a/packages/utils/src/constants/dub-domains.ts b/packages/utils/src/constants/dub-domains.ts
index 623560896e2..10a33eebd73 100644
--- a/packages/utils/src/constants/dub-domains.ts
+++ b/packages/utils/src/constants/dub-domains.ts
@@ -14,18 +14,6 @@ export const DUB_DOMAINS = [
},
...(process.env.NEXT_PUBLIC_IS_DUB
? [
- {
- id: "clxp3lfsb00011na8tfs7t0lx",
- slug: "dub.link",
- verified: true,
- primary: true,
- archived: false,
- placeholder: "https://dub.co/help/article/dub-links",
- allowedHostnames: [],
- description:
- "Premium short domain on Dub – only available on our Pro plan and above.",
- projectId: DUB_WORKSPACE_ID,
- },
{
id: "clce1z7cs00y8rbstk4xtnj0k",
slug: "chatg.pt",
diff --git a/packages/utils/src/constants/pricing/pricing-plan-compare-features.tsx b/packages/utils/src/constants/pricing/pricing-plan-compare-features.tsx
index 05d915d71e2..b37b91cb9e2 100644
--- a/packages/utils/src/constants/pricing/pricing-plan-compare-features.tsx
+++ b/packages/utils/src/constants/pricing/pricing-plan-compare-features.tsx
@@ -415,18 +415,6 @@ export const PRICING_PLAN_COMPARE_FEATURES: {
{
text: () => <>SSL certificates>,
},
- {
- check: {
- default: true,
- free: false,
- },
- text: () => (
- <>
- Premium dub.link domain
- >
- ),
- href: "https://dub.co/help/article/default-dub-domains#premium-dublink-domain",
- },
{
check: {
default: true,
diff --git a/packages/utils/src/constants/reserved-slugs.ts b/packages/utils/src/constants/reserved-slugs.ts
index 5d14d6b8c3e..576e39e3734 100644
--- a/packages/utils/src/constants/reserved-slugs.ts
+++ b/packages/utils/src/constants/reserved-slugs.ts
@@ -1,6 +1,6 @@
/**
* Check if a key is reserved:
- * - cannot be registered for a short link (only for dub.sh / dub.link domains)
+ * - cannot be registered for a short link (only for dub.sh domain)
* - cannot be used as a workspace slug
*/