Merge pull request #50 from yusufipk/feat/acquisition-analytics

feat(analytics): record where paying customers actually came from
This commit is contained in:
Yusuf İpek
2026-08-05 18:47:51 +03:00
committed by GitHub
49 changed files with 3797 additions and 26 deletions
+7 -6
View File
@@ -2,6 +2,7 @@
import Image from 'next/image';
import Link from 'next/link';
import { CtaLink } from '@/components/marketing/cta-link';
import { MarketingCompareLinks } from '@/components/marketing/marketing-compare-links';
import { useEffect, useRef } from 'react';
import { gsap } from 'gsap';
@@ -258,13 +259,13 @@ export function LandingPage({ isLoggedIn }: LandingPageProps) {
data-hero-copy
className="mx-auto flex max-w-md flex-col items-center justify-center gap-3"
>
<Link
<CtaLink
href={hostedCtaHref}
className="group relative isolate inline-flex h-12 min-w-max items-center justify-center overflow-hidden border border-primary bg-primary px-10 text-sm font-medium whitespace-nowrap text-primary-foreground transition-transform duration-300 hover:scale-[1.02]"
>
Start free trial
<MoveRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Link>
</CtaLink>
<p className="text-xs text-muted-foreground">
7-day free trial · Flat $10/mo no per-seat fees · No client accounts
@@ -717,12 +718,12 @@ export function LandingPage({ isLoggedIn }: LandingPageProps) {
Need more storage? Add 100 GB for $5/mo.
</p>
<Link
<CtaLink
href={hostedCtaHref}
className="mt-auto group relative isolate inline-flex h-12 w-full items-center justify-center overflow-hidden bg-[#06b6d4] font-medium text-black transition-colors hover:bg-[#06b6d4]/90 text-sm"
>
Start free trial
</Link>
</CtaLink>
</div>
{/* Card 2: Fair Source (Self-hosted) */}
@@ -901,12 +902,12 @@ export function LandingPage({ isLoggedIn }: LandingPageProps) {
Your first review link takes minutes.
</p>
</div>
<Link
<CtaLink
href={hostedCtaHref}
className="group relative isolate inline-flex h-12 min-w-max items-center justify-center overflow-hidden border border-primary bg-primary px-10 text-sm font-medium whitespace-nowrap text-primary-foreground transition-transform duration-300 hover:scale-[1.02] md:min-w-[240px]"
>
Start free trial
</Link>
</CtaLink>
</div>
</section>
</main>
+5 -4
View File
@@ -1,5 +1,6 @@
import Link from 'next/link';
import { ArrowRight, Github, MoveRight } from 'lucide-react';
import { CtaLink } from '@/components/marketing/cta-link';
import { FeatureComparisonTable } from '@/components/marketing/feature-comparison-table';
import { MarketingFooter } from '@/components/marketing/marketing-footer';
import { MarketingHeader } from '@/components/marketing/marketing-header';
@@ -41,13 +42,13 @@ export function ComparisonPage({ page, isLoggedIn }: ComparisonPageProps) {
$10/month hosted plan covers your whole team and every client reviewer link.
</p>
<div className="mt-8 flex flex-col gap-3 sm:flex-row">
<Link
<CtaLink
href={hostedCtaHref}
className="group relative isolate inline-flex h-12 items-center justify-center overflow-hidden border border-primary bg-primary px-8 text-sm font-medium text-primary-foreground transition-transform duration-300 hover:scale-[1.02]"
>
Start free trial
<MoveRight className="ml-2 h-4 w-4 transition-transform group-hover:translate-x-1" />
</Link>
</CtaLink>
<a
href={seoConfig.githubUrl}
target="_blank"
@@ -199,12 +200,12 @@ export function ComparisonPage({ page, isLoggedIn }: ComparisonPageProps) {
</p>
</div>
<div className="flex flex-col gap-3 sm:flex-row">
<Link
<CtaLink
href={hostedCtaHref}
className="inline-flex h-12 items-center justify-center border border-primary bg-primary px-8 text-sm font-medium text-primary-foreground"
>
Start free trial
</Link>
</CtaLink>
<a
href={seoConfig.githubUrl}
target="_blank"
+30
View File
@@ -0,0 +1,30 @@
'use client';
import Link from 'next/link';
import { trackCtaClick } from '@/lib/client/track';
interface CtaLinkProps {
href: string;
className?: string;
children: React.ReactNode;
}
/**
* A marketing call to action that reports the click.
*
* Only the signup CTA counts. The same button reads "Start free trial" and
* points at `/dashboard` once you are signed in, and an existing customer
* clicking through to their own dashboard is not a step in the acquisition
* funnel.
*/
export function CtaLink({ href, className, children }: CtaLinkProps) {
return (
<Link
href={href}
className={className}
onClick={href === '/register' ? trackCtaClick : undefined}
>
{children}
</Link>
);
}