From fe322125a81b2372fce459a2751fcbface697956 Mon Sep 17 00:00:00 2001 From: Steven Tey Date: Sun, 2 Nov 2025 17:14:29 -0800 Subject: [PATCH] Add showDetailedAnalytics flag --- .../programs/[programId]/analytics/route.ts | 21 ++- .../customers/[customerId]/route.ts | 8 +- .../programs/[programId]/events/route.ts | 8 +- .../(enrolled)/analytics/page.tsx | 11 +- .../customers/[customerId]/page-client.tsx | 5 +- .../(enrolled)/earnings/earnings-table.tsx | 8 +- .../[programSlug]/(enrolled)/events/page.tsx | 11 +- .../(enrolled)/links/partner-link-card.tsx | 8 +- .../[programSlug]/(enrolled)/page-client.tsx | 16 +- apps/web/lib/partners/constants.ts | 9 +- apps/web/lib/swr/use-program-enrollment.ts | 5 + apps/web/lib/zod/schemas/groups.ts | 3 +- apps/web/scripts/partners/aggregate-stats.ts | 169 ------------------ .../layout/sidebar/partners-sidebar-nav.tsx | 7 +- .../src/templates/partner-deactivated.tsx | 2 +- 15 files changed, 62 insertions(+), 229 deletions(-) delete mode 100644 apps/web/scripts/partners/aggregate-stats.ts diff --git a/apps/web/app/(ee)/api/partner-profile/programs/[programId]/analytics/route.ts b/apps/web/app/(ee)/api/partner-profile/programs/[programId]/analytics/route.ts index cd6de8bb4f8..c17a863db23 100644 --- a/apps/web/app/(ee)/api/partner-profile/programs/[programId]/analytics/route.ts +++ b/apps/web/app/(ee)/api/partner-profile/programs/[programId]/analytics/route.ts @@ -2,20 +2,22 @@ import { getAnalytics } from "@/lib/analytics/get-analytics"; import { DubApiError } from "@/lib/api/errors"; import { getProgramEnrollmentOrThrow } from "@/lib/api/programs/get-program-enrollment-or-throw"; import { withPartnerProfile } from "@/lib/auth/partner"; +import { LARGE_PROGRAM_MIN_TOTAL_COMMISSIONS_CENTS } from "@/lib/partners/constants"; import { partnerProfileAnalyticsQuerySchema } from "@/lib/zod/schemas/partner-profile"; import { NextResponse } from "next/server"; // GET /api/partner-profile/programs/[programId]/analytics – get analytics for a program enrollment link export const GET = withPartnerProfile( async ({ partner, params, searchParams }) => { - const { program, links } = await getProgramEnrollmentOrThrow({ - partnerId: partner.id, - programId: params.programId, - include: { - program: true, - links: true, - }, - }); + const { program, links, totalCommissions } = + await getProgramEnrollmentOrThrow({ + partnerId: partner.id, + programId: params.programId, + include: { + program: true, + links: true, + }, + }); let { linkId, domain, key, ...rest } = partnerProfileAnalyticsQuerySchema.parse(searchParams); @@ -42,7 +44,8 @@ export const GET = withPartnerProfile( } const response = await getAnalytics({ - ...(program.id === "prog_1K0QHV7MP3PR05CJSCF5VN93X" + ...(program.id === "prog_1K0QHV7MP3PR05CJSCF5VN93X" && + totalCommissions < LARGE_PROGRAM_MIN_TOTAL_COMMISSIONS_CENTS ? { event: rest.event, groupBy: "count", interval: "all" } : rest), workspaceId: program.workspaceId, diff --git a/apps/web/app/(ee)/api/partner-profile/programs/[programId]/customers/[customerId]/route.ts b/apps/web/app/(ee)/api/partner-profile/programs/[programId]/customers/[customerId]/route.ts index eea1ad02cd3..ef185d2e97b 100644 --- a/apps/web/app/(ee)/api/partner-profile/programs/[programId]/customers/[customerId]/route.ts +++ b/apps/web/app/(ee)/api/partner-profile/programs/[programId]/customers/[customerId]/route.ts @@ -4,6 +4,7 @@ import { DubApiError } from "@/lib/api/errors"; import { getProgramEnrollmentOrThrow } from "@/lib/api/programs/get-program-enrollment-or-throw"; import { withPartnerProfile } from "@/lib/auth/partner"; import { generateRandomName } from "@/lib/names"; +import { LARGE_PROGRAM_MIN_TOTAL_COMMISSIONS_CENTS } from "@/lib/partners/constants"; import { PartnerProfileCustomerSchema } from "@/lib/zod/schemas/partner-profile"; import { prisma } from "@dub/prisma"; import { NextResponse } from "next/server"; @@ -13,7 +14,7 @@ import { z } from "zod"; export const GET = withPartnerProfile(async ({ partner, params }) => { const { customerId, programId } = params; - const { program, links, customerDataSharingEnabledAt } = + const { program, links, totalCommissions, customerDataSharingEnabledAt } = await getProgramEnrollmentOrThrow({ partnerId: partner.id, programId: programId, @@ -23,7 +24,10 @@ export const GET = withPartnerProfile(async ({ partner, params }) => { }, }); - if (program.id === "prog_1K0QHV7MP3PR05CJSCF5VN93X") { + if ( + program.id === "prog_1K0QHV7MP3PR05CJSCF5VN93X" && + totalCommissions < LARGE_PROGRAM_MIN_TOTAL_COMMISSIONS_CENTS + ) { throw new DubApiError({ code: "forbidden", message: "This feature is not available for your program.", diff --git a/apps/web/app/(ee)/api/partner-profile/programs/[programId]/events/route.ts b/apps/web/app/(ee)/api/partner-profile/programs/[programId]/events/route.ts index 92985404fa1..3cfa7e768b0 100644 --- a/apps/web/app/(ee)/api/partner-profile/programs/[programId]/events/route.ts +++ b/apps/web/app/(ee)/api/partner-profile/programs/[programId]/events/route.ts @@ -3,6 +3,7 @@ import { DubApiError } from "@/lib/api/errors"; import { getProgramEnrollmentOrThrow } from "@/lib/api/programs/get-program-enrollment-or-throw"; import { withPartnerProfile } from "@/lib/auth/partner"; import { generateRandomName } from "@/lib/names"; +import { LARGE_PROGRAM_MIN_TOTAL_COMMISSIONS_CENTS } from "@/lib/partners/constants"; import { PartnerProfileLinkSchema, partnerProfileEventsQuerySchema, @@ -13,7 +14,7 @@ import { z } from "zod"; // GET /api/partner-profile/programs/[programId]/events – get events for a program enrollment link export const GET = withPartnerProfile( async ({ partner, params, searchParams }) => { - const { program, links, customerDataSharingEnabledAt } = + const { program, links, totalCommissions, customerDataSharingEnabledAt } = await getProgramEnrollmentOrThrow({ partnerId: partner.id, programId: params.programId, @@ -23,7 +24,10 @@ export const GET = withPartnerProfile( }, }); - if (program.id === "prog_1K0QHV7MP3PR05CJSCF5VN93X") { + if ( + program.id === "prog_1K0QHV7MP3PR05CJSCF5VN93X" && + totalCommissions < LARGE_PROGRAM_MIN_TOTAL_COMMISSIONS_CENTS + ) { throw new DubApiError({ code: "forbidden", message: "This feature is not available for your program.", diff --git a/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/analytics/page.tsx b/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/analytics/page.tsx index 62bb2b7eb02..df172c5d59c 100644 --- a/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/analytics/page.tsx +++ b/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/analytics/page.tsx @@ -1,16 +1,7 @@ import Analytics from "@/ui/analytics"; import { PageContent } from "@/ui/layout/page-content"; -import { redirect } from "next/navigation"; -export default async function PartnerAnalytics({ - params, -}: { - params: Promise<{ programSlug: string }>; -}) { - const { programSlug } = await params; - if (programSlug === "perplexity") { - redirect(`/programs/${programSlug}`); - } +export default function PartnerAnalytics() { return ( diff --git a/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/customers/[customerId]/page-client.tsx b/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/customers/[customerId]/page-client.tsx index 0408116ab21..96962a8f60e 100644 --- a/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/customers/[customerId]/page-client.tsx +++ b/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/customers/[customerId]/page-client.tsx @@ -17,7 +17,7 @@ import { memo } from "react"; import useSWR from "swr"; export function ProgramCustomerPageClient() { - const { programEnrollment } = useProgramEnrollment(); + const { programEnrollment, showDetailedAnalytics } = useProgramEnrollment(); const { programSlug, customerId } = useParams<{ programSlug: string; customerId: string; @@ -27,8 +27,9 @@ export function ProgramCustomerPageClient() { customerId, }); - if ((!customer && !isLoading) || programSlug === "perplexity") + if ((!customer && !isLoading) || !showDetailedAnalytics) { redirect(`/programs/${programSlug}`); + } return (
diff --git a/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/earnings/earnings-table.tsx b/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/earnings/earnings-table.tsx index f25cd5be565..02609e0899c 100644 --- a/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/earnings/earnings-table.tsx +++ b/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/earnings/earnings-table.tsx @@ -42,7 +42,7 @@ type ColumnMeta = { export function EarningsTablePartner({ limit }: { limit?: number }) { const { programSlug } = useParams(); - const { programEnrollment } = useProgramEnrollment(); + const { programEnrollment, showDetailedAnalytics } = useProgramEnrollment(); const { queryParams, searchParamsObj, getQueryString } = useRouterStuff(); const { sortBy = "createdAt", sortOrder = "desc" } = searchParamsObj as { @@ -139,9 +139,9 @@ export function EarningsTablePartner({ limit }: { limit?: number }) { diff --git a/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/events/page.tsx b/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/events/page.tsx index a3d29b15cf2..180d2d989ee 100644 --- a/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/events/page.tsx +++ b/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/events/page.tsx @@ -1,16 +1,7 @@ import Events from "@/ui/analytics/events"; import { PageContent } from "@/ui/layout/page-content"; -import { redirect } from "next/navigation"; -export default async function ProgramEvents({ - params, -}: { - params: Promise<{ programSlug: string }>; -}) { - const { programSlug } = await params; - if (programSlug === "perplexity") { - redirect(`/programs/${programSlug}`); - } +export default function ProgramEvents() { return ( diff --git a/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/links/partner-link-card.tsx b/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/links/partner-link-card.tsx index 43757f1372f..f90251aceec 100644 --- a/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/links/partner-link-card.tsx +++ b/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/links/partner-link-card.tsx @@ -32,7 +32,6 @@ import { } from "@dub/utils"; import NumberFlow from "@number-flow/react"; import Link from "next/link"; -import { useParams } from "next/navigation"; import { ComponentProps, memo, @@ -67,8 +66,7 @@ const CHARTS = [ ]; export function PartnerLinkCard({ link }: { link: PartnerProfileLinkProps }) { - const { programSlug } = useParams(); - const { programEnrollment } = useProgramEnrollment(); + const { programEnrollment, showDetailedAnalytics } = useProgramEnrollment(); const partnerLink = constructPartnerLink({ group: programEnrollment?.group, @@ -205,12 +203,12 @@ export function PartnerLinkCard({ link }: { link: PartnerProfileLinkProps }) {
)} - {programSlug == "perplexity" && } + {!showDetailedAnalytics && } - {programSlug !== "perplexity" && } + {showDetailedAnalytics && } ); } diff --git a/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/page-client.tsx b/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/page-client.tsx index 4b2920f5072..24b519730e4 100644 --- a/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/page-client.tsx +++ b/apps/web/app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/page-client.tsx @@ -70,7 +70,7 @@ export default function ProgramPageClient() { false, ); - const { programEnrollment } = useProgramEnrollment(); + const { programEnrollment, showDetailedAnalytics } = useProgramEnrollment(); const [copied, copyToClipboard] = useCopyToClipboard(); const { @@ -236,18 +236,18 @@ export default function ProgramPageClient() { - {programSlug === "perplexity" ? ( - <> - - - - - ) : ( + {showDetailedAnalytics ? ( <> + ) : ( + <> + + + + )} diff --git a/apps/web/lib/partners/constants.ts b/apps/web/lib/partners/constants.ts index 19e370b3779..55aa9255ffe 100644 --- a/apps/web/lib/partners/constants.ts +++ b/apps/web/lib/partners/constants.ts @@ -6,13 +6,16 @@ export const PAYOUTS_SHEET_ITEMS_LIMIT = 10; export const BOUNTY_DESCRIPTION_MAX_LENGTH = 5000; export const REFERRALS_EMBED_EARNINGS_LIMIT = 8; export const CUSTOMER_PAGE_EVENTS_LIMIT = 8; + +export const LARGE_PROGRAM_MIN_TOTAL_COMMISSIONS_CENTS = 500000; // $5000 + export const PAYOUT_FAILURE_FEE_CENTS = 1000; // 10 USD -export const FOREX_MARKUP_RATE = 0.005; // 0.5% -export const MIN_WITHDRAWAL_AMOUNT_CENTS = 1000; // $10 -export const BELOW_MIN_WITHDRAWAL_FEE_CENTS = 50; // $0.50 export const FAST_ACH_FEE_CENTS = 2500; // $25 +export const FOREX_MARKUP_RATE = 0.005; // 0.5% export const ALLOWED_MIN_PAYOUT_AMOUNTS = [0, 2000, 5000, 10000]; +export const MIN_WITHDRAWAL_AMOUNT_CENTS = 1000; // $10 +export const BELOW_MIN_WITHDRAWAL_FEE_CENTS = 50; // $0.50 export const MAX_INVITES_PER_REQUEST = 5; export const MAX_PARTNER_USERS = 10; diff --git a/apps/web/lib/swr/use-program-enrollment.ts b/apps/web/lib/swr/use-program-enrollment.ts index dccc4bd20f4..c775636d4b3 100644 --- a/apps/web/lib/swr/use-program-enrollment.ts +++ b/apps/web/lib/swr/use-program-enrollment.ts @@ -2,6 +2,7 @@ import { fetcher } from "@dub/utils"; import { useSession } from "next-auth/react"; import { useParams } from "next/navigation"; import useSWR, { SWRConfiguration } from "swr"; +import { LARGE_PROGRAM_MIN_TOTAL_COMMISSIONS_CENTS } from "../partners/constants"; import { ProgramEnrollmentProps } from "../types"; export default function useProgramEnrollment({ @@ -31,6 +32,10 @@ export default function useProgramEnrollment({ return { programEnrollment, + showDetailedAnalytics: + programSlug !== "perplexity" || + (programEnrollment?.totalCommissions ?? 0) >= + LARGE_PROGRAM_MIN_TOTAL_COMMISSIONS_CENTS, error, loading: status === "loading" || isLoading, }; diff --git a/apps/web/lib/zod/schemas/groups.ts b/apps/web/lib/zod/schemas/groups.ts index f5fc40fb937..feb209b8c60 100644 --- a/apps/web/lib/zod/schemas/groups.ts +++ b/apps/web/lib/zod/schemas/groups.ts @@ -19,8 +19,7 @@ export const DEFAULT_PARTNER_GROUP = { } as const; export const MAX_DEFAULT_PARTNER_LINKS = 5; - -export const MAX_ADDITIONAL_PARTNER_LINKS = 20; +export const MAX_ADDITIONAL_PARTNER_LINKS = 100; export const GROUPS_MAX_PAGE_SIZE = 100; diff --git a/apps/web/scripts/partners/aggregate-stats.ts b/apps/web/scripts/partners/aggregate-stats.ts deleted file mode 100644 index ea9658fc573..00000000000 --- a/apps/web/scripts/partners/aggregate-stats.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { PartnerActivityEvent } from "@/lib/upstash/redis-streams"; -import { prisma } from "@dub/prisma"; -import "dotenv-flow/config"; - -// PoC script to test /api/cron/streams/update-partner-stats cron job -async function main() { - const entries: { data: PartnerActivityEvent }[] = [ - { - data: { - programId: "prog_1K0QHV7MP3PR05CJSCF5VN93X", - partnerId: "pn_1K70XNZ8SER75KBPDRQ67VVR8", - eventType: "lead", - timestamp: "2021-01-01", - }, - }, - { - data: { - programId: "prog_1K0QHV7MP3PR05CJSCF5VN93X", - partnerId: "pn_1K78CZY3TJ7QQKZ2NKA0FKZ00", - eventType: "lead", - timestamp: "2021-01-01", - }, - }, - { - data: { - programId: "prog_1K0QHV7MP3PR05CJSCF5VN93X", - partnerId: "pn_1K76V6FJ24X3PHB7WK972WHKW", - eventType: "lead", - timestamp: "2021-01-01", - }, - }, - { - data: { - programId: "prog_1K0QHV7MP3PR05CJSCF5VN93X", - partnerId: "pn_1K76V6FJ24X3PHB7WK972WHKW", - eventType: "click", - timestamp: "2021-01-01", - }, - }, - { - data: { - programId: "prog_1K0QHV7MP3PR05CJSCF5VN93X", - partnerId: "pn_1K76V6FJ24X3PHB7WK972WHKW", - eventType: "click", - timestamp: "2021-01-01", - }, - }, - { - data: { - programId: "prog_1K0QHV7MP3PR05CJSCF5VN93X", - partnerId: "pn_1K76V6FJ24X3PHB7WK972WHKW", - eventType: "click", - timestamp: "2021-01-01", - }, - }, - { - data: { - programId: "prog_1K0QHV7MP3PR05CJSCF5VN93X", - partnerId: "pn_1K76V6FJ24X3PHB7WK972WHKW", - eventType: "commission", - timestamp: "2021-01-01", - }, - }, - ]; - - const programEnrollmentActivity = entries.reduce( - (acc, entry) => { - const { programId, partnerId, eventType } = entry.data; - const key = eventType === "commission" ? "commissionStats" : "linkStats"; - const eventTypesSet = new Set(acc[key]); - eventTypesSet.add(`${programId}:${partnerId}`); - acc[key] = Array.from(eventTypesSet); - return acc; - }, - { linkStats: [], commissionStats: [] } as Record, - ); - - const programEnrollmentsToUpdate: Record< - string, - { - totalClicks?: number; - totalLeads?: number; - totalConversions?: number; - totalSales?: number; - totalSaleAmount?: number; - totalCommissions?: number; - } - > = {}; - - if (programEnrollmentActivity.linkStats.length > 0) { - const programIds = programEnrollmentActivity.linkStats.map( - (p) => p.split(":")[0], - ); - const partnerIds = programEnrollmentActivity.linkStats.map( - (p) => p.split(":")[1], - ); - const partnerLinkStats = await prisma.link.groupBy({ - by: ["programId", "partnerId"], - where: { - programId: { - in: programIds, - }, - partnerId: { - in: partnerIds, - }, - }, - _sum: { - clicks: true, - leads: true, - conversions: true, - sales: true, - saleAmount: true, - }, - }); - - partnerLinkStats.map((p) => { - programEnrollmentsToUpdate[`${p.programId}:${p.partnerId}`] = { - totalClicks: p._sum.clicks ?? undefined, - totalLeads: p._sum.leads ?? undefined, - totalConversions: p._sum.conversions ?? undefined, - totalSales: p._sum.sales ?? undefined, - totalSaleAmount: p._sum.saleAmount ?? undefined, - }; - }); - } - - if (programEnrollmentActivity.commissionStats.length > 0) { - const programIds = programEnrollmentActivity.commissionStats.map( - (p) => p.split(":")[0], - ); - const partnerIds = programEnrollmentActivity.commissionStats.map( - (p) => p.split(":")[1], - ); - const partnerCommissionStats = await prisma.commission.groupBy({ - by: ["programId", "partnerId"], - where: { - earnings: { not: 0 }, - programId: { - in: programIds, - }, - partnerId: { - in: partnerIds, - }, - status: { in: ["pending", "processed", "paid"] }, - }, - _sum: { - earnings: true, - }, - }); - partnerCommissionStats.map((p) => { - programEnrollmentsToUpdate[`${p.programId}:${p.partnerId}`] = { - ...programEnrollmentsToUpdate[`${p.programId}:${p.partnerId}`], // need to keep the other stats - totalCommissions: p._sum.earnings ?? undefined, - }; - }); - } - - const programEnrollmentsToUpdateArray = Object.entries( - programEnrollmentsToUpdate, - ).map(([key, value]) => ({ - programId: key.split(":")[0], - partnerId: key.split(":")[1], - ...value, - })); - - console.table(programEnrollmentsToUpdateArray); -} - -main(); diff --git a/apps/web/ui/layout/sidebar/partners-sidebar-nav.tsx b/apps/web/ui/layout/sidebar/partners-sidebar-nav.tsx index 45669616a31..63483b6d28b 100644 --- a/apps/web/ui/layout/sidebar/partners-sidebar-nav.tsx +++ b/apps/web/ui/layout/sidebar/partners-sidebar-nav.tsx @@ -38,6 +38,7 @@ type SidebarNavData = { invitationsCount?: number; unreadMessagesCount?: number; programBountiesCount?: number; + showDetailedAnalytics?: boolean; }; const NAV_GROUPS: SidebarNavGroups = ({ @@ -147,6 +148,7 @@ const NAV_AREAS: SidebarNavAreas = { isUnapproved, queryString, programBountiesCount, + showDetailedAnalytics, }) => ({ title: (
@@ -186,7 +188,7 @@ const NAV_AREAS: SidebarNavAreas = { href: `/programs/${programSlug}/earnings${queryString}`, locked: isUnapproved, }, - ...(programSlug !== "perplexity" + ...(showDetailedAnalytics ? [ { name: "Analytics", @@ -264,7 +266,7 @@ export function PartnersSidebarNav({ const { programSlug } = useParams() as { programSlug?: string; }; - const { programEnrollment } = useProgramEnrollment(); + const { programEnrollment, showDetailedAnalytics } = useProgramEnrollment(); const pathname = usePathname(); const { getQueryString } = useRouterStuff(); @@ -316,6 +318,7 @@ export function PartnersSidebarNav({ invitationsCount, unreadMessagesCount, programBountiesCount: bountiesCount.active, + showDetailedAnalytics, }} toolContent={toolContent} newsContent={newsContent} diff --git a/packages/email/src/templates/partner-deactivated.tsx b/packages/email/src/templates/partner-deactivated.tsx index b4e3504ed29..0c9089ff7ed 100644 --- a/packages/email/src/templates/partner-deactivated.tsx +++ b/packages/email/src/templates/partner-deactivated.tsx @@ -20,7 +20,7 @@ export default function PartnerDeactivated({ email: "panic@thedis.co", }, program = { - name: "Perplexity", + name: "Acme", slug: "acme", }, deactivatedReason,