From ef72526e1dac43547856a336e9953fcc7eb55608 Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Wed, 11 Mar 2026 10:30:38 -0700 Subject: [PATCH] feat: add 2% Mollie processing fee surcharge on top of payments Adds a visible processing fee line item so customers cover payment processing costs instead of having them deducted from the received amount. Co-Authored-By: Claude Opus 4.6 --- app/api/create-checkout-session/route.ts | 12 +++++++++--- app/register/page.tsx | 12 +++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/api/create-checkout-session/route.ts b/app/api/create-checkout-session/route.ts index 2a9095e..ed436f5 100644 --- a/app/api/create-checkout-session/route.ts +++ b/app/api/create-checkout-session/route.ts @@ -13,6 +13,7 @@ function getMollie() { // Dynamic pricing configuration (in EUR) const TICKET_PRICE = 80 // €80 early bird +const PROCESSING_FEE_PERCENT = 0.02 // 2% to cover Mollie payment processing fees // Accommodation prices per person for 7 nights const ACCOMMODATION_PRICES: Record = { @@ -37,18 +38,23 @@ export async function POST(request: NextRequest) { const registrationData = registrationDataStr ? JSON.parse(registrationDataStr) : null - // Calculate total - let total = TICKET_PRICE + // Calculate subtotal + let subtotal = TICKET_PRICE const descriptionParts = ["CCG 2026 Ticket (€80)"] if (includeAccommodation) { const accom = ACCOMMODATION_PRICES[accommodationType] if (accom) { - total += accom.price + subtotal += accom.price descriptionParts.push(`${accom.label} (€${accom.price.toFixed(2)})`) } } + // Add processing fee on top + const processingFee = Math.round(subtotal * PROCESSING_FEE_PERCENT * 100) / 100 + const total = subtotal + processingFee + descriptionParts.push(`Processing fee (€${processingFee.toFixed(2)})`) + // Build metadata for webhook const metadata: Record = {} if (registrationData) { diff --git a/app/register/page.tsx b/app/register/page.tsx index c9bbe6e..33e0a0e 100644 --- a/app/register/page.tsx +++ b/app/register/page.tsx @@ -42,9 +42,11 @@ export default function RegisterPage() { } const accommodationPrice = accommodationPrices[accommodationType]?.price ?? 0 - const totalPrice = + const subtotalPrice = baseTicketPrice + (includeAccommodation ? accommodationPrice : 0) + const processingFee = Math.round(subtotalPrice * 0.02 * 100) / 100 + const totalPrice = subtotalPrice + processingFee const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() @@ -290,6 +292,14 @@ export default function RegisterPage() {

+ {/* Processing fee */} +
+
+
Payment processing fee (2%)
+
+ €{processingFee.toFixed(2)} +
+ {/* Total */}