From 789678a0c1358bf83a98b87b8da007950d04bc38 Mon Sep 17 00:00:00 2001 From: Thimon Date: Sun, 26 Oct 2025 02:05:16 +0200 Subject: [PATCH] Copy optimization --- web/app/page.tsx | 298 +++++++++----- web/app/pricing/page.tsx | 118 ++++++ web/app/services/page.tsx | 94 +++-- web/components/FAQ.tsx | 70 +++- web/components/Header.tsx | 5 +- web/components/Pricing.tsx | 68 ++- web/components/Testimonials.tsx | 71 +++- web/components/pricing/BillingToggle.tsx | 39 ++ web/components/pricing/ComparisonTable.tsx | 89 ++++ web/components/pricing/FAQ.tsx | 35 ++ web/components/pricing/Guarantee.tsx | 18 + web/components/pricing/PlanCard.tsx | 85 ++++ web/components/pricing/PlanRecommender.tsx | 87 ++++ web/components/pricing/PricingTable.tsx | 22 + web/components/pricing/ROICalculator.tsx | 147 +++++++ web/components/pricing/icons.tsx | 25 ++ web/components/pricing/money.ts | 13 + web/components/pricing/types.ts | 14 + web/docker-compose.yml | 8 +- web/{app => }/free/page.tsx | 0 web/lib/services.ts | 457 +++++++-------------- web/package.json | 1 + web/pnpm-lock.yaml | 9 + 23 files changed, 1301 insertions(+), 472 deletions(-) create mode 100644 web/app/pricing/page.tsx create mode 100644 web/components/pricing/BillingToggle.tsx create mode 100644 web/components/pricing/ComparisonTable.tsx create mode 100644 web/components/pricing/FAQ.tsx create mode 100644 web/components/pricing/Guarantee.tsx create mode 100644 web/components/pricing/PlanCard.tsx create mode 100644 web/components/pricing/PlanRecommender.tsx create mode 100644 web/components/pricing/PricingTable.tsx create mode 100644 web/components/pricing/ROICalculator.tsx create mode 100644 web/components/pricing/icons.tsx create mode 100644 web/components/pricing/money.ts create mode 100644 web/components/pricing/types.ts rename web/{app => }/free/page.tsx (100%) diff --git a/web/app/page.tsx b/web/app/page.tsx index 2325397..b8089fd 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -1,19 +1,16 @@ import type { Metadata } from "next"; -import Hero from "@/components/Hero"; -import Process from "@/components/Process"; import Pricing from "@/components/Pricing"; import Testimonials from "@/components/Testimonials"; import FAQ from "@/components/FAQ"; -import CTA from "@/components/CTA"; -import { SERVICE_CATEGORIES } from "@/lib/services"; import { plans } from "@/lib/pricing"; import { site } from "@/lib/site"; import JsonLd from "@/components/JsonLd"; import Link from "next/link"; export const metadata: Metadata = { - title: "Productized IT for SMBs", - description: site.description, + title: "SMB Website Reliability & Deliverability", + description: + "DMARC-aligned email, Cloudflare edge security & speed, tested backups, and uptime watch for SMB sites. Fixed-scope sprints and care plans with real SLAs and before/after proof.", }; export default function HomePage() { @@ -26,89 +23,142 @@ export default function HomePage() { sameAs: site.org.sameAs, }; + const faqItems = [ + { + q: "How fast can you start?", + a: "Most sprints start within 2–3 business days after scope confirmation.", + }, + { + q: "Do you work under NDA?", + a: "Yes—mutual NDA available on request; we keep credentials least-privilege.", + }, + { + q: "Can we switch providers later?", + a: "Yes. Everything is documented; you own the accounts and artifacts. Month-to-month plans with a 30-day cancel policy.", + }, + { + q: "What’s your guarantee?", + a: "We show proof of outcomes. If the agreed scope isn’t met, we make it right or refund the sprint fee.", + }, + { + q: "Do you offer 24/7?", + a: "Yes—Mission-Critical includes 24/7 paging with a 1-hour first response. Essential and Growth cover business hours.", + }, + ]; + const faqLd = { "@context": "https://schema.org", "@type": "FAQPage", - mainEntity: [ - { - "@type": "Question", - name: "How fast can you start?", - acceptedAnswer: { - "@type": "Answer", - text: "Most sprints start within 2–3 business days after scope confirmation.", - }, - }, - { - "@type": "Question", - name: "Do you work under NDA?", - acceptedAnswer: { - "@type": "Answer", - text: "Yes—mutual NDA available on request; we keep credentials least-privilege.", - }, - }, - { - "@type": "Question", - name: "Can we switch providers later?", - acceptedAnswer: { - "@type": "Answer", - text: "Yes. Everything is documented; you own the accounts and artifacts.", - }, - }, - ], - }; - - // Service category summaries - const categoryDescriptions: Record = { - "infrastructure-devops": - "Reliable servers, containers, and automation—Docker, Kubernetes, Cloudflare, and backups that just work.", - "web-performance": - "Make your website fast, secure, and consistently available. Core Web Vitals, deliverability, and uptime care.", - "dev-platforms": - "Private Git hosting, CI/CD, staging environments, and secrets management—developer efficiency built in.", - "migrations": - "Move from legacy hosting or apps to modern, containerized infrastructure with zero-to-minimal downtime.", - "minecraft": - "Managed Minecraft servers, plugin development, and performance tuning for creators and communities.", - "web-dev": - "Modern websites and headless CMS setups designed for speed, SEO, and maintainability.", + mainEntity: faqItems.map((i) => ({ + "@type": "Question", + name: i.q, + acceptedAnswer: { "@type": "Answer", text: i.a }, + })), }; return (
- + {/* --- HERO --- */} +
+
+
+

+ + Fixes in days. Uptime for months. + +

+

+ SMB website reliability and deliverability—implemented with the{" "} + Reliability Stack™: DMARC-aligned email, Cloudflare edge + security & speed, tested backups, and uptime watch. Flat pricing. Before/after proof. +

- {/* --- Service Areas --- */} -
+
+ + Start a Free Reliability Check + + + Book a 15-min Fit Call + +
+ + {/* Proof badges */} +
+
+

+38% faster TTFB

+

after Cloudflare tuning

+
+
+

DMARC p=reject

+

in 48 hours, spoofing blocked

+
+
+

7m 12s restore

+

backup drill to full recovery

+
+
+
+
+ + {/* --- RELIABILITY STACK --- */} +

- Service Areas + The Reliability Stack™

-

- Fixed-scope sprints and managed plans for infrastructure, performance, and development. - Each category leads to specialized services tailored to small and mid-sized teams. +

+ Four layers that make websites dependable. Implemented in a 1–3 day sprint, proven with before/after data.

-
- {Object.entries(SERVICE_CATEGORIES).map(([id, cat], i) => ( +
+ {[ + { + title: "Email Deliverability", + body: + "Inbox-ready email with SPF/DKIM/DMARC alignment, monitoring, and reports. Stop spoofing and missing leads.", + href: "/services#email-deliverability", + }, + { + title: "Cloudflare Edge", + body: + "WAF & bot mitigation, HTTP/3, cache tuning, and origin shields for fewer attacks and faster TTFB.", + href: "/services#cloudflare", + }, + { + title: "Backups & Restore", + body: + "Automated backups with scheduled restore tests and a recovery runbook. Know you can recover, fast.", + href: "/services#backups", + }, + { + title: "Uptime & Incidents", + body: + "Monitors and SSL watch with clear incident notes and post-mortems. Reduce surprises and MTTR.", + href: "/services#uptime", + }, + ].map((card) => (

- {cat.label} + {card.title}

-

- {categoryDescriptions[id] ?? ""} -

+

{card.body}

- Explore services → + Explore →
))} @@ -125,17 +175,76 @@ export default function HomePage() {
- {/* --- Process --- */} - - - {/* --- Pricing --- */} -
+ {/* --- HOW IT WORKS (3 STEPS) --- */} +
- +
+

+ From audit to outcomes in 72 hours +

+

+ Diagnose the risks, implement the fixes, and prove the results—then choose the right Care plan. +

+
+ +
+ {[ + { + step: "1", + title: "Diagnose", + body: + "DNS/email/edge scan, backup checks, and uptime review. Clear scope and fixed price before we start.", + }, + { + step: "2", + title: "Implement", + body: + "DMARC + Cloudflare + backups + monitors. Least-privilege access, change log, and rollback plan.", + }, + { + step: "3", + title: "Prove", + body: + "Before/after report, restore test timer, incident notes, and next-step plan you can share internally.", + }, + ].map((s) => ( +
+
Step {s.step}
+

{s.title}

+

{s.body}

+
+ ))} +
+ +
+ + Book a Fix Sprint (€490) + +
- {/* --- Testimonials --- */} + {/* --- PRICING --- */} +
+
+ + +
+

+ Every plan includes DNS/email monitoring, automated backups with restore verification, uptime & SSL + watch, and a quarterly health summary. +

+
+
+
+ + {/* --- TESTIMONIALS --- */}
@@ -145,40 +254,33 @@ export default function HomePage() { {/* --- FAQ --- */}
- +
- {/* --- Call to Action --- */} + {/* --- CTA --- */}

- Ready to make your IT infrastructure reliable and scalable? + Ready to make your website reliable and inbox-ready?

- Talk with Van Hunen IT — get a fixed-scope sprint or managed plan that fits your business. + Start with a Fix Sprint or choose a Care plan that fits your business. We’ll prove the results.

- - Contact Us - +
+ + Start Free Check + + + See Pricing & SLA + +
diff --git a/web/app/pricing/page.tsx b/web/app/pricing/page.tsx new file mode 100644 index 0000000..ac74bc0 --- /dev/null +++ b/web/app/pricing/page.tsx @@ -0,0 +1,118 @@ +// app/pricing/page.tsx +import type { Metadata } from "next"; +import PricingTable from "@/components/pricing/PricingTable"; +import ComparisonTable from "@/components/pricing/ComparisonTable"; +import PlanRecommender from "@/components/pricing/PlanRecommender"; +import ROICalculator from "@/components/pricing/ROICalculator"; +import FAQ from "@/components/pricing/FAQ"; +import Guarantee from "@/components/pricing/Guarantee"; +import { Plan } from "@/components/pricing/types"; + +export const metadata: Metadata = { + title: "Pricing & SLAs — Van Hunen IT", + description: + "Simple plans with real SLAs. Essential, Growth, Mission-Critical. Month-to-month, 30-day cancel, incident credits.", +}; + +const plans: Plan[] = [ + { + id: "essential", + name: "Essential Care", + bestFor: "Solo & micro businesses", + monthlyPrice: 149, + yearlyDiscount: 0.1, + outcomes: ["Inbox-ready email", "99.9% uptime"], + inclusions: [ + "SPF/DKIM/DMARC monitoring", + "Automated backups + quarterly restore test", + "Uptime & SSL watch", + "Incident credits", + "Business-hours support (8×5)", + ], + sla: "Next-business-day first response (8×5)", + ctaLabel: "Start Essential", + popular: false, + }, + { + id: "growth", + name: "Growth Care", + bestFor: "SMB team sites", + monthlyPrice: 299, + yearlyDiscount: 0.1, + outcomes: ["99.95% uptime", "Faster TTFB"], + inclusions: [ + "Everything in Essential", + "Cloudflare WAF & bot tuning", + "Monthly Web Vitals report", + "Priority incident handling", + ], + sla: "4-hour first response (8×5)", + ctaLabel: "Start Growth", + popular: true, + }, + { + id: "mission", + name: "Mission-Critical", + bestFor: "High-traffic & 24/7", + monthlyPrice: 649, + yearlyDiscount: 0.1, + outcomes: ["99.99% uptime", "24/7 on-call"], + inclusions: [ + "Everything in Growth", + "24/7 paging", + "Weekly checks", + "DR runbook & drills", + ], + sla: "1-hour first response (24/7)", + ctaLabel: "Talk to us", + popular: false, + contactOnly: true, + }, +]; + +export default function PricingPage() { + return ( +
+
+

+ Simple plans with real SLAs +

+

+ Pick the care level that matches your traffic and risk. Month-to-month, 30-day + cancel. Fix Sprint available for urgent issues. +

+
+ + {/* Engaging element #1: Billing toggle inside table */} +
+ +

+ Prices exclude VAT. Annual billing saves 10%. +

+
+ + {/* Engaging element #2: Plan recommender */} +
+ +
+ + {/* Comparison matrix */} +
+ +
+ + {/* Engaging element #3: ROI calculator */} +
+ +
+ +
+ +
+ +
+ +
+
+ ); +} diff --git a/web/app/services/page.tsx b/web/app/services/page.tsx index 9c05f9b..e4b0915 100644 --- a/web/app/services/page.tsx +++ b/web/app/services/page.tsx @@ -1,3 +1,4 @@ +// app/services/page.tsx import { Metadata } from "next"; import { getAllServices, SERVICE_CATEGORIES, type ServiceCategoryId } from "@/lib/services"; import ServiceCard from "@/components/ServiceCard"; @@ -6,30 +7,43 @@ import Link from "next/link"; export const revalidate = 86400; export const metadata: Metadata = { - title: "Services — Van Hunen IT", + title: "Services — Website Reliability for SMBs | Van Hunen IT", description: - "Explore Van Hunen IT's fixed-scope sprints and managed solutions — from VPS hardening and Docker orchestration to Kubernetes, Cloudflare, Core Web Vitals, and Minecraft operations.", + "Fixed-scope sprints and care plans for SMB website reliability: email deliverability (DMARC), Cloudflare edge security & speed, tested backups, and uptime watch.", alternates: { canonical: "/services" }, }; export default function ServicesPage() { const services = getAllServices(); - const categories: ServiceCategoryId[] = Object.keys(SERVICE_CATEGORIES) as ServiceCategoryId[]; + + // Emphasize core Reliability first; keep the rest discoverable. + const categories: ServiceCategoryId[] = [ + "web-performance", + "infrastructure-devops", + "dev-platforms", + "migrations", + "web-dev", + "minecraft", + ]; return ( -
+
{/* --- Hero Header --- */}

- Professional IT Services + Services that make websites reliable

- Fixed-scope sprints and managed plans for{" "} - VPS, Docker, Kubernetes,{" "} - Cloudflare, Core Web Vitals, and{" "} - Minecraft. Clear outcomes, flat pricing, and proof you can keep. + Fixed-scope sprints and care plans for{" "} + email deliverability, Cloudflare edge security & speed,{" "} + backups with restore tests, and uptime watch. Clear outcomes, flat pricing, + and before/after proof you can keep.

+
{categories.map((id) => ( ))}
+ +
+ + See pricing + + + Book a 15-min Fit Call + +
@@ -50,31 +79,33 @@ export default function ServicesPage() { const list = services.filter((s) => s.category === id); if (!list.length) return null; + const headingId = `${id}-heading`; + const sectionClasses = `relative py-16 scroll-mt-24 ${ + index % 2 === 0 + ? "bg-white dark:bg-neutral-900/50" + : "bg-neutral-50 dark:bg-neutral-900/30" + } rounded-2xl mb-12 shadow-sm`; + return (
-

{SERVICE_CATEGORIES[id].label}

- Jump to top ↑ @@ -101,17 +132,26 @@ export default function ServicesPage() {

- Ready to optimize your IT infrastructure? + Ready to improve reliability and deliverability?

- Get in touch to discuss your goals — we’ll help you choose the right sprint or managed plan. + Tell us about your site. We’ll recommend the right Fix Sprint or Care plan and show you the expected + before/after.

- - Contact Us - +
+ + Compare plans + + + Contact us + +
diff --git a/web/components/FAQ.tsx b/web/components/FAQ.tsx index f2225e0..3db3c06 100644 --- a/web/components/FAQ.tsx +++ b/web/components/FAQ.tsx @@ -1,26 +1,68 @@ type QA = { q: string; a: string }; +function slugify(input: string) { + return input + .toLowerCase() + .replace(/[^a-z0-9\s-]/g, "") + .trim() + .replace(/\s+/g, "-") + .slice(0, 80); +} + export default function FAQ({ items }: { items: QA[] }) { return ( -
+
); diff --git a/web/components/Header.tsx b/web/components/Header.tsx index 1afeefb..a7c0bd4 100644 --- a/web/components/Header.tsx +++ b/web/components/Header.tsx @@ -12,8 +12,9 @@ export default function Header() {