revops + onboarding

This commit is contained in:
Timo Knuth
2026-04-22 20:00:44 +02:00
parent ce724662d4
commit 7d2724b65d
37 changed files with 5073 additions and 1286 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -8,6 +8,8 @@ import { showToast } from '@/components/ui/Toast';
import { useRouter } from 'next/navigation';
import { BillingToggle } from '@/components/ui/BillingToggle';
import { ObfuscatedMailto } from '@/components/ui/ObfuscatedMailto';
import { trackEvent } from '@/components/PostHogProvider';
import { FREE_DYNAMIC_QR_LIMIT } from '@/lib/plans';
export default function PricingPage() {
const router = useRouter();
@@ -40,6 +42,13 @@ export default function PricingPage() {
setLoading(plan);
try {
trackEvent('upgrade_clicked', {
plan,
billing_interval: billingPeriod,
source: 'pricing_page',
current_plan: currentPlan,
});
const response = await fetch('/api/stripe/create-checkout-session', {
method: 'POST',
headers: {
@@ -52,14 +61,15 @@ export default function PricingPage() {
});
if (!response.ok) {
throw new Error('Failed to create checkout session');
const errorData = await response.json().catch(() => null);
throw new Error(errorData?.error || 'Failed to create checkout session');
}
const { url } = await response.json();
window.location.href = url;
} catch (error) {
} catch (error: any) {
console.error('Error creating checkout session:', error);
showToast('Failed to start checkout. Please try again.', 'error');
showToast(error?.message || 'Failed to start checkout. Please try again.', 'error');
setLoading(null);
}
};
@@ -132,7 +142,7 @@ export default function PricingPage() {
period: 'forever',
showDiscount: false,
features: [
'3 active dynamic QR codes (8 types available)',
`${FREE_DYNAMIC_QR_LIMIT} active dynamic QR codes (8 types available)`,
'Unlimited static QR codes',
'Basic scan tracking',
'Standard QR design templates',