[Post Title]
drop-marketing-infra-spec Drop Marketing Infrastructure — Implementation Spec Project: Drop (Fintech Payment App) Task: MC #1197 Date: 2026-02-17 Author: John (AI Director) Status: Draft — Awaiting Approval 1. Executive Summary Drop currently has a basic landing page (getdrop.no) with waitlist functionality but lacks comprehensive marketing infrastructure to support user acquisition, retention, and viral growth. This spec defines the complete marketing technology stack covering: Landing page optimization and conversion tracking SEO strategy for Norwegian fintech market App Store/Play Store listing preparation Referral system with fraud prevention Campaign tracking (UTM parameters and attribution) Email marketing integration A/B testing framework Analytics and reporting Core Principles: Norwegian-first: All copy, SEO, and campaigns prioritize Norwegian market GDPR + markedsføringsloven compliant: Strict consent management Pass-through branding: Drop never holds money — emphasize transparency Viral growth: Referral program as primary acquisition channel Data-driven: Every decision backed by metrics 2. Current State Assessment 2.1 What Exists Landing Page (getdrop.no): Single-page marketing site with hero, features, how-it-works, CTA Waitlist form ( POST /api/waitlist ) with honeypot anti-spam Mobile-responsive design (DM Sans + Fraunces fonts) Basic SEO meta tags (title, description, og:tags) Trust signals: "Regulert i Norge", "0.5% gebyr", "30+ land" Deployed to Vercel (pages/ directory for static content) SEO Meta Tags Present:
| Tjeneste | Gebyr | Hastighet | Lojalitet |
|---|---|---|---|
| Drop | 0.5% | Minutter | Bonuspoeng |
| Western Union | 5-10% | 1-3 dager | — |
| Wise | 0.7-1.2% | 1-2 dager | — |
| Tradisjonell bank | 50-200 kr + FX | 3-5 dager | — |
Dere får begge 50 kr når de sender sin første overføring.
50 kr utløper om 12 dager
Vil du ikke lenger motta e-poster fra Drop? Avslutt abonnement
Unsubscribe Endpoint: // GET /unsubscribe?token={jwt} const { userId } = verifyUnsubscribeToken(token); await run( `UPDATE consents SET granted = 0, withdrawn_at = datetime('now') WHERE user_id = ? AND consent_type = 'marketing'`, [userId] ); // Show confirmation page: "Du er fjernet fra listen." 8.3 Email Automation Triggers Trigger Table: Event Delay Campaign Condition Waitlist signup 0s Waitlist Email 1 — Waitlist signup 7d Waitlist Email 2 If not registered Waitlist signup 14d Waitlist Email 3 If not registered User registered 0s Onboarding Email 1 — User registered 3d Onboarding Email 2 If no BankID User registered 7d Onboarding Email 3 If no transfer First transfer 0s First Transfer Receipt — Last transfer 30d Re-engagement Email 1 If no transfer in 30d Last transfer 60d Re-engagement Email 2 If no transfer in 60d Implementation: Use cron job or scheduled task (runs every hour) Query database for users matching trigger conditions Call sendEmail() from email service layer Mark email as sent in email_log table 9. Analytics & Reporting 9.1 Analytics Platform Selection Options: Platform Pros Cons Cost Plausible (RECOMMENDED) GDPR-compliant, no cookies, simple, Norwegian data center Fewer features than GA4 €9/mo (10k pageviews) Google Analytics 4 Free, comprehensive, industry standard Cookie consent required, complex Free Mixpanel Event tracking, funnel analysis, cohorts Expensive at scale $20/mo (1k users) PostHog Self-hosted option, session replay Complex setup $0 (self-hosted) Recommendation: Start with Plausible for landing page (no cookie consent banner needed), add Mixpanel for in-app analytics post-launch. 9.2 Plausible Setup (Landing Page) Add to : Track Custom Events: // Waitlist signup plausible('Waitlist Signup', { props: { source: utm.source } }); // Referral link click plausible('Referral Link Click', { props: { code: refCode } }); // CTA button click plausible('CTA Click', { props: { location: 'hero' } }); Plausible Goals (Configure in Dashboard): Waitlist Signup (pageview: /api/waitlist success) App Store Click (custom event) Play Store Click (custom event) Referral Link Click (custom event) Video Play (custom event) 9.3 In-App Analytics (Mixpanel) Events to Track: Acquisition user_registered (properties: utm_source, utm_medium, referral_code) bankid_verified (properties: time_to_verify_seconds) kyc_approved (properties: time_to_approve_seconds) Activation first_transfer_completed (properties: amount, currency, destination_country) qr_payment_completed (properties: amount, merchant_name) bank_account_linked (properties: bank_name) Engagement app_opened (properties: session_count) screen_viewed (properties: screen_name) transfer_initiated (properties: amount, currency) transfer_cancelled (properties: step, reason) Retention transfer_completed (properties: amount, transfer_count, days_since_last_transfer) push_notification_received (properties: type) push_notification_clicked (properties: type) Referral referral_link_shared (properties: channel: whatsapp|sms|email) referral_link_clicked (properties: referrer_id) referral_reward_earned (properties: amount, referee_id) Revenue fee_charged (properties: amount_nok, transaction_type) credit_applied (properties: amount, source) Mixpanel People Properties: mixpanel.people.set({ "$email": user.email, "$name": `${user.firstName} ${user.lastName}`, "signup_date": user.createdAt, "utm_source": user.utmSource, "referral_code": user.referralCode, "total_transfers": user.transferCount, "total_revenue": user.totalFeesPaid, "kyc_status": user.kycStatus, "bankid_verified": user.bankidVerified }); 9.4 Key Metrics Dashboard Acquisition Metrics: Landing page visitors (unique) Waitlist signups Waitlist → Registration conversion rate Registration → BankID verification rate BankID → KYC approval rate Overall conversion (Visitor → Verified User) Activation Metrics: Time to first transfer (median) First transfer completion rate (within 7 days of registration) Average first transfer amount QR payment adoption rate (% of users who scan at least 1 QR) Engagement Metrics: DAU (Daily Active Users) WAU (Weekly Active Users) MAU (Monthly Active Users) Transfers per user per month Average transaction value Retention Metrics: Day 1, 7, 30, 90 retention Cohort analysis (users by signup month) Churn rate (users with no transfer in 90 days) Referral Metrics: Referral rate (% of users who share link) Referral conversion rate (signups per shared link) Viral coefficient (new users per existing user) Referral ROI (LTV of referred users vs. non-referred) Revenue Metrics: Total fee revenue (kr) Revenue per user (kr) Revenue per transfer (kr) Credit redemption rate (% of credits used) Campaign Performance: Cost per waitlist signup (CPA) Cost per registration (CPA) Cost per verified user (CPA) ROAS (Return on Ad Spend) by channel 10. A/B Testing Framework 10.1 Testing Strategy Goal: Optimize conversion at every funnel step Test Prioritization (ICE Framework): Test Impact Confidence Ease ICE Score Hero CTA copy ("Bli med" vs "Registrer deg") 8 9 10 27 Waitlist incentive ("5 free transfers" vs "50 kr credit") 9 7 10 26 Feature order (Remittance first vs QR first) 6 8 9 23 Phone mockup vs real screenshot 7 6 8 21 Social proof placement (hero vs below features) 5 7 9 21 Test Velocity: 1 test every 2 weeks (minimum 2 weeks per test for statistical significance) 10.2 A/B Testing Tools Options: Tool Pros Cons Cost Vercel Edge Middleware (RECOMMENDED) Fast, server-side, free Manual implementation Free Google Optimize (Deprecated) — Sunset 2023 — Optimizely Visual editor, advanced targeting Expensive $50k+/year VWO Visual editor, heatmaps Complex setup $199/mo PostHog Open source, feature flags Self-hosted complexity Free (self-hosted) Recommendation: Use Vercel Edge Middleware for simple A/B tests (free, fast, server-side). Upgrade to PostHog if feature flags needed. 10.3 Implementation (Vercel Edge Middleware) File: middleware.ts import { NextRequest, NextResponse } from 'next/server'; export function middleware(request: NextRequest) { const { pathname } = request.nextUrl; // Only run A/B test on homepage if (pathname !== '/') return NextResponse.next(); // Check if user already has variant assigned let variant = request.cookies.get('ab_hero_cta')?.value; if (!variant) { // Assign variant (50/50 split) variant = Math.random() < 0.5 ? 'A' : 'B'; const response = NextResponse.next(); response.cookies.set('ab_hero_cta', variant, { maxAge: 30 * 24 * 60 * 60, // 30 days httpOnly: true, sameSite: 'lax' }); return response; } return NextResponse.next(); } Frontend (index.html): // Read variant from cookie const variant = document.cookie .split('; ') .find(row => row.startsWith('ab_hero_cta=')) ?.split('=')[1] || 'A'; // Update CTA based on variant const ctaButton = document.querySelector('.btn-gradient'); if (variant === 'B') { ctaButton.textContent = 'Registrer deg gratis'; // Variant B } else { ctaButton.textContent = 'Bli med på ventelisten'; // Variant A (control) } // Track variant in analytics plausible('pageview', { props: { ab_hero_cta: variant } }); Track Conversion: // In waitlist form submit handler plausible('Waitlist Signup', { props: { ab_hero_cta: variant, utm_source: utm.source } }); Analysis: -- Conversion rate by variant SELECT ab_variant, COUNT(*) as views, SUM(CASE WHEN converted = 1 THEN 1 ELSE 0 END) as conversions, ROUND(100.0 * SUM(CASE WHEN converted = 1 THEN 1 ELSE 0 END) / COUNT(*), 2) as conversion_rate FROM analytics_events WHERE event_type = 'pageview' AND created_at > date('now', '-14 days') GROUP BY ab_variant; Statistical Significance Calculator: Use https://abtestguide.com/calc/ or similar Minimum sample size: 385 per variant (95% confidence, 5% margin of error) Run test until both variants reach minimum sample size 11. Content Marketing (Blog) 11.1 Blog Infrastructure Goal: SEO traffic + thought leadership Platform Options: Option Pros Cons Next.js MDX (RECOMMENDED) Same codebase, fast, full control Manual implementation Substack Easy setup, newsletter integration External platform, limited branding Medium Built-in audience No domain control, paywall WordPress SEO plugins, familiar Separate hosting, slower Recommendation: Next.js MDX (markdown files → static pages) 11.2 Blog Structure Directory: /landing/blog/ ├── index.html # Blog homepage (list of posts) ├── slik-sender-du-penger-til-tyrkia.html ├── drop-vs-western-union.html ├── hvorfor-banker-tar-hoye-gebyrer.html └── qr-betaling-forklart.html Blog Post Template: