Skip to content
Closed
Show file tree
Hide file tree
Changes from 35 commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
aa5e852
fiter-sidebar component
pepeladeira May 25, 2026
4097631
Merge branch 'main' into program-marketplace-categories
pepeladeira May 26, 2026
c2e80a4
Merge branch 'main' into program-marketplace-categories
pepeladeira May 27, 2026
ff37994
add filters in partners sidebar
pepeladeira May 27, 2026
514d720
url design
pepeladeira May 27, 2026
5da2d69
Merge branch 'main' into program-marketplace-categories
pepeladeira May 29, 2026
bbe1dda
ui improvements
pepeladeira May 30, 2026
e2342fc
Merge branch 'main' into program-marketplace-categories
pepeladeira Jun 3, 2026
c2d35fb
Merge branch 'main' into program-marketplace-categories
pepeladeira Jun 3, 2026
2147efd
update url design
pepeladeira Jun 3, 2026
083eeb2
popular and newest
pepeladeira Jun 3, 2026
17fc234
fix grid and padding
pepeladeira Jun 3, 2026
a323e22
mobile filter and sort
pepeladeira Jun 3, 2026
54f4d70
url design filter
pepeladeira Jun 3, 2026
040b7c1
Merge branch 'main' into program-marketplace-categories
pepeladeira Jun 4, 2026
24cc938
program details improvements
pepeladeira Jun 4, 2026
d3c69fb
Merge branch 'main' into program-marketplace-categories
pepeladeira Jun 5, 2026
840c78c
update identityProgramSlug
pepeladeira Jun 5, 2026
496c241
update header title and description
pepeladeira Jun 5, 2026
189c16c
grid lines
pepeladeira Jun 5, 2026
23501e1
nav changes
pepeladeira Jun 5, 2026
96ff6f4
feature bg colors
pepeladeira Jun 5, 2026
74c556b
fix padding
pepeladeira Jun 5, 2026
d700184
code cleanup
pepeladeira Jun 8, 2026
356a0df
code cleanup
pepeladeira Jun 8, 2026
d3a8c13
Merge branch 'main' into program-marketplace-categories
pepeladeira Jun 8, 2026
f0aa401
Merge branch 'main' into program-marketplace-categories
pepeladeira Jun 10, 2026
041e66b
marketplace seo review
pepeladeira Jun 10, 2026
af66776
Merge branch 'main' into program-marketplace-categories
pepeladeira Jun 10, 2026
5000061
cleanup
pepeladeira Jun 10, 2026
1854c30
design reviews
pepeladeira Jun 11, 2026
02ecf76
Merge branch 'main' into program-marketplace-categories
pepeladeira Jun 11, 2026
507cf2e
code improvements
pepeladeira Jun 11, 2026
758f173
code improvements
pepeladeira Jun 11, 2026
853aedd
layout improvements
pepeladeira Jun 11, 2026
ce7713e
Merge branch 'main' into program-marketplace-categories
steven-tey Jun 14, 2026
b773f2b
ui/partners/program-marketplace → ui/program-marketplace
steven-tey Jun 14, 2026
838ae43
fix ts import errors
steven-tey Jun 14, 2026
a4be989
remove sort by invoices (rely on marketplaceRanking)
steven-tey Jun 14, 2026
5102c74
Merge branch 'main' into program-marketplace-categories
pepeladeira Jun 15, 2026
3c8c18e
enable marketplace ISR, drop searchParams and update seo title
pepeladeira Jun 15, 2026
f0bdf91
update program-card rewards and categories
pepeladeira Jun 15, 2026
ab8309a
Merge branch 'main' into program-marketplace-categories
steven-tey Jun 16, 2026
26ac991
add category backlinks from partner page
general-adhoc Jun 16, 2026
fb25e40
Merge branch 'main' into program-marketplace-categories
steven-tey Jun 17, 2026
53f7144
Merge branch 'main' into program-marketplace-categories
pepeladeira Jun 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ function CommissionsPageClient() {
}
>
<a
href={`https://partners.dub.co/programs/marketplace/${row.original.slug}`}
href={`https://partners.dub.co/marketplace/${row.original.slug}`}
target="_blank"
rel="noopener noreferrer"
className={cn(
Expand Down
2 changes: 1 addition & 1 deletion apps/web/app/(ee)/api/network/programs/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ export const GET = withPartnerProfile(async ({ partner, searchParams }) => {
},
orderBy:
sortBy === "popularity"
? {}
? { marketplaceRanking: "asc" }
: {
[sortBy === "recency" ? "addedToMarketplaceAt" : sortBy]: sortOrder,
},
Expand Down
68 changes: 57 additions & 11 deletions apps/web/app/(ee)/api/track/application/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
recordClickZodSchema,
} from "@/lib/tinybird/record-click-zod";
import { ratelimit } from "@/lib/upstash";
import { MARKETPLACE_RESERVED_SLUGS } from "@/ui/partners/program-marketplace/utils/urls";
import { prisma } from "@dub/prisma";
import { Partner, Program } from "@dub/prisma/client";
import {
Expand Down Expand Up @@ -419,8 +420,16 @@ async function getRequestContext(
// Supports:
// - https://partners.dub.co/{programSlug}
// - https://partners.dub.co/programs/{programSlug}/apply
// - https://partners.dub.co/programs/marketplace/{programSlug}
// - https://partners.dub.co/marketplace/{programSlug}
// - https://dub.co/marketplace/{programSlug}
// - https://partners.dub.co/programs/marketplace/{programSlug} (legacy)
// - https://partners.dub.co/register (platform-level signup -> network program)
//
// Marketplace list routes (no program slug):
// - /marketplace
// - /marketplace/all
// - /marketplace/popular
// - /marketplace/c/{category}
function identityProgramSlug(url: string) {
try {
const urlObj = new URL(url);
Expand All @@ -430,23 +439,60 @@ function identityProgramSlug(url: string) {
return { programSlug: null, isMarketplace: false };
}

// Platform-level /register page is associated with the network program
if (parts[0] === "register") {
return { programSlug: NETWORK_PROGRAM_SLUG, isMarketplace: false };
}

const isMarketplace = parts[0] === "programs" && parts[1] === "marketplace";
const programSlug = isMarketplace // e.g. https://partners.dub.co/programs/marketplace/acme
? parts[2]
: parts[0] === "programs" // e.g. https://partners.dub.co/programs/acme/apply
? parts[1]
: parts[0]; // e.g. https://partners.dub.co/acme, or https://partners.dub.co/acme/apply, or https://partners.dub.co/acme/group/apply
if (parts[0] === "marketplace") {
if (parts.length === 1) {
return { programSlug: null, isMarketplace: false };
}

if (parts[1] === "c") {
return { programSlug: null, isMarketplace: false };
}

if (parts.length === 2 && MARKETPLACE_RESERVED_SLUGS.has(parts[1])) {
return { programSlug: null, isMarketplace: false };
}

if (parts.length === 2) {
return {
programSlug: parts[1].toLowerCase(),
isMarketplace: true,
};
}

return { programSlug: null, isMarketplace: false };
}

if (parts[0] === "programs" && parts[1] === "marketplace") {
if (!parts[2] || MARKETPLACE_RESERVED_SLUGS.has(parts[2])) {
return { programSlug: null, isMarketplace: false };
}

return {
programSlug: parts[2].toLowerCase(),
isMarketplace: true,
};
}

if (parts[0] === "programs") {
if (!parts[1]) {
return { programSlug: null, isMarketplace: false };
}

return {
programSlug: parts[1].toLowerCase(),
isMarketplace: false,
};
}

return {
programSlug: programSlug.toLowerCase(),
isMarketplace,
programSlug: parts[0].toLowerCase(),
isMarketplace: false,
};
} catch (error) {
} catch {
return { programSlug: null, isMarketplace: false };
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { MarketplaceRouter } from "@/ui/partners/program-marketplace/marketplace-router";
import {
generateMarketplaceProgramStaticParams,
revalidate,
} from "@/ui/partners/program-marketplace/pages/marketplace-program-page";
import { getMarketplacePopularRedirectHref } from "@/ui/partners/program-marketplace/utils/urls";
import { redirect } from "next/navigation";

export { revalidate };

export async function generateStaticParams() {
return generateMarketplaceProgramStaticParams();
}

export default async function MarketplacePage(props: {
params: Promise<{ slug?: string[] }>;
searchParams: Promise<Record<string, string | string[] | undefined>>;
}) {
const { slug } = await props.params;
const searchParams = await props.searchParams;

if (slug?.length === 1 && slug[0] === "popular") {
redirect(getMarketplacePopularRedirectHref(searchParams));
}

return <MarketplaceRouter slug={slug} />;
}
Loading
Loading