From b3d56942b2bafb5231d77f9a56abc92a37ead932 Mon Sep 17 00:00:00 2001 From: Recoupable Date: Sat, 11 Jul 2026 16:36:36 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20add=20/compare=20page=20=E2=80=94=20com?= =?UTF-8?q?petitive=20comparison=20(Recoup=20vs=20agencies,=20teams,=20gen?= =?UTF-8?q?eric=20AI)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Comparison grid: 7 capabilities across 4 alternatives with support indicators - Real cost savings section using Rostrum, Fat Beats, Parlophone data - ChatGPT objection handler section - Copy in lib/copy/compare.ts (single source of truth pattern) - Added Compare to header nav + footer resources - Responsive, matches existing design system --- app/compare/page.tsx | 194 +++++++++++++++++++++++++++++++++++++++++++ lib/copy/compare.ts | 129 ++++++++++++++++++++++++++++ lib/nav.ts | 2 + 3 files changed, 325 insertions(+) create mode 100644 app/compare/page.tsx create mode 100644 lib/copy/compare.ts diff --git a/app/compare/page.tsx b/app/compare/page.tsx new file mode 100644 index 0000000..fda39d5 --- /dev/null +++ b/app/compare/page.tsx @@ -0,0 +1,194 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { Check, X, Minus, ArrowRight } from "lucide-react"; +import { compareCopy, type SupportLevel } from "@/lib/copy/compare"; +import { buildPageMetadata } from "@/lib/seo"; +import { siteConfig } from "@/lib/config"; + +export const metadata: Metadata = buildPageMetadata({ + title: `Why Recoup? — Compare AI Music Agents vs Agencies & Generic AI | ${siteConfig.name}`, + description: + "See how Recoup's purpose-built music agents compare to hiring staff, creative agencies, and generic AI like ChatGPT. Real cost savings from real labels.", + path: "/compare", +}); + +/* ── support-level icon ── */ +function SupportIcon({ level }: { level: SupportLevel }) { + if (level === "full") + return ( + + + + ); + if (level === "partial") + return ( + + + + ); + return ( + + + + ); +} + +export default function ComparePage() { + const c = compareCopy; + + return ( +
+ {/* ── Hero ── */} +
+

+ {c.title} +

+

+ {c.description} +

+
+ + {/* ── Comparison Grid ── */} +
+ {/* column headers — desktop */} +
+
Capability
+ {c.columns.map((col) => ( +
+ {col} +
+ ))} +
+ +
+ {c.rows.map((row) => ( +
+ {/* Desktop row */} +
+
+ {row.capability} +
+ {(["recoup", "humans", "agency", "genericAI"] as const).map( + (key) => ( +
+ + + {row[key].note} + +
+ ) + )} +
+ + {/* Mobile card */} +
+

+ {row.capability} +

+
+ {(["recoup", "humans", "agency", "genericAI"] as const).map( + (key, i) => ( +
+ +
+
+ {c.columns[i]} +
+
+ {row[key].note} +
+
+
+ ) + )} +
+
+
+ ))} +
+
+ + {/* ── Cost Comparison ── */} +
+

+ {c.costTitle} +

+

+ {c.costDescription} +

+ +
+ {c.costs.map((cost) => ( +
+ + {cost.source} + +

+ {cost.label} +

+
+ {cost.traditional} +
+
+ {cost.recoup} +
+

{cost.savings}

+
+ ))} +
+
+ + {/* ── ChatGPT Objection ── */} +
+
+

+ {c.chatgptTitle} +

+

+ {c.chatgptDescription} +

+ +
+ {c.chatgptPoints.map((point) => ( +
+ + + + {point} +
+ ))} +
+ +

+ {c.chatgptPunchline} +

+
+
+ + {/* ── CTA ── */} +
+
+ + {c.ctaPrimary.label} + + + + {c.ctaSecondary.label} + +
+
+
+ ); +} diff --git a/lib/copy/compare.ts b/lib/copy/compare.ts new file mode 100644 index 0000000..0d122b1 --- /dev/null +++ b/lib/copy/compare.ts @@ -0,0 +1,129 @@ +/** + * Compare page copy — single source of truth. + * Competitive comparison: Recoup vs alternatives. + */ + +export type SupportLevel = "full" | "partial" | "none"; + +export interface ComparisonRow { + capability: string; + recoup: { level: SupportLevel; note: string }; + humans: { level: SupportLevel; note: string }; + agency: { level: SupportLevel; note: string }; + genericAI: { level: SupportLevel; note: string }; +} + +export interface CostRow { + label: string; + traditional: string; + recoup: string; + savings: string; + source: string; +} + +export const compareCopy = { + title: "Why Recoup?", + description: + "Generic AI doesn't understand music. Agencies are slow and expensive. Recoup is purpose-built music intelligence — agents that know your artists, your data, and your industry.", + + columns: ["Recoup", "In-House Team", "Creative Agency", "ChatGPT / Claude"] as const, + + rows: [ + { + capability: "Content Creation", + recoup: { level: "full", note: "30 days of branded content in one session" }, + humans: { level: "full", note: "High quality, slow turnaround" }, + agency: { level: "full", note: "$5K+/mo, days per batch" }, + genericAI: { level: "partial", note: "Can write, but no artist context" }, + }, + { + capability: "Artist Research", + recoup: { level: "full", note: "Streaming, social, audience, playlists — live data" }, + humans: { level: "partial", note: "Manual data pulls, hours per report" }, + agency: { level: "none", note: "Not typically offered" }, + genericAI: { level: "partial", note: "No access to streaming APIs" }, + }, + { + capability: "Release Strategy", + recoup: { level: "full", note: "Data-informed, auto-generated per release" }, + humans: { level: "full", note: "Experienced, but expensive" }, + agency: { level: "partial", note: "Template-based, not data-driven" }, + genericAI: { level: "partial", note: "Generic advice, no real data" }, + }, + { + capability: "Social Analytics", + recoup: { level: "full", note: "Cross-platform scraping + insights" }, + humans: { level: "partial", note: "Manual exports from each platform" }, + agency: { level: "partial", note: "Monthly reports, often delayed" }, + genericAI: { level: "none", note: "No platform access" }, + }, + { + capability: "Catalog Valuation", + recoup: { level: "full", note: "Real-time from streaming data" }, + humans: { level: "partial", note: "Requires specialist + weeks" }, + agency: { level: "none", note: "Not offered" }, + genericAI: { level: "none", note: "No valuation models" }, + }, + { + capability: "Automated Reporting", + recoup: { level: "full", note: "Weekly reports, zero human effort" }, + humans: { level: "partial", note: "40+ hours/month for a team of 5" }, + agency: { level: "partial", note: "Monthly cadence, manual process" }, + genericAI: { level: "none", note: "No scheduling or automation" }, + }, + { + capability: "Agent Plugin Ecosystem", + recoup: { level: "full", note: "Install plugins in Claude, Cursor, Codex" }, + humans: { level: "none", note: "N/A" }, + agency: { level: "none", note: "N/A" }, + genericAI: { level: "partial", note: "General tools, no music plugins" }, + }, + ] satisfies ComparisonRow[], + + costTitle: "The real cost of alternatives", + costDescription: + "These aren't hypothetical. They're from real labels who switched to Recoup.", + + costs: [ + { + label: "Creative Director", + traditional: "$10,000/mo", + recoup: "72-hour campaign delivery", + savings: "$10K saved on a single campaign", + source: "Fat Beats", + }, + { + label: "Content Agency", + traditional: "$5,000/mo", + recoup: "Same price, 10× the output", + savings: "Agency eliminated + new AI artist co-created", + source: "Rostrum Records", + }, + { + label: "Manual Reporting", + traditional: "40+ staff hours/mo", + recoup: "Automated, $0 marginal cost", + savings: "$3K–$5K/mo in staff time", + source: "Parlophone (Warner)", + }, + ] satisfies CostRow[], + + chatgptTitle: "But can't I just use ChatGPT?", + chatgptDescription: + "ChatGPT can write a marketing plan. Recoup writes one informed by your artist's actual streaming data, audience demographics, playlist history, and competitive landscape.", + + chatgptPoints: [ + "No access to streaming analytics (Spotify, Apple Music, Chartmetric)", + "No playlist intelligence or placement tracking", + "No artist context — brand voice, catalog history, audience segments", + "No automated workflows — can't schedule reports or content pipelines", + "No music industry data models — catalog valuation, royalty estimation", + "No plugin ecosystem — can't extend with music-specific tools", + ], + + chatgptPunchline: + "Generic AI is a blank canvas. Recoup is a music business that already knows your artists.", + + ctaPrimary: { label: "See it in action", href: "/valuation" }, + ctaSecondary: { label: "View pricing", href: "/pricing" }, +}; diff --git a/lib/nav.ts b/lib/nav.ts index 956cf3b..0bdef7e 100644 --- a/lib/nav.ts +++ b/lib/nav.ts @@ -6,6 +6,7 @@ import { siteConfig } from "@/lib/config"; export const nav: readonly { label: string; href: string; external?: boolean }[] = [ { label: "Results", href: "/results" }, + { label: "Compare", href: "/compare" }, { label: "Pricing", href: "/pricing" }, { label: "Docs", href: siteConfig.docsUrl, external: true }, { label: "Blog", href: "/blog" }, @@ -24,6 +25,7 @@ export const footerNav = { label: "Resources", items: [ { label: "Results", href: "/results" }, + { label: "Compare", href: "/compare" }, { label: "Blog", href: "/resources" }, { label: "AI Playbook", href: "/playbook" }, { label: "ROI Calculator", href: "/calculator" },