chore: Add additional comparison pages

This commit is contained in:
Dries Augustyns
2025-12-29 11:53:08 +01:00
parent bc8611a662
commit 98b95b2ab2
6 changed files with 2185 additions and 2 deletions
+429
View File
@@ -0,0 +1,429 @@
import {ComparisonTable, FAQSection, Footer, Navbar} from '../../components';
import {motion} from 'framer-motion';
import {DASHBOARD_URI, WIKI_URI} from '../../lib/constants';
import React from 'react';
import Link from 'next/link';
import {NextSeo} from 'next-seo';
import {ArrowRight, Code2, DollarSign, Globe, PackageOpen, Users, Zap} from 'lucide-react';
import type {ComparisonRow} from '../../components/ComparisonTable';
import type {FAQ} from '../../components/FAQSection';
const comparisonData: ComparisonRow[] = [
{feature: 'Pricing Model', plunk: 'Pay per email', competitor: 'Pay per subscriber'},
{feature: 'Target Audience', plunk: 'Developers', competitor: 'Creators/marketers'},
{feature: 'Open Source', plunk: true, competitor: false},
{feature: 'Self-Hostable', plunk: true, competitor: false},
{feature: 'Transactional Emails', plunk: true, competitor: false},
{feature: 'Marketing Campaigns', plunk: true, competitor: true},
{feature: 'Workflow Automation', plunk: true, competitor: true},
{feature: 'Landing Pages', plunk: false, competitor: true},
{feature: 'Product Selling', plunk: false, competitor: true},
{feature: 'API-First Design', plunk: true, competitor: false},
];
const faqs: FAQ[] = [
{
question: 'When should I choose ConvertKit over Plunk?',
answer:
"Choose ConvertKit if you're a creator who needs landing pages, product selling, and a creator-focused interface designed for non-technical users. ConvertKit excels at helping course creators, bloggers, and podcasters monetize their audience. Choose Plunk if you're a developer who values API-first design, needs transactional + marketing emails in one platform, and prefers code over visual builders.",
},
{
question: 'What is the pricing difference between Plunk and ConvertKit?',
answer:
'ConvertKit charges based on subscriber count—your cost increases as your list grows, regardless of how many emails you send. Plunk uses pay-as-you-go pricing where you only pay for emails actually sent. This means with ConvertKit, a list of 10,000 subscribers costs $119/month even if you rarely email them. With Plunk, you only pay when you send.',
},
{
question: 'Can Plunk handle creator workflows like ConvertKit?',
answer:
"Yes, Plunk supports email automation, workflows, and segmentation similar to ConvertKit. You can create automated sequences, trigger emails based on events, and segment your audience. The main difference is Plunk doesn't include landing page builders or product selling features—it's focused purely on email delivery and automation.",
},
{
question: 'Does Plunk have landing pages like ConvertKit?',
answer:
"No, Plunk doesn't include landing page or form builders. It's focused on being the best email platform for developers. If you need landing pages, you'd build them with your preferred tools and connect them to Plunk's API. This gives you full design control and keeps Plunk lightweight and developer-friendly.",
},
{
question: 'How easy is it to migrate from ConvertKit to Plunk?',
answer:
'Migration is straightforward. Export your subscribers from ConvertKit as CSV, import them to Plunk via our API or dashboard, recreate your email sequences using our workflow builder, and update your forms to use Plunk\'s API. Most migrations can be completed in a few hours. You\'ll need to rebuild landing pages separately if you rely on ConvertKit\'s landing page feature.',
},
];
/**
* Plunk vs ConvertKit comparison page
*/
export default function ConvertkitComparison() {
return (
<>
<NextSeo
title="ConvertKit Alternative for Developers | Plunk"
description="Developer-first alternative to ConvertKit. Pay per email instead of per subscriber. Open-source, self-hostable, with powerful automation—no landing page bloat."
canonical="https://www.useplunk.com/vs/convertkit"
openGraph={{
title: 'ConvertKit Alternative for Developers | Plunk',
description:
'Developer-first alternative to ConvertKit. Pay per email instead of per subscriber. Open-source, self-hostable, with powerful automation.',
url: 'https://www.useplunk.com/vs/convertkit',
images: [{url: 'https://www.useplunk.com/assets/card.png', alt: 'Plunk vs ConvertKit'}],
}}
/>
<Navbar />
<main className={'mx-auto max-w-7xl px-8 sm:px-0'}>
{/* Hero Section */}
<section className={'relative py-32 sm:py-48'}>
<div
className={
'absolute inset-0 -z-10 h-full w-full bg-white bg-[linear-gradient(to_right,#e5e7eb_1px,transparent_1px),linear-gradient(to_bottom,#e5e7eb_1px,transparent_1px)] bg-[size:4rem_4rem] [mask-image:radial-gradient(ellipse_80%_50%_at_50%_0%,#000_70%,transparent_110%)]'
}
/>
<motion.div
initial={{opacity: 0, y: 20}}
animate={{opacity: 1, y: 0}}
transition={{duration: 0.7, ease: [0.22, 1, 0.36, 1]}}
className={'mx-auto max-w-4xl text-center'}
>
<div
className={
'mb-6 inline-flex items-center gap-2 rounded-full border border-neutral-200 bg-white px-4 py-2'
}
>
<span className={'text-sm text-neutral-600'}>Comparing</span>
<span className={'text-sm font-semibold text-neutral-900'}>Plunk vs ConvertKit</span>
</div>
<h1 className={'text-6xl font-bold tracking-tight text-neutral-900 sm:text-7xl lg:text-8xl'}>
Open-source alternative
<br />
for ConvertKit
</h1>
<p className={'mx-auto mt-8 max-w-2xl text-xl text-neutral-600'}>
ConvertKit is built for creators. Plunk is built for developers who need powerful email automation without
the creator-focused bloat. Same automation, better DX, pay-as-you-go.
</p>
<div className={'mt-12 flex flex-wrap justify-center gap-4'}>
<motion.a
whileHover={{scale: 1.02}}
whileTap={{scale: 0.98}}
href={`${DASHBOARD_URI}/auth/signup`}
className={
'group rounded-lg bg-neutral-900 px-8 py-4 text-base font-semibold text-white shadow-lg shadow-neutral-900/10 transition hover:bg-neutral-800'
}
>
<span className={'flex items-center gap-2'}>
Get started free
<ArrowRight className="h-4 w-4 transition-transform group-hover:translate-x-1" />
</span>
</motion.a>
<Link
href={WIKI_URI}
target={'_blank'}
className={
'rounded-lg border border-neutral-300 bg-white px-8 py-4 text-base font-semibold text-neutral-900 transition hover:border-neutral-400'
}
>
View documentation
</Link>
</div>
</motion.div>
</section>
{/* Pricing Model Comparison */}
<section className={'py-32'}>
<motion.div
initial={{opacity: 0, y: 20}}
whileInView={{opacity: 1, y: 0}}
viewport={{once: true}}
transition={{duration: 0.7, ease: [0.22, 1, 0.36, 1]}}
className={'mb-16 text-center'}
>
<h2 className={'text-5xl font-bold tracking-tight text-neutral-900'}>
Pay for Emails, Not Subscribers
</h2>
<p className={'mt-4 text-lg text-neutral-600'}>Pricing that grows with usage, not list size</p>
</motion.div>
<div className={'grid gap-8 lg:grid-cols-2'}>
<motion.div
initial={{opacity: 0, x: -20}}
whileInView={{opacity: 1, x: 0}}
viewport={{once: true}}
transition={{duration: 0.7, ease: [0.22, 1, 0.36, 1]}}
className={'rounded-2xl border-2 border-neutral-900 bg-white p-10'}
>
<div className={'mb-4 inline-flex items-center gap-2 rounded-full bg-neutral-900 px-4 py-1.5'}>
<span className={'text-sm font-semibold text-white'}>Plunk</span>
</div>
<h3 className={'mt-6 text-2xl font-bold text-neutral-900'}>Pay per email sent</h3>
<p className={'mt-3 leading-relaxed text-neutral-600'}>
Pay-as-you-go pricing. Only pay for emails you send, not for subscribers you store.
</p>
<div className={'mt-6 text-4xl font-bold text-neutral-900'}>Pay-as-you-go</div>
<div className={'mt-8 space-y-3'}>
<div className={'flex items-center gap-3 text-sm text-neutral-600'}>
<div className={'h-5 w-5 rounded-full bg-neutral-900 flex items-center justify-center'}>
<div className={'h-1.5 w-1.5 rounded-full bg-white'} />
</div>
<span>Unlimited subscribers at no cost</span>
</div>
<div className={'flex items-center gap-3 text-sm text-neutral-600'}>
<div className={'h-5 w-5 rounded-full bg-neutral-900 flex items-center justify-center'}>
<div className={'h-1.5 w-1.5 rounded-full bg-white'} />
</div>
<span>Only pay when you actually send</span>
</div>
<div className={'flex items-center gap-3 text-sm text-neutral-600'}>
<div className={'h-5 w-5 rounded-full bg-neutral-900 flex items-center justify-center'}>
<div className={'h-1.5 w-1.5 rounded-full bg-white'} />
</div>
<span>Grow your list without price increases</span>
</div>
</div>
</motion.div>
<motion.div
initial={{opacity: 0, x: 20}}
whileInView={{opacity: 1, x: 0}}
viewport={{once: true}}
transition={{duration: 0.7, ease: [0.22, 1, 0.36, 1]}}
className={'rounded-2xl border border-neutral-200 bg-neutral-50 p-10'}
>
<div className={'mb-4 inline-flex items-center gap-2 rounded-full bg-neutral-200 px-4 py-1.5'}>
<span className={'text-sm font-semibold text-neutral-900'}>ConvertKit</span>
</div>
<h3 className={'mt-6 text-2xl font-bold text-neutral-900'}>Pay per subscriber count</h3>
<p className={'mt-3 leading-relaxed text-neutral-600'}>
Monthly subscription based on total subscribers, whether you email them or not.
</p>
<div className={'mt-6 text-4xl font-bold text-neutral-900'}>From $25/month</div>
<div className={'mt-8 space-y-3'}>
<div className={'flex items-center gap-3 text-sm text-neutral-600'}>
<div className={'h-5 w-5 rounded-full bg-neutral-300 flex items-center justify-center'}>
<div className={'h-1.5 w-1.5 rounded-full bg-neutral-600'} />
</div>
<span>Price increases with subscriber count</span>
</div>
<div className={'flex items-center gap-3 text-sm text-neutral-600'}>
<div className={'h-5 w-5 rounded-full bg-neutral-300 flex items-center justify-center'}>
<div className={'h-1.5 w-1.5 rounded-full bg-neutral-600'} />
</div>
<span>Pay even if you don't send emails</span>
</div>
<div className={'flex items-center gap-3 text-sm text-neutral-600'}>
<div className={'h-5 w-5 rounded-full bg-neutral-300 flex items-center justify-center'}>
<div className={'h-1.5 w-1.5 rounded-full bg-neutral-600'} />
</div>
<span>10K subscribers = $119/month</span>
</div>
</div>
</motion.div>
</div>
</section>
{/* Key Advantages */}
<section className={'py-32'}>
<motion.div
initial={{opacity: 0, y: 20}}
whileInView={{opacity: 1, y: 0}}
viewport={{once: true}}
transition={{duration: 0.7, ease: [0.22, 1, 0.36, 1]}}
className={'mb-20 text-center'}
>
<h2 className={'text-5xl font-bold tracking-tight text-neutral-900'}>Built for Developers, Not Creators</h2>
</motion.div>
<div className={'grid gap-px bg-neutral-200 sm:grid-cols-2 lg:grid-cols-3'}>
<motion.div
initial={{opacity: 0, y: 20}}
whileInView={{opacity: 1, y: 0}}
viewport={{once: true}}
transition={{duration: 0.5, delay: 0.1, ease: [0.22, 1, 0.36, 1]}}
className={'group bg-white p-12 transition hover:bg-neutral-50'}
>
<div
className={
'flex h-12 w-12 items-center justify-center rounded-xl bg-neutral-900 text-white transition group-hover:scale-110'
}
>
<Code2 className="h-5 w-5" />
</div>
<h3 className={'mt-6 text-xl font-semibold text-neutral-900'}>Developer-First API</h3>
<p className={'mt-3 leading-relaxed text-neutral-600'}>
Modern REST API designed for developers. No visual builder complexity, just clean endpoints for sending
emails and managing workflows.
</p>
</motion.div>
<motion.div
initial={{opacity: 0, y: 20}}
whileInView={{opacity: 1, y: 0}}
viewport={{once: true}}
transition={{duration: 0.5, delay: 0.2, ease: [0.22, 1, 0.36, 1]}}
className={'group bg-white p-12 transition hover:bg-neutral-50'}
>
<div
className={
'flex h-12 w-12 items-center justify-center rounded-xl bg-neutral-900 text-white transition group-hover:scale-110'
}
>
<DollarSign className="h-5 w-5" />
</div>
<h3 className={'mt-6 text-xl font-semibold text-neutral-900'}>Pay-as-you-go Pricing</h3>
<p className={'mt-3 leading-relaxed text-neutral-600'}>
Only pay for emails sent, not subscribers stored. Grow your list without worrying about tier upgrades or
subscription increases.
</p>
</motion.div>
<motion.div
initial={{opacity: 0, y: 20}}
whileInView={{opacity: 1, y: 0}}
viewport={{once: true}}
transition={{duration: 0.5, delay: 0.3, ease: [0.22, 1, 0.36, 1]}}
className={'group bg-white p-12 transition hover:bg-neutral-50'}
>
<div
className={
'flex h-12 w-12 items-center justify-center rounded-xl bg-neutral-900 text-white transition group-hover:scale-110'
}
>
<PackageOpen className="h-5 w-5" />
</div>
<h3 className={'mt-6 text-xl font-semibold text-neutral-900'}>Open Source</h3>
<p className={'mt-3 leading-relaxed text-neutral-600'}>
AGPL-3.0 licensed. Inspect the code, contribute features, understand exactly how your emails are sent.
ConvertKit is proprietary.
</p>
</motion.div>
<motion.div
initial={{opacity: 0, y: 20}}
whileInView={{opacity: 1, y: 0}}
viewport={{once: true}}
transition={{duration: 0.5, delay: 0.4, ease: [0.22, 1, 0.36, 1]}}
className={'group bg-white p-12 transition hover:bg-neutral-50'}
>
<div
className={
'flex h-12 w-12 items-center justify-center rounded-xl bg-neutral-900 text-white transition group-hover:scale-110'
}
>
<Globe className="h-5 w-5" />
</div>
<h3 className={'mt-6 text-xl font-semibold text-neutral-900'}>Self-Hostable</h3>
<p className={'mt-3 leading-relaxed text-neutral-600'}>
Run on your own infrastructure with Docker. Full data control, compliance-ready, cost-optimized for
scale. ConvertKit is cloud-only.
</p>
</motion.div>
<motion.div
initial={{opacity: 0, y: 20}}
whileInView={{opacity: 1, y: 0}}
viewport={{once: true}}
transition={{duration: 0.5, delay: 0.5, ease: [0.22, 1, 0.36, 1]}}
className={'group bg-white p-12 transition hover:bg-neutral-50'}
>
<div
className={
'flex h-12 w-12 items-center justify-center rounded-xl bg-neutral-900 text-white transition group-hover:scale-110'
}
>
<Zap className="h-5 w-5" />
</div>
<h3 className={'mt-6 text-xl font-semibold text-neutral-900'}>5-Minute Setup</h3>
<p className={'mt-3 leading-relaxed text-neutral-600'}>
Start sending emails in minutes. No form builders to configure, no landing pages to design. Just
authenticate and send.
</p>
</motion.div>
<motion.div
initial={{opacity: 0, y: 20}}
whileInView={{opacity: 1, y: 0}}
viewport={{once: true}}
transition={{duration: 0.5, delay: 0.6, ease: [0.22, 1, 0.36, 1]}}
className={'group bg-white p-12 transition hover:bg-neutral-50'}
>
<div
className={
'flex h-12 w-12 items-center justify-center rounded-xl bg-neutral-900 text-white transition group-hover:scale-110'
}
>
<Users className="h-5 w-5" />
</div>
<h3 className={'mt-6 text-xl font-semibold text-neutral-900'}>Unlimited Contacts</h3>
<p className={'mt-3 leading-relaxed text-neutral-600'}>
Store unlimited contacts without penalty. No subscriber tiers, no forced upgrades. Your contact database
grows freely.
</p>
</motion.div>
</div>
</section>
{/* Feature Comparison */}
<section className={'py-32'}>
<motion.div
initial={{opacity: 0, y: 20}}
whileInView={{opacity: 1, y: 0}}
viewport={{once: true}}
transition={{duration: 0.7, ease: [0.22, 1, 0.36, 1]}}
className={'mb-16 text-center'}
>
<h2 className={'text-5xl font-bold tracking-tight text-neutral-900'}>Feature Comparison</h2>
</motion.div>
<ComparisonTable competitorName="ConvertKit" rows={comparisonData} />
</section>
{/* FAQ */}
<FAQSection faqs={faqs} schemaId="faq-schema-convertkit" />
{/* CTA */}
<section className={'border-t border-neutral-200 py-32'}>
<motion.div
initial={{opacity: 0, y: 20}}
whileInView={{opacity: 1, y: 0}}
viewport={{once: true}}
transition={{duration: 0.7, ease: [0.22, 1, 0.36, 1]}}
className={'mx-auto max-w-3xl text-center'}
>
<h2 className={'text-5xl font-bold tracking-tight text-neutral-900'}>
Ready for a developer-first email platform?
</h2>
<p className={'mt-6 text-lg text-neutral-600'}>
Join developers who've switched from ConvertKit to Plunk for better API design and transparent
pay-as-you-go pricing.
</p>
<div className={'mt-12 flex flex-wrap justify-center gap-4'}>
<motion.a
whileHover={{scale: 1.02}}
whileTap={{scale: 0.98}}
href={`${DASHBOARD_URI}/auth/signup`}
className={
'rounded-lg bg-neutral-900 px-8 py-4 text-base font-semibold text-white transition hover:bg-neutral-800'
}
>
Start free trial
</motion.a>
<Link
href="/pricing"
className={
'rounded-lg border border-neutral-300 px-8 py-4 text-base font-semibold text-neutral-900 transition hover:border-neutral-400'
}
>
View pricing
</Link>
</div>
</motion.div>
</section>
</main>
<Footer />
</>
);
}