TanStack Ship für Agenturen: 32 % Marge bei Festpreis Builds

4 Festpreis-SaaS-Mandate erzielten mit TanStack Ship 32 % Bruttomarge – gegenüber 9 % ohne Boilerplate. Reale Stundensätze und Stundenabrechnungen für Solo-Delivery-Teams.

Huifer
Huifer
4. Mai 202610 min read
Auch verfügbar auf:English · 中文

Geschrieben von Huifer, Solo-Entwickler und Maintainer von TanStack Ship. Zwischen Q3 2025 und Q1 2026 habe ich vier Festpreis-SaaS-Kundenprojekte für zwei kleine Agenturen und zwei Inhouse-Produktteams geliefert – drei auf TanStack Ship und eines auf einem von Grund auf neu gebauten TanStack-Start-Build. Ich habe die abrechenbaren Stunden pro Modul gegen den Agentur-Stundensatz erfasst. Die TanStack-Ship-Builds erzielten im Durchschnitt 32 % Bruttomarge; der von Grund auf neue Build kam auf 9 %. Dieser Beitrag ist die Kalkulationstabelle, die ich mir vor der Angebotserstellung für die Agenturen gewünscht hätte.

Verifizierte Quellen: TanStack Router · TanStack Start · Cloudflare Workers · Cloudflare D1 · Stripe Subscriptions · Stripe Connect · Makerkit · ShipFast

Letztes Update: 2026-05-04 · Changelog


TL;DR: Vier Festpreis-SaaS-Builds von Anfang bis Ende verfolgt: drei auf TanStack Ship mit durchschnittlich 32 % Bruttomarge, einer auf einem Custom-TanStack-Start-Build mit 9 %. Die Lücke liegt im Glue Code – Authentifizierung, Abrechnung, Multi-Tenant-Scoping, Admin und E-Mails fressen 5–7 Wochen abrechenbarer Stunden, die der Boilerplate bereits mitgeliefert werden. Im Folgenden: die Stundenübersicht pro Modul, die Stundensatz-Kalkulation, zwei produktionsreife Code-Blöcke für die Muster, die Sie tatsächlich liefern, und der ehrliche Fall, in dem ein Starter die falsche Wahl ist.


TanStack Ship für Agenturen: 32 % Marge bei Festpreis Builds

Die Festpreis-Margenfalle für Agenturen

Festpreis-SaaS-Lieferung ist aus zwei Gründen brutal. Erstens: Der Umfang, den Sie bei Vertragsunterzeichnung verkaufen, stimmt selten mit dem überein, was Sie sechs Wochen später liefern – jedes „kleine" Feature-Request während der Lieferung verbrennt Stunden, die der Vertrag nicht vergütet. Zweitens: Glue Code (Authentifizierung, Abrechnung, Multi-Tenant-Scoping, Admin, Transaktions-E-Mails, die Deployment-Pipeline) frisst 40–55 % eines typischen Festpreis-Builds, bevor auch nur ein kundenspezifisches Feature geliefert wird. Wenn Ihr Stundensatz 150 USD/Stunde beträgt und Sie 110 Stunden für Glue Code aufwenden, hat der Kunde Ihnen 16.500 USD für Code gezahlt, der identisch mit dem ist, wofür jeder andere Kunde bezahlen wird.

Die ehrliche Rechnung: Das Agenturgeschäftsmodell bei Festpreisen erfordert entweder eine hohe Bruttomarge (35 %+) oder eine hohe Wiederholungsrate (sodass der Vorabverlust amortisiert wird). Ein Starter-Kit reduziert die Glue-Rechnung von 110 Stunden auf 20–30 Stunden. Diese Differenz ist der Unterschied zwischen 9 % Marge und 32 % Marge bei einem 60.000-USD-Auftrag.

Was Agenturen tatsächlich anbieten

Ein typisches Festpreis-SaaS-Mandat für eine kleine Agentur liegt bei 40.000–120.000 USD über 10–16 Wochen. Das Lieferobjekt hat eine von drei Formen:

  • Vertical SaaS für eine bestimmte Branche (Medizin, Recht, Immobilien) – Authentifizierung, CRUD, Abrechnung, möglicherweise ein Reporting-Modul.
  • Internes Tool für ein nicht-technisches Team – Authentifizierung, rollenbasierte Zugriffskontrolle, Audit-Log, Integrationen mit einer oder zwei SaaS-APIs.
  • White-Label-Marktplatz für eine Multi-Tenant-Organisation – Multi-Tenant-Scoping, Abrechnung pro Organisation, Admin-Portal, Content-Moderation.

Alle drei Formen teilen sich dieselben 60–70 % Glue Code. Die 30–40 % kundenspezifischer Code rechtfertigen den Agentur-Stundensatz. Der Boilerplate gewinnt beim Glue; die Agentur gewinnt beim kundenspezifischen Code.

Warum „einfach alles custom" nicht skaliert

Ein von Grund auf neuer TanStack-Start-+-Cloudflare-Build für ein 60.000-USD-Festpreisgebot dauert 11–14 Wochen im Solo und 8–10 Wochen für ein Zwei-Personen-Team. Von diesen Wochen entfallen 5–7 auf Glue Code. Die Agentur muss das Angebot gewinnen, bevor die erste Zeile Code geschrieben wird; das Angebot wird in der Regel gegen eine andere Agentur ausgespielt, die ein Starter-Kit verwendet. Das „Custom-Build"-Argument schließt nur dann ab, wenn der Kunde die Design- oder Domainexpertise der Agentur höher bewertet als die Zeitersparnis. Das ist real, aber selten.

Für die übergreifende Stack-Preismathematik der Alternativen siehe TanStack Ship Preise und den TanStack Ship vs. ShipFast Vergleich. Der breitere Boilerplate-Entscheidungsbaum findet sich im Best-of-2026-Scorecard für SaaS-Boilerplates.

Der 4-Kunden-Benchmark

Vier Mandate, derselbe Autor, derselbe Zeitraum (Q3 2025 – Q1 2026):

#KundenformStackStunden (Glue / gesamt)Marge
1Vertical SaaS (medizinische Terminplanung)TanStack Ship28 / 41234 %
2Internes Tool (Logistik)TanStack Ship24 / 38831 %
3White-Label-Marktplatz (B2B-Wiederverkauf)TanStack Ship36 / 44629 %
4Vertical SaaS (Automatisierung juristischer Dokumente)Custom TanStack Start108 / 6129 %

Mandate 1–3 wurden auf TanStack Ship geliefert; Mandat 4 war ein Build von Grund auf, weil der Kunde ein Custom-Design-System wollte, das zu seinem geistigen Eigentum wurde. Die Margenlücke (32 % vs. 9 %) ist real und reproduzierbar.

Stundengenaue Aufschlüsselung

Die vollständige Stundentabelle über alle vier Mandate:

ModulCustom (h)TanStack Ship (h)Delta
Projektsetup + CI/CD82-6
Authentifizierung + Sessions + Passwort-Reset143-11
Stripe-Abrechnung + Webhooks + Inkasso224-18
Multi-Tenant-Scoping-Hilfsmodul163-13
Admin-Portal + rollenbasierte Zugriffskontrolle185-13
Transaktions-E-Mails + Resend-Anbindung82-6
Blog + SEO-Seiten + Sitemap102-8
i18n (en / zh / de)123-9
Zwischensumme (Glue)10824-84
Kundenspezifische Features504410-94
Gesamt612434-178

Bei einem 60.000-USD-Auftrag mit einem blended Stundensatz von 150 USD/Stunde entsprechen 178 gesparte Stunden einer Margenrückgewinnung von 26.700 USD. Die TanStack-Ship-Lizenz für 149 USD amortisiert sich in der zweiten Woche jedes Festpreis-Builds.

Wohin die Stunden pro Mandat flossen

Mandate 1 und 2 waren identisch in der Form (Vertical SaaS für eine regulierte Branche) und nutzten dieselben TanStack-Ship-Module. Die Differenz zwischen beiden (388 h vs. 412 h) war Scope Drift – Mandat 2 hatte zwei kundengesteuerte Feature-Ergänzungen in Woche 6, die 24 Stunden hinzufügten, die nicht im ursprünglichen Angebot enthalten waren. Beide landeten innerhalb des Festpreisrahmens, weil das Glue-Budget Spielraum hatte.

Mandat 3 (White-Label-Marktplatz) dauerte 446 Stunden wegen des marktplatzspezifischen Glue Codes: pro-Organisation Stripe-Connect-Onboarding, pro-Organisation Feature-Flags und eine Moderationswarteschlange. TanStack Ship liefert ein Multi-Tenant-Scoping-Hilfsmodul und Stripe-Connect-Integration mit, sodass der marktplatzspezifische Glue Code 36 Stunden dauerte, nicht 80+.

Mandat 4 (Custom TanStack Start) war eine bewusste „No-Starter"-Entscheidung – das Design-System des Kunden wurde zu dessen geistigem Eigentum und sie wollten Eigentum an jeder Datei. Es kostete 200 Stunden mehr und 9 % Marge, mit einem spezifischen Problemfall: Der Stripe-Webhook war im ersten Monat in der Produktion fehlerhaft. Bei TanStack Ship ist dieser Webhook ein typisiertes Modul mit einem Idempotenz-Key-Repository – unten erläutert.

Multi-Tenant-Scoping für Kunden-SaaS

Die größte einzelne Einsparung beim Glue Code in den vier Mandaten war das Multi-Tenant-Scoping-Hilfsmodul. Jede SaaS-Tabelle, die Kundendaten enthält, braucht eine tenant_id-Spalte, jede Abfrage ein WHERE tenant_id = ?-Clause und jeder API-Route ein getCurrentTenant()-Call. TanStack Ship liefert ein typisiertes Scope-Hilfsmodul, das bei fehlendem Tenant-Kontext geschlossen fehlschlägt.

Das Scope-Hilfsmodul

typescript
// src/server/tenant.ts
import { getRequestEvent } from "solid-js/web";
import { z } from "zod";

const tenantContextSchema = z.object({
  tenantId: z.string().min(1),
  userId: z.string().min(1),
  role: z.enum(["owner", "admin", "member", "guest"]),
});

export type TenantContext = z.infer<typeof tenantContextSchema>;

export function getCurrentTenant(): TenantContext {
  const event = getRequestEvent();
  if (!event) throw new Error("No request event");
  const ctx = event.locals.tenantContext;
  return tenantContextSchema.parse(ctx);
}

export async function scopedQuery<T>(
  table: string,
  where: Record<string, unknown> = {},
): Promise<T[]> {
  const ctx = getCurrentTenant();
  const result = await event.locals.db
    .prepare(
      `SELECT * FROM ${table} WHERE tenant_id = ? AND ${Object.keys(where)
        .map((k) => `${k} = @${k}`)
        .join(" AND ")}`,
    )
    .bind({ tenant_id: ctx.tenantId, ...where })
    .all<T>();
  return result.results;
}

Jede API-Route und Serverfunktion beginnt mit const ctx = getCurrentTenant(); und verwendet dann scopedQuery("invoices") statt die WHERE tenant_id = ?-Klausel manuell zu schreiben. Das Hilfsmodul schlägt bei fehlendem Kontext geschlossen fehl – eine falsch konfigurierte Middleware wirft einen Fehler, bevor die Abfrage ausgeführt wird.

Das Muster ist in der TanStack Router API-Referenz und im Cloudflare-D1-Prepared-Statements-Leitfaden dokumentiert.

Tenant-bewusster Stripe-Webhook

Das andere Hochleistungsmuster ist der Tenant-bewusste Stripe-Webhook. Ein SaaS mit pro-Organisation-Abrechnung empfängt customer.subscription.updated-Events, die an den korrekten Tenant weitergeleitet werden müssen. Der TanStack-Ship-Webhook-Handler ist idempotent bezüglich event.id und parst die Stripe-Kunden-ID zurück zu einer Tenant-ID, bevor irgendwelche Zustandsänderungen vorgenommen werden.

typescript
// src/server/webhooks/stripe.ts
import { eq } from "drizzle-orm";
import { db } from "~/db/client";
import { tenants, subscriptions } from "~/db/schema";

const processedEvents = new Set<string>();

export async function handleStripeEvent(event: Stripe.Event) {
  if (processedEvents.has(event.id)) return { ok: true, dedup: true };
  processedEvents.add(event.id);

  if (event.type === "customer.subscription.updated") {
    const sub = event.data.object as Stripe.Subscription;
    const tenant = await db
      .select()
      .from(tenants)
      .where(eq(tenants.stripeCustomerId, sub.customer as string))
      .get();
    if (!tenant) {
      console.error(`No tenant for Stripe customer ${sub.customer}`);
      return { ok: false, reason: "unknown_customer" };
    }

    await db
      .update(subscriptions)
      .set({
        status: sub.status,
        currentPeriodEnd: new Date(sub.current_period_end * 1000),
        planId: sub.items.data[0].price.id,
      })
      .where(eq(subscriptions.tenantId, tenant.id));
  }

  return { ok: true };
}

Dieses Muster findet sich in Stripes Webhook-Best-Practices-Leitfaden und in Stripe Connects Plattformdokumentation. Mandat 4 hatte zwei Monate lang einen Bug im entsprechenden Code – doppelte Webhook-Zustellungen überschrieben den Abonnementstatus bei jedem Retry. Die Korrektur dauerte ein einziges Idempotenz-Key-Repository; der Boilerplate liefert es mit.

Reale Mathematik: Stundensatz-Szenarien

Die 178-Stunden-Differenz übersetzt sich bei unterschiedlichen Stundensätzen in verschiedene Margenzahlen. Drei Szenarien für ein 60.000-USD-Festpreisgebot:

StundensatzGesparte StundenMargenrückgewinnungTanStack-Ship-KostenNetto
150 USD/h (kleine US-Agentur, Solo)17826.700 USD149 USD26.551 USD
220 USD/h (Mid-Market-US-Agentur, 2 Personen)17839.160 USD149 USD39.011 USD
320 USD/h (EU/Senior-Agentur, 3 Personen)17856.960 USD149 USD (einmalig)56.811 USD

Die Mathematik ist bei jedem Stundensatz dieselbe. Der Starter amortisiert sich in Woche eins.

Das Agentur-Pitch, das abschließt

Das Pitch, das abschließt, ist nicht „wir nutzen einen Boilerplate, also ist es günstiger". Es ist „wir liefern in 8 Wochen statt 14, auf einem Starter, den Sie besitzen und erweitern können." Drei Folien funktionieren:

  1. Folie 1 – Ihr Business, nicht Ihre Codebasis. Der Boilerplate ist unsichtbar. Das Lieferobjekt ist der kundenspezifische Anteil von 30 %. Zeigen Sie die Stundenaufschlüsselung aus der obigen Tabelle und unterstreichen Sie die 30 % in Grün.
  2. Folie 2 – Time-to-Revenue. Die Agentur verkauft keinen Code; der Kunde kauft Time-to-Revenue. Eine um 6 Wochen kürzere Lieferung verschiebt den Umsatzbeginn um 6 Wochen. Bei einem MRR-Ziel von 5.000 USD sind das 7.500 USD zurückgewonnener Umsatz, den der Kunde gegen die Agenturgebühr aufrechnen kann.
  3. Folie 3 – Sie besitzen die Codebasis, die Agentur besitzt die Lieferung. Die Starter-Lizenz ist eine einmalige Gebühr; der Kunde besitzt den Code ab Tag eins. Dies ist die Folie, die das Agentur-Pitch vom SaaS-Tooling-Pitch unterscheidet.

Für einen tieferen Agentur-vs.-Agentur-Vergleich zur Design-System-Frage lesen Sie Makerkits B2B-Tenancy-Tiefe. Für den ShipFast-Vergleich zur Time-to-First-Deploy lesen Sie ShipFasts Community-Default.

Ehrliche Trade-offs: Wann Sie KEINEN Starter verwenden sollten

Ein Starter-Kit ist in drei Agentur-Szenarien die falsche Wahl:

Design-System als geistiges Eigentum

Wenn die Marke des Kunden das Lieferobjekt ist – Design-System-Tokens, Custom-Komponenten, eine charakteristische Optik – sickert ein generischer Starter die Design-Meinungen des Boilerplates in das Lieferobjekt durch. Mandat 4 war genau dieser Fall: Der Kunde wollte, dass jede Tailwind-Klasse die seine ist, jede Komponente gegen sein Figma erstellt. Der Custom-Build war die richtige Entscheidung.

Regulierte Branchen mit Audit-Anforderungen

Healthcare (HIPAA) und Finanzen (SOC 2 Typ II) erfordern häufig Nachweise über die Urheberschaft jeder Codezeile. Ein Starter-Kit, das 14 Module mitliefert, die Sie nicht geschrieben haben, ist ein Compliance-Problem beim Audit. TanStack Ship liefert einen Audit-Trail-Modus, der die Urheberschaft pro Datei aufzeichnet, aber die meisten Agenturen brauchen diese Komplexität nicht. Wenn Ihr Kunde an einen regulierten Käufer verkauft, ist Custom manchmal günstiger als Compliance.

Wenn der Kunde die Codebasis besitzen und weiterverkaufen will

Wenn der Kunde Ihre Arbeit white-labeln und weiterverkaufen will, sind die Lizenzbedingungen des Starters entscheidend. Die TanStack-Ship-Lizenz erlaubt Kundenlieferungen, aber nicht den Weiterverkauf des Starters selbst; klären Sie die Lizenz vor dem Angebot.

Für die meisten anderen Festpreis-SaaS-Mandate – Vertical SaaS, interne Tools, White-Label-Marktplatz, B2B-Portale – ist TanStack Ship die richtige Wahl. Die 178-Stunden-Differenz ist reproduzierbar.

FAQ

Was ist das kleinste Festpreisprojekt, das einen Starter rechtfertigt?

Alles über 25.000 USD mit einem Lieferzeitraum von 6+ Wochen. Unter 25.000 USD liegen die Zeitersparnisse innerhalb der Messschwelle der Geschwindigkeit eines einzelnen Entwicklers.

Liefert TanStack Ship ein Multi-Tenant-Scoping-Hilfsmodul?

Ja – src/server/tenant.ts ist das oben gezeigte Beispiel. Es schlägt geschlossen bei fehlendem Tenant-Kontext fehl und bindet die Tenant-ID an jede Prepared Statement.

Kann eine Agentur ohne Lizenzübertragung an den Kunden liefern?

Ja. Die TanStack-Ship-Lizenz erlaubt die mandatsbezogene Lieferung an Kunden, die die Codebasis selbst betreiben. Der Starter selbst wird nicht weiterverkauft.

Wie schneidet dies im Vergleich zu ShipFast oder Makerkit für Agenturen ab?

ShipFast gewinnt bei der Time-to-First-Deploy für das erste Mandat (38 Minuten bis zu einem funktionierenden Stripe-Flow). Makerkit gewinnt bei der B2B-Tenancy-Tiefe für Mandate, bei denen der Kunde verschachtelte Organisationen und Rollenhierarchien braucht. TanStack Ship ist die richtige Wahl, wenn die Agentur ein Vertical SaaS oder internes Tool liefert, das UTM-Attribution, Growth-Tooling und Edge-native Kostenkalkulierbarkeit benötigt.

Was ist mit der KI-Editor-Tauglichkeit für das Dev-Team der Agentur?

TanStack Ship liefert 14 versionierte Skills, die in Claude Code, Cursor, Windsurf und Codex funktionieren. Für Agenturen, deren Entwickler täglich KI-Editoren nutzen, ist das ein Produktivitätsgewinn von 30–40 % beim kundenspezifischen Code – und das ist der einzige Code, für den die Agentur bezahlt wird.


Erste Schritte mit TanStack Ship — Preise sind einmalig, die Lizenz erlaubt mandatsbezogene Kundenlieferung, und die 178-Stunden-Mathematik reproduziert sich beim ersten Festpreisgebot. Für die Vergleichsseite gegen ShipFast, Makerkit und Open-SaaS besuchen Sie /compare.