Online-Taxibuchung: Was Tarifrechner rechtlich beachten müssen
Ein Tarifrechner für die Online-Taxibuchung rechnet mit der Tarifverordnung der Gemeinde und zeigt eine Schätzung, solange kein Festpreis nach dieser Verordnung vereinbart ist. In München gilt dafür seit 01.07.2026 ein Korridor von 10 Prozent unter bis 30 Prozent über dem Taxameterpreis.
Taxifahrten gehören zum öffentlichen Personennahverkehr, und ihr Preis ist kein Marktpreis. Die Gemeinde oder der Landkreis legt Grundpreis, Kilometerpreis, Wartezeit und Zuschläge per Verordnung fest, und das Taxameter rechnet danach. Ein Tarifrechner auf einer Website oder in einer App ist deshalb an dieselben Zahlen gebunden. Er kann eine Fahrt nur schätzen, weil Stau und Umwege erst während der Fahrt entstehen, es sei denn, Fahrgast und Unternehmen vereinbaren einen Festpreis, den die Verordnung erlaubt.
Die Beispiele beziehen sich auf die Taxitarifordnung der Landeshauptstadt München in der Fassung, die am 29.09.2026 galt. Andere Städte haben eigene Tarife; der Aufbau des Rechners bleibt gleich, die Zahlen ändern sich.
Taxitarife sind kommunal geregelt
Die Grundlage steht in § 51 Abs. 1 Personenbeförderungsgesetz (PBefG): Die Landesregierung setzt die Beförderungsentgelte für Taxis per Rechtsverordnung fest und kann diese Befugnis weiter übertragen. Die Verordnung regelt Grund-, Kilometer- und Zeitpreise, Festpreise für bestimmte Strecken, Zuschläge und die Zahlungsweise. Für Fahrten auf vorherige Bestellung kann sie außerdem Festpreise bestimmen oder Mindest- und Höchstpreise festlegen, innerhalb derer das Entgelt vor Fahrtantritt frei vereinbart wird. Diese Möglichkeit kam mit dem Gesetz zur Modernisierung des Personenbeförderungsrechts von 2021.
Zwei weitere Regeln betreffen jeden Rechner. Nach § 39 Abs. 3 PBefG, der über § 51 Abs. 5 auch für Taxis gilt, dürfen die festgesetzten Entgelte weder über- noch unterschritten werden, und Ermäßigungen, die nicht jedem unter gleichen Bedingungen zugutekommen, sind nichtig. Ein Rabattcode für Neukunden auf den Taxameterpreis scheitert an dieser Vorschrift. Und nach § 47 Abs. 4 PBefG besteht die Beförderungspflicht nur innerhalb des Gebiets, für das der Tarif gilt, des sogenannten Pflichtfahrgebiets.
In München umfasst es nach § 1 der Taxitarifordnung die Stadt, die Landkreise München, Erding, Freising, Ebersberg und Starnberg, die Große Kreisstadt Dachau mit Karlsfeld und Teile des Landkreises Fürstenfeldbruck südöstlich der B 471. Tarifzone I ist das Stadtgebiet mit dem Flughafengelände, Tarifzone II der Rest. Für Fahrten über das Pflichtfahrgebiet hinaus darf das Entgelt vor Fahrtantritt frei vereinbart werden (§ 5 Abs. 2); ohne Vereinbarung gilt der Tarif.
Der Stadtrat hat den Tarif im Frühjahr 2026 geändert; die Änderungsverordnung vom 19.05.2026 gilt seit 01.07.2026. Seitdem kostet der Kilometer bis einschließlich 7 km 2,70 Euro, darüber 2,50 Euro, und der Streckenfestpreis zwischen Hauptbahnhof und Flughafen sank von 106 auf 96 Euro. Ein Rechner aus der Zeit davor braucht neue Werte; sie gehören in eine Konfiguration mit Gültigkeitsdatum.
Was ein Tarifrechner anzeigen darf
Ein Rechner darf jederzeit eine Schätzung nach Tarif anzeigen, solange sie als Schätzung erkennbar ist. Abgerechnet wird dann mit dem Taxameter, und der Endpreis kann abweichen. Einen verbindlichen Preis darf er in zwei Fällen nennen.
Der erste Fall sind die Streckenfestpreise nach § 2 Abs. 3: Flughafen und Zone Messe 90 Euro, Flughafen und Zone Hauptbahnhof 96 Euro, Zone Messe und Zone Hauptbahnhof 41 Euro, jeweils in beide Richtungen, Zuschläge zusätzlich. Wählt der Fahrgast einen anderen Weg, gilt wieder der Taxameterpreis.
Der zweite Fall ist der Festpreis für vorbestellte Fahrten nach § 2a. Er setzt eine Bestellung per Telefon oder App mit fester Start- und Zieladresse voraus, Zuschläge müssen bei der Bestellung abschließend genannt sein, und der Preis darf höchstens 30 Prozent über und 10 Prozent unter dem Taxameterpreis nach § 2 Abs. 1 lit. a bis c liegen, also ohne Wartezeit. Bis zum 30.06.2026 lag dieser Tarifkorridor bei 20 Prozent nach oben und 5 Prozent nach unten. Ein Rechner, der Festpreise anbietet, muss deshalb zuerst den Taxameterpreis schätzen und prüfen, ob der angebotene Preis im Korridor liegt.
Der Münchner Tarif besteht aus wenigen Bausteinen. Der Mindestfahrpreis von 5,90 Euro enthält den Grundpreis und die erste Schalteinheit. Danach springt die Anzeige in Schritten von 0,20 Euro: bis 7 km alle 74,07 Meter, darüber alle 80 Meter. Fährt das Taxi langsamer als die Umschaltgeschwindigkeit von 14,44 km/h (über 7 km: 15,6 km/h), zählt die Zeit, 0,20 Euro je 18,46 Sekunden, also 39 Euro je Stunde. Fahrräder kosten einmalig 7,50 Euro, ab dem fünften Fahrgast im Großraumtaxi kommen pauschal 10 Euro hinzu, aber nicht zusammen mit dem Fahrradzuschlag. Die Anfahrt innerhalb der Zone I ist frei.
Schätzung für Fahrten in der Tarifzone I nach der Münchner Taxitarifordnung, Fassung gültig ab 01.07.2026. Beträge in Cent, damit keine Rundungsfehler entstehen.
<?php
declare(strict_types=1);
/**
* Fare estimate under the Munich taxi tariff ordinance
* (Taxitarifordnung der Landeshauptstadt München, §§ 2, 2a and 3,
* as amended on 19.05.2026, in force since 01.07.2026).
*
* Scope: trips inside tariff zone I (city of Munich and airport area).
* The result is an estimate. The taximeter counts in steps of 0.20 euro
* and switches between distance and time depending on the speed, which
* a route planner can only approximate. All amounts are in cents.
*/
final class MunichTaxiTariff
{
public const MINIMUM_FARE = 590; // base fare + first step
public const STEP = 20; // one step = 0.20 euro
public const TIER_BOUNDARY_METRES = 7000; // first 7 km
public const STEP_CM_UP_TO_7_KM = 7407; // 74.07 m per step
public const STEP_CM_ABOVE_7_KM = 8000; // 80.00 m per step
public const WAITING_STEP_CENTISECONDS = 1846; // 18.46 s per step
public const BICYCLE_SURCHARGE = 750; // § 3 (2): once, any number of bicycles
public const LARGE_TAXI_SURCHARGE = 1000; // from the 5th passenger
public const CORRIDOR_UP_PERCENT = 30;
public const CORRIDOR_DOWN_PERCENT = 10;
/** Fixed route prices, § 2 (3), both directions; § 2 (3) sentence 2 adds the § 3 surcharges. */
public const FIXED_ROUTES = [
'airport|exhibition-centre' => 9000,
'airport|central-station' => 9600,
'central-station|exhibition-centre' => 4100,
];
}
final class FareEstimate
{
public function __construct(
public readonly int $meteredFare, // minimum fare + distance steps
public readonly int $waitingFare, // time steps
public readonly int $surcharges,
public readonly ?int $fixedRoutePrice = null,
) {
}
public function total(): int
{
if ($this->fixedRoutePrice !== null) {
return $this->fixedRoutePrice + $this->surcharges;
}
return $this->meteredFare + $this->waitingFare + $this->surcharges;
}
}
function fixedRoutePrice(string $from, string $to): ?int
{
$pair = [$from, $to];
sort($pair);
return MunichTaxiTariff::FIXED_ROUTES[implode('|', $pair)] ?? null;
}
function surcharges(int $passengers, bool $bicycles): int
{
// A Pkw carries at most nine persons including the driver (§ 4 (4) PBefG).
if ($passengers < 1 || $passengers > 8) {
throw new InvalidArgumentException('Passengers must be between 1 and 8.');
}
if ($bicycles) {
// § 3 (4) sentence 3: no large-taxi surcharge if the bicycle surcharge applies.
return MunichTaxiTariff::BICYCLE_SURCHARGE;
}
return $passengers >= 5 ? MunichTaxiTariff::LARGE_TAXI_SURCHARGE : 0;
}
function estimateFare(
int $distanceMetres,
int $waitingSeconds,
int $passengers = 1,
bool $bicycles = false,
?string $from = null,
?string $to = null,
): FareEstimate {
if ($distanceMetres < 0 || $waitingSeconds < 0) {
throw new InvalidArgumentException('Distance and waiting time must not be negative.');
}
$extra = surcharges($passengers, $bicycles);
if ($from !== null && $to !== null) {
$fixed = fixedRoutePrice($from, $to);
if ($fixed !== null) {
return new FareEstimate(0, 0, $extra, $fixed);
}
}
$firstTierCm = min($distanceMetres, MunichTaxiTariff::TIER_BOUNDARY_METRES) * 100;
$secondTierCm = max(0, $distanceMetres - MunichTaxiTariff::TIER_BOUNDARY_METRES) * 100;
$distanceSteps = intdiv($firstTierCm, MunichTaxiTariff::STEP_CM_UP_TO_7_KM)
+ intdiv($secondTierCm, MunichTaxiTariff::STEP_CM_ABOVE_7_KM);
$waitingSteps = intdiv($waitingSeconds * 100, MunichTaxiTariff::WAITING_STEP_CENTISECONDS);
return new FareEstimate(
MunichTaxiTariff::MINIMUM_FARE + $distanceSteps * MunichTaxiTariff::STEP,
$waitingSteps * MunichTaxiTariff::STEP,
$extra,
);
}
/**
* Tariff corridor for pre-booked fixed prices, § 2a (4): at most 30 percent
* above and 10 percent below the fare under § 2 (1) sentence 1 lit. a to c,
* that is without waiting time and without surcharges.
*
* @return array{min: int, max: int}
*/
function corridor(FareEstimate $estimate): array
{
$base = $estimate->meteredFare;
return [
'min' => intdiv($base * (100 - MunichTaxiTariff::CORRIDOR_DOWN_PERCENT) + 99, 100),
'max' => intdiv($base * (100 + MunichTaxiTariff::CORRIDOR_UP_PERCENT), 100),
];
}
function euro(int $cents): string
{
return number_format($cents / 100, 2, ',', '.') . ' Euro';
}
if (PHP_SAPI === 'cli' && realpath($argv[0]) === __FILE__) {
// Example: 12 km in zone I, 4 minutes below switching speed, 2 passengers, 1 bicycle.
$estimate = estimateFare(12000, 240, 2, true);
$range = corridor($estimate);
echo 'Minimum fare and distance: ' . euro($estimate->meteredFare) . PHP_EOL;
echo 'Waiting time: ' . euro($estimate->waitingFare) . PHP_EOL;
echo 'Surcharges: ' . euro($estimate->surcharges) . PHP_EOL;
echo 'Estimated total: ' . euro($estimate->total()) . PHP_EOL;
echo 'Fixed price corridor: ' . euro($range['min']) . ' to ' . euro($range['max'])
. ' plus surcharges' . PHP_EOL;
}
Eine Fahrt durchgerechnet
Das Beispiel ist eine angenommene Fahrt mit 12 km in der Tarifzone I, davon zusammen 4 Minuten an Ampeln und im Stau unterhalb der Umschaltgeschwindigkeit, zwei Fahrgäste und ein Fahrrad. Der Rechner ermittelt:
Mindestfahrpreis: 5,90 Euro.
Erste 7 km: 7.000 Meter geteilt durch 74,07 Meter ergibt 94 volle Schritte, mal 0,20 Euro sind 18,80 Euro.
Weitere 5 km: 5.000 Meter geteilt durch 80 Meter ergibt 62 volle Schritte, also 12,40 Euro.
Wartezeit: 240 Sekunden geteilt durch 18,46 Sekunden ergibt 13 Schritte, also 2,60 Euro.
Zuschlag Fahrrad: 7,50 Euro; der Großraumzuschlag entfällt bei zwei Fahrgästen.
Zusammen sind das 5,90 plus 18,80 plus 12,40 plus 2,60 plus 7,50, also 47,20 Euro als Schätzung. Für einen Festpreis bei Vorbestellung zählt nur der Teil ohne Wartezeit und Zuschlag, 37,10 Euro. Daraus ergibt sich ein Korridor von 33,39 Euro (minus 10 Prozent, auf den Cent aufgerundet) bis 48,23 Euro (plus 30 Prozent, abgerundet). Der Code addiert die Zuschläge auch beim Festpreis, und die Verordnung deckt das: Für die Streckenfestpreise ordnet § 2 Abs. 3 Satz 2 die Zuschläge nach § 3 an, also auch den Fahrradzuschlag, und beim Festpreis nach Vorbestellung werden die Zuschläge nach § 2a Abs. 2 zusammen mit dem Preis vereinbart und in der Bestätigung einzeln ausgewiesen. Für den Großraumzuschlag sagt § 3 Abs. 4 ausdrücklich, dass er auch bei beiden Festpreisarten anfällt.
Bleibt das Taxi länger im Stau, steigt der Taxameterpreis, der vereinbarte Festpreis aber nicht. Genau deshalb bezieht der Korridor die Wartezeit nicht ein: Das Risiko trägt beim Festpreis das Unternehmen.
Buchung, Bestätigung und Status
Der Festpreis nach § 2a ist an Abläufe gebunden, die eine Buchungsstrecke technisch abbilden muss. Er wird vor der Fahrt vereinbart, auch über beauftragte Dritte wie Zentralen oder Plattformen. Der Fahrgast erhält vor Fahrtantritt eine Bestätigung mit dem Preis, den Zuschlägen, Datum und Uhrzeit. Die Vereinbarung wird schriftlich oder elektronisch dokumentiert, einschließlich späterer Änderungen. Zu Beginn wird die Festpreisfahrt im Taxameter erfasst, und jede Fahrt wird mit Entgelt, Zuschlag, Datum, Start- und Endzeit sowie Belegtkilometern aufgezeichnet.
Für die Software heißt das: Eine Buchung braucht einen unveränderlichen Datensatz für das Angebot und einen eigenen Eintrag für jede Änderung, statt das Angebot zu überschreiben. Ändert der Fahrgast nach der Bestätigung das Ziel, entsteht ein neuer Festpreis mit neuer Prüfung gegen den Korridor und eine neue Bestätigung.
Auch der Taxameterpreis hat Regeln, die eine App kennen sollte. Nach § 2 Abs. 6 darf das Taxameter bei Bestellungen erst eingeschaltet werden, wenn Fahrer und Fahrgast die Ankunft am Abholort abgestimmt haben. Ein Status „Fahrzeug wartet“ sollte deshalb erst nach dieser Abstimmung gesetzt werden. Nach § 7 muss auf Wunsch mit Kredit- oder Debitkarte bezahlt werden können, und auf Verlangen gibt es eine Quittung mit Strecke und Ordnungsnummer.
Anbindung an Funk und Disposition
Eine Online-Buchung ersetzt die Taxizentrale nicht, sie wird an deren Vermittlung angeschlossen. Der Auftrag muss in das Vermittlungssystem, dort einem Fahrzeug zugeordnet werden, und die Statusmeldungen müssen zurück: angenommen, unterwegs, angekommen, Fahrgast an Bord, beendet. Bevor die Oberfläche entsteht, lohnt deshalb die Frage, welche Schnittstelle das Vermittlungssystem anbietet, wie es Aufträge mit Festpreis kennzeichnet und wer die Dokumentation nach § 2a führt, die Buchungsstrecke oder die Zentrale.
In der Münchner Taxi-Branche kennen wir die Lage auf der Seite der Genossenschaft: Für die Taxi-München eG, die Münchner Taxi-Genossenschaft, haben wir das Taxifahrer-Portal gebaut, ein internes Portal für die Genossen mit Stammdaten, Dokumenten, Online-Zahlungen und amtlichen Formularen. Wer eine Buchungsstrecke plant, sollte von Anfang an festlegen, welches dieser Systeme die führenden Daten zu Unternehmen und Fahrzeugen hält, damit Ordnungsnummer und Unternehmensangaben auf der Quittung aus einer Quelle kommen.
Mobil zuerst gestalten
Taxis werden unterwegs bestellt, mit einer Hand und bei wechselndem Netz. Eine Buchungsseite braucht deshalb wenige Felder, eine Adresssuche mit Standortfreigabe, einen sichtbaren Hinweis, ob der Preis eine Schätzung oder ein Festpreis ist, und eine Statusanzeige, die nach einem Verbindungsabbruch wieder den richtigen Stand zeigt. Ein schweres JavaScript-Framework ist dafür keine Voraussetzung; warum serverseitig gerenderte Seiten für solche Strecken genügen, steht unter Single Page App ist nicht immer die Lösung. Ob daneben eine eigene App sinnvoll ist, klärt PWA oder native App. Welche Bausteine von Buchung bis Beleg wir für die Branche entwickeln, fasst unsere Seite zu Software für Mobilität und Verkehr zusammen.
Für den Preis selbst gilt eine Regel aus dem Rechner: Zeigt die Seite eine Schätzung, steht das Wort „Schätzung“ direkt am Betrag statt im Kleingedruckten. Bietet sie einen Festpreis an, nennt sie ihn als Festpreis, mit den Zuschlägen, und bestätigt ihn nach der Buchung schriftlich.
Kurz beantwortet
Häufige Fragen
-
Einen verbindlichen Festpreis darf er nur für Fahrten nennen, für die die Tarifverordnung einen vorsieht. In München sind das die Streckenfestpreise zwischen Flughafen, Messe und Hauptbahnhof und vorbestellte Fahrten mit fester Start- und Zieladresse, deren Preis im Tarifkorridor liegt. Für alle anderen Fahrten ist der Betrag eine Schätzung, abgerechnet wird nach Taxameter.
-
§ 51 PBefG ermächtigt die Landesregierung, die Entgelte per Rechtsverordnung festzusetzen, und erlaubt ihr, diese Befugnis weiter zu übertragen. In München erlässt die Landeshauptstadt die Taxitarifordnung, über Änderungen entscheidet der Stadtrat. Ein Taxiunternehmen kann den Tarif nicht selbst ändern, und Ermäßigungen, die nicht jedem offenstehen, sind nichtig.
Buchungsstrecke mit Tarifrechner geplant?
Legen Sie die Tarifverordnung Ihrer Stadt und die Schnittstellenbeschreibung Ihrer Vermittlung nebeneinander, bevor die erste Maske entsteht. Welche Software wir für Personenbeförderung und Mobilität bauen, steht auf der Branchenseite.
Nachweise
Quellen und Stand
Stand: 29.09.2026. Die Angaben sind keine Rechtsberatung. Der Rechner ist eine Schätzung und ersetzt nicht das geeichte Taxameter. Den PHP-Code haben wir mit PHP 8.4 unter macOS ausgeführt, mit dem Beispiel aus dem Text und Randfällen (Fahrt von 0 Metern, genau 7 km, Festpreisstrecken, fünf Fahrgäste mit und ohne Fahrrad, negative Eingaben).
Artikel teilen