Milch bei Lidl, Lachs bei Aldi, Olivenöl bei Rewe – auf dem Papier klingt das nach einem guten Plan. Auf dem Bon sieht es oft auch noch gut aus. Erst wenn man ehrlich nachrechnet, wird es unangenehm.
Supermarkt-Flugblätter sind exzellent darin, Ersparnisse zu verkaufen. Was sie konsequent verschweigen: die Fahrtkosten, die Parkplatzsuche, die zwanzig Minuten im zweiten Laden, der Umweg, der die Ersparnis still aufgefressen hat. Der Bon zeigt das Sparergebnis. Die Gesamtrechnung steht nirgendwo – weil sie niemand aufschreiben will.
offerhopper.ai schreibt sie trotzdem auf. Nicht als Daumenregel, sondern als vollständige Kostenfunktion, die für jede Route durchgerechnet wird, bevor du überhaupt die Jacke holst.
Die Frage, die du dir eigentlich stellst
Wenn du überlegst, ob sich der Umweg zu Aldi für das Angebot lohnt, löst du – ob du willst oder nicht – ein Optimierungsproblem:
Ist die Ersparnis beim Produkt größer als die Kosten, die der Umweg erzeugt?
Bei einem Produkt und einem Laden noch irgendwie zu bewältigen. Bei drei Stopps, zwei möglichen Transportmitteln und einer Liste mit zwölf Artikeln? Viel Spaß beim Kopfrechnen im Kühlregalgang. offerhopper.ai übernimmt das – für die gesamte Route auf einmal, in unter einer Sekunde.
Die Gleichung, die jede Route bewertet
Für jede mögliche Kombination aus Läden, Produkten und Reihenfolgen berechnet offerhopper.ai einen echten Gesamtkostenpreis – inklusive aller Nebenkosten, die auf dem Bon unsichtbar bleiben:
$$\text{Cost}_{\text{trip}} = \sum_{j \in S} \left[ \left( \sum_{i \in I_j} P_i \cdot \alpha_i \right) + \gamma_j \cdot \left( T_j(I_j) \cdot \text{Rate}_{\text{hour}} \right) \right] + \sum_{k \in \text{Legs}} \text{Cost}_{\text{route}}(k)$$
Sieht schlimmer aus als es ist. Hier ist, was drinsteckt.
$\sum_{i \in I_j} P_i \cdot \alpha_i$ — Was du im Laden bezahlst (aber nicht ganz so einfach)
Der Grundpreis jedes Produkts $P_i$ wird mit einem Produktbewertungsfaktor $\alpha_i$ multipliziert. Dieser Faktor ist die stille Qualitätskontrolle des Algorithmus – er misst, wie gut ein Treffer in der Datenbank tatsächlich zu dem passt, was du gesucht hast: Treffergenauigkeit, Einheitenabweichung, Datenvollständigkeit.
Das verhindert den klassischen Fehler billiger Preisvergleiche: das günstigste Produkt empfehlen, das an deiner Einkaufsliste völlig vorbeizielt. Ein 200g-Lachsfilet, das du als 500g-Portion gesucht hast, ist nicht günstiger. Es ist einfach zu wenig.
$\gamma_j \cdot T_j(I_j) \cdot \text{Rate}_{\text{hour}}$ — Was der Laden selbst kostet
Hier steckt die unehrlichste Lücke im klassischen Preisvergleich: Er behandelt alle Läden als gleich. Reinkommen, zahlen, raus, nächste Zeile. Der Algorithmus tut das nicht.
Der Stopp-Bewertungsfaktor $\gamma_j$ ist kein Komfort-Bonus und keine weiche Ausnahme von der Mathematik. Er ist ein echter Kostenfaktor im Bewertungsraum — die Formalisierung einer Erfahrung, die jeder kennt, aber niemand aufschreibt: Manche Läden kosten schlicht mehr als auf dem Preisschild steht. Läden, die angenehm sind — gute Erreichbarkeit, schnelle Kassen, übersichtliches Layout — bekommen einen $\gamma_j < 1$. Ihr Besuch ist im Bewertungsraum effektiv günstiger. Läden, die das Gegenteil sind, bekommen $\gamma_j > 1$. Dieser Faktor ist keine Nutzereingabe, sondern eine redaktionelle Einschätzung, die im Hintergrund arbeitet.
Das Ergebnis ist manchmal überraschend: Produkt X ist bei Laden A 10 Cent günstiger als bei Laden B. Aber Laden A ist unangenehm genug, dass sein effektiver Besuchspreis im Bewertungsraum 20 % höher liegt. Der Algorithmus rechnet durch — und empfiehlt das 10 Cent teurere Produkt in Laden B. Nicht als Fehler. Sondern weil der Besuch bei Laden A unter diesen Bedingungen tatsächlich teurer ist. Mathematisch korrekt im Bewertungsraum, und gleichzeitig genau das, was sich richtig anfühlt.
Die Zeit pro Stopp $T_j$ setzt sich aus der festen Basiszeit zusammen (reinkommen, zahlen, rauskommen — Standard: 15 Minuten) und der Produktwechselzeit $t_{\text{switch}, i}$ pro Artikel auf der Liste:
$$T_j(I_j) = t_{\text{store}, j} + \sum_{i \in I_j} t_{\text{switch}, i}$$
Beides multipliziert mit $\gamma_j$ und dem persönlichen Stundensatz $\text{Rate}_{\text{hour}}$. Standard: 12 €/h. Wer selbstständig ist oder gerade Urlaubsstunden abbaut, setzt diesen Wert höher — und stellt fest, dass ein zweiter Stopp sich plötzlich kaum noch rechnet.
$\sum_{k \in \text{Legs}} \text{Cost}_{\text{route}}(k)$ — Was der Weg kostet
Für jeden Streckenabschnitt zwischen den Läden wird eine eigene Kostenberechnung durchgeführt, abhängig davon wie du unterwegs bist:
| Transportmittel | Kilometerkosten | Durchschnittstempo |
|---|---|---|
| Auto | ~0,30–0,38 €/km (Sprit + Verschleiß, nach ADAC) | 40–50 km/h (Stadt) |
| Fahrrad | 0,00 €/km | 12–15 km/h |
| Zu Fuß | 0,00 €/km | 4–5 km/h |
Das Fahrrad ist in dieser Gleichung strukturell bevorzugt: keine Kilometerkosten, nur Zeitaufwand. Wer mit dem Auto fährt, zahlt bei einem 3-km-Umweg bereits rund einen Euro an reinen Fahrtkosten – bevor noch irgendwas im Korb liegt. Wie viel Prozent des Einkaufs allein für den Weg draufgehen, lässt sich mit einem interaktiven Rechner nachprüfen. Das Modell unterstützt auch individuelle Werte für Fahrzeuge mit höherem Verbrauch, E-Autos oder Carsharing mit Minutentarif.
Ein konkretes Beispiel (mit unangenehmer Wahrheit)
Einkaufsplan in Berlin. Liste: Olivenöl, Joghurt, Nudeln, Hähnchenbrust.
Option A: Alles bei Rewe um die Ecke. Warenkorbpreis: 18,40 €. Weg: 1,2 km mit dem Fahrrad. Gesamtaufwand: 20 Minuten.
Option B: Olivenöl bei Aldi (Angebot!), Rest bei Rewe. Warenkorbpreis: 16,80 €. Weg: 3,6 km, zwei Stopps. Gesamtaufwand: 45 Minuten.
Ersparnis durch den Aldi-Umweg: 1,60 €. Zusätzliche Zeitkosten (25 Minuten mehr × 12 €/h): ~5,00 €. Nettobilanz Option B: –3,40 €. Du hast draufgezahlt. Der Bon sah trotzdem besser aus.
Genau diese Rechnung zieht offerhopper.ai für jede mögliche Routenkombination durch, bevor es dir eine empfiehlt. Das Ergebnis ist kein Ranking nach günstigstem Einzelpreis, sondern nach geringstem echten Gesamtkostenpreis. Weil das Ergebnis als teilbarer Link kommt, lässt sich die optimierte Route direkt an Familie oder Partner weitergeben.
Warum das Transportmittel mehr verändert als du denkst
Das Fahrrad schlägt das Auto auf kurzen Strecken fast immer – nicht weil es schneller ist, sondern weil es keine Kilometerkosten erzeugt. Das führt zu einem Muster, das gegen die Intuition läuft:
Auto: Rentiert sich erst bei langen Strecken und großem Warenkorb. Für den Schnellgriff nach Milch ist es wirtschaftlich schwer zu rechtfertigen – auch wenn es sich bequemer anfühlt. Fahrrad: Das Optimum für Distanzen bis ~5 km. Null Kilometerkosten, überschaubare Fahrzeit, und man hat nebenbei Sport gemacht. Zu Fuß: Gratis pro Kilometer, aber 4 km/h sind ein hartes physikalisches Limit. Lohnt sich fast nur, wenn der Laden wirklich direkt um die Ecke liegt und die Einkaufstasche nicht gerade eine Wasserkasten-Situation ist.
Was das für Rabattjagd bedeutet
Die praktischste Frage, die diese Gleichung beantwortet: Lohnt sich der Umweg für das Angebot?
Wie groß ist die Ersparnis absolut? 20 % Rabatt auf Joghurt klingt nach viel. Bei 89 Cent Grundpreis sind das 18 Cent. Das deckt nicht mal die Zeitkosten für zwei Minuten Fußweg – trotzdem machen Millionen von Menschen genau diesen Umweg jeden Tag.
Wie viele Einheiten kaufst du? Die Ersparnis skaliert linear. Zehn Becher Joghurt statt einem, und der Umweg sieht rechnerisch plötzlich anders aus. Solange du die zehn Becher auch wirklich brauchst und nicht drei Wochen später einen Schimmelbecher entsorgt.
Was kostet der Rest des Einkaufs dort? Wer für ein Angebot den Laden wechselt, kauft dort meist mehr. Wenn das allgemeine Preisniveau im Ausweichladen höher liegt, frisst es die Ersparnis von hinten auf – geräuschlos, bon-unsichtbar, wie immer.
Die Parameter, die das Modell auf dich anpassen
Das System läuft mit vernünftigen Standardwerten. Wer tiefer einsteigen will, findet auf offerhopper.ai drei Regler direkt unter der Einkaufsliste:
Dein persönlicher Zeitwert pro Stunde (Standard: 12 €/h) ist die wichtigste Stellschraube. Hochsetzen macht Routen kürzer und direkter. Runtersetzen macht zusätzliche Stopps attraktiver, wenn dort wirklich gespart wird. Ein Freelancer, der 80 €/h abrechnet, wird vom Modell konsequent zum nächsten Laden geschickt. Rentner mit Zeit und Fahrrad? Andere Rechnung, andere Route.
Deine Reisekosten pro Kilometer ist für Fahrrad und Fußgänger automatisch 0. Für Autos am ADAC-Richtwert orientiert (Standard: 0,30 €/km). Wer einen alten Diesel mit 12L/100km fährt oder Carsharing-Minuten zählt, schiebt den Regler hoch und sieht, wie schnell das Auto zur teuren Option wird.
Dein Zeitaufwand pro Markt (Standard: 10 Min): Wer die Stammfiliale im Schlaf kennt und in fünf Minuten durch ist, stellt das runter. Wer im unbekannten Laden erst suchen muss, stellt es hoch. Der Effekt: Je höher der Wert, desto teurer wird jeder zusätzliche Stopp im Modell.
Was der Algorithmus eigentlich löst
Die Kostenfunktion ist das Ziel. Das eigentliche Problem dahinter ist eine andere Kategorie.
Acht Supermärkte in der Nähe, zwölf Artikel auf der Liste, nicht jeder Laden führt jeden Artikel, Preise variieren, jeder Stopp kostet Zeit und Anfahrt: Welche Kombination ist optimal, in welcher Reihenfolge? Die Anzahl möglicher Antworten explodiert schnell — acht Läden ergeben bereits 256 mögliche Teilmengen, für jede mehrere Reihenfolgen.
Aber das ist erst die halbe Rechnung. Für jeden Artikel auf der Liste gibt es nicht ein Produkt, sondern potenziell Dutzende: verschiedene Marken, Packungsgrößen, Angebote, Eigenmarken. Der Solver bewertet nicht nur Ladenkombinationen, sondern für jede Kombination auch die optimale Produktauswahl quer über alle Artikel und Stopps. Hunderte von Produkten, acht Läden, zwölf Anforderungen — der Suchraum ist nicht groß, er ist astronomisch. Klassisch NP-schwer, wenn man das Lehrbuch aufschlägt, und in der Praxis das, was jeder Mensch am Kühlregal aufgibt und durch Greifen nach dem Erstbesten ersetzt.
offerhopper.ai löst das exakt – nicht mit einer Näherung, nicht mit der erstbesten heuristischen Abkürzung. Dynamische Programmierung sorgt dafür, dass Zwischenergebnisse wiederverwendet statt zweimal berechnet werden, und das globale Optimum garantiert herauskommt. Sechs Läden, acht Artikel: unter einer Sekunde.
Das Ergebnis in beiden Fällen: nicht der günstigste Einzeltreffer pro Artikel, sondern die günstigste Route insgesamt – mit allen Kosten, die sonst niemand aufschreibt.
Ein Einkauf, der auf dem Bon gut aussieht, aber einen 8-km-Umweg verursacht hat, ist kein Sparerfolg. Es ist ein Rechenfehler, den man erst beim Nachdenken bemerkt – und meistens denkt man hinterher nicht mehr nach.
(Wer diese Optimierung programmatisch nutzen möchte – via Claude, ChatGPT oder Python-Agent – findet alle Details im MCP-Entwicklerhandbuch. Fragen zur Datenabdeckung beantwortet die FAQ.)