since3-website/modules/landingPage/data/pricing.ts
2026-09-25 00:45:33 +02:00

124 lines
4.2 KiB
TypeScript

// Single source of truth for the price calculator.
//
// TODO: replace the EXAMPLE values below with your real prices, then set
// `isExample` to false. While it is true, the calculator shows a visible
// "Beispielpreise" badge so placeholder prices can never go live unnoticed.
export type VatMode =
// B2B: net prices plus VAT
| "net"
// B2C: prices incl. 19 % VAT (required by the PAngV when addressing consumers)
| "gross"
// Kleinunternehmer according to §19 UStG
| "small-business"
export type ProjectTypeId = "landing" | "website" | "shop" | "software" | "automation"
export type ProjectType = {
id: ProjectTypeId
label: string
description: string
base: number
// Delivery time in weeks at "small"/included scope
weeks: [number, number]
// Website-like projects are sized by page count
pages?: { included: number; max: number; pricePerPage: number }
// Software-like projects are sized by complexity instead
sizedByComplexity?: boolean
}
export type Extra = {
id: string
label: string
price: number
// Project types this extra is offered for
for: ProjectTypeId[]
}
export type MonthlyService = {
id: string
label: string
description: string
price: number
}
export const pricing = {
isExample: true,
vat: "net" as VatMode,
vatRate: 0.19,
// The estimate is shown as a range around the calculated value
spread: { low: 0.9, high: 1.2 },
roundTo: 100,
projectTypes: [
{
id: "landing",
label: "Landingpage",
description: "Eine starke Seite für ein Angebot oder eine Kampagne.",
base: 1500,
weeks: [2, 3],
},
{
id: "website",
label: "Website",
description: "Unternehmensauftritt mit mehreren Seiten.",
base: 3500,
weeks: [4, 6],
pages: { included: 5, max: 30, pricePerPage: 250 },
},
{
id: "shop",
label: "Online-Shop",
description: "Verkaufen mit Warenkorb, Zahlung und Versand.",
base: 6500,
weeks: [6, 10],
pages: { included: 5, max: 30, pricePerPage: 250 },
},
{
id: "software",
label: "Web-App",
description: "Individuelle Software, Portale, interne Tools.",
base: 8000,
weeks: [6, 10],
sizedByComplexity: true,
},
{
id: "automation",
label: "KI-Automatisierung",
description: "Abläufe automatisieren, KI sinnvoll einbinden.",
base: 2500,
weeks: [2, 4],
sizedByComplexity: true,
},
] satisfies ProjectType[],
complexity: [
{ id: "small", label: "Überschaubar", hint: "Ein klarer Ablauf, wenige Rollen", factor: 1 },
{ id: "medium", label: "Mittel", hint: "Mehrere Abläufe, Nutzerkonten", factor: 1.8 },
{ id: "large", label: "Umfangreich", hint: "Viele Schnittstellen und Rollen", factor: 3 },
],
extras: [
{ id: "cms", label: "Inhalte selbst pflegen (CMS)", price: 900, for: ["landing", "website"] },
{ id: "language", label: "Zweite Sprache", price: 900, for: ["landing", "website", "shop", "software"] },
{ id: "copy", label: "Texte schreiben wir", price: 600, for: ["landing", "website", "shop"] },
{ id: "branding", label: "Logo & Markenauftritt", price: 1200, for: ["landing", "website", "shop", "software"] },
{ id: "booking", label: "Terminbuchung", price: 800, for: ["landing", "website"] },
{ id: "seo", label: "SEO-Grundpaket", price: 600, for: ["landing", "website", "shop"] },
{ id: "integrations", label: "Anbindung an bestehende Systeme", price: 1500, for: ["shop", "software", "automation"] },
{ id: "ai", label: "KI-Assistent / Chatbot", price: 1800, for: ["website", "shop", "software", "automation"] },
] satisfies Extra[],
monthly: [
{ id: "care", label: "Hosting & Wartung", description: "Updates, Backups, Sicherheit", price: 49 },
{ id: "seo-care", label: "SEO-Betreuung", description: "Monatliche Optimierung und Reporting", price: 290 },
] satisfies MonthlyService[],
express: { label: "Express", hint: "Etwa 40 % schneller fertig", factor: 1.25, weeksFactor: 0.6 },
// Always part of the price, shown as reassurance
included: ["Barrierefrei nach BFSG", "Responsive Design", "Schnelle Ladezeiten", "DSGVO-konform"],
}
export type ComplexityId = (typeof pricing.complexity)[number]["id"]