Zum Inhalt springen

Odoo E-Commerce: Guest Checkout ohne Partner-Chaos

Guest Checkout in Odoo E-Commerce ist praktisch. Der Checkout ist einfacher, und mehr Kunden bestellen. Wie du trotzdem den Überblick im Backend behältst, erfährst du hier.
2. Februar 2026 durch
Odoo E-Commerce: Guest Checkout ohne Partner-Chaos
Nathanael Lee
| Noch keine Kommentare

Beim Guest-Checkout können die Kunden bestellen, ohne ein Kundenkonto anzulegen. Das geht schneller, da sie kein Passwort einrichten müssen. Der Nachteil? Du hast keine gesammelten Kundenkonten im Backend. Du kannst keine Sammelrechnungen stellen, keine Sammelmahnläufe machen und auch keine Auswertungen durchführen. Wenn ein Kunde anruft, kannst du ihm nicht sagen, was er beim letzten Mal bestellt hat. Das sind nur einige Beispiele der grossen Nachteile, die ein Guest-Checkout mit sich bringt. 

So aktivierst du in Odoo den Guest Checkout

Gehe zu Einstellungen -> Website -> E-Commerce. Setze die Option "Anmelden/Registrieren bei Kassiervorgang" auf "Deaktiviert".

Guest Checkout aktivieren

Was passiert im Odoo Backend, wenn ein Kunde mit Guest Checkout bestellt?

In Odoo gibt es zwei Datenmodelle für Kontakte:

(1) res.users: Dieses Model bildet einen User ab, der sich mit einem Login (Website-Account) anmelden kann.

(2) res.partner: Das ist das allgemeine Model für Kontakte. Ein Kontakt hat grundsätzlich kein Login.

Wenn ein Kunde mit Login bestellt, legt Odoo einen res.users-Record (Website-User) an und verknüpft ihn mit einem res.partner-Kontakt.

Wenn ein Kunde per Guest-Checkout bestellt, legt Odoo keinen res.users-Record an, sondern nur einen res.partner-Record.

Wenn derselbe Kunde später erneut per Guest-Checkout bestellt, legt Odoo oft einen weiteren res.partner-Record an, sogar mit der gleichen E-Mail-Adresse. Genau das ist das Problem: Du hast kein Kundenkonto und damit keine saubere Übersicht über alle Bestellungen pro Kunde.

Screenshot Visualisierung Guest vs. Normal Checkout

So kannst du trotz Guest Checkout deine Kunden mit einem zentralen Kontakt verwalten

Unser Ziel ist Folgendes: Für jeden Kunden nur einen Hauptkontakt in Odoo pflegen. Der Hauptkontakt kann mehrere Child-Kontakte (Ansprechpartner, Rechnungs- und Versandadressen) haben. Aber pro Kunde nur einen Commercial-Partner. Der Commercial-Partner wird durch die E-Mail-Adresse identifiziert.

Das erreichen wir, indem wir das Odoo-Standard-Feature ("Kontakte zusammenführen") mit einer automatisierten Aktion kombinieren und Kontakte anhand der E-Mail-Adresse zusammenführen. Das funktioniert auch mit Odoo Online und ist schnell und einfach umzusetzen. 

Die Schwierigkeit dabei: Die gespeicherten Liefer- und Rechnungsadressen dürfen nicht verloren gehen. Zudem muss bedacht werden, dass der Kunde jederzeit Anpassungen an den Adressen vornehmen kann. 

Wenn du das Feature bei dir implementierst, ist es sehr wichtig, dass du es ausgiebig und mit allen möglichen Kombinationen testest. 

Schritt 1: Schalte den Debug-Modus ein und gehe zu Einstellungen / Technisch / Automatisierung / Automatisierungsregeln. Erstelle eine neue Automatisierungsregel. 
​- Name: Merge Partners
​- Modell: Verkaufsauftrag
​- Auslöser: Status ist eingestellt auf Verkaufsauftrag
​- Eine Aktion hinzufügen: Code ausführen

Automatisierungsregel Config



Schritt 2: Füge unter "Code ausführen" folgenden Code hinzu:

partner_model = env['res.partner'].sudo()
wizard_model = env['base.partner.merge.automatic.wizard'].sudo()

partners = records.sudo().mapped('partner_id').mapped('commercial_partner_id')
partners = partner_model.browse(set(partners.ids))

for partner in partners:
email_key = partner.email_normalized
if not email_key:
continue

same_email = partner_model.search([
('active', '=', True),
('parent_id', '=', False),
('email_normalized', '=', email_key),
], order='id asc')

if len(same_email) < 2:
continue

canonical = same_email[0] # lowest id, stable root
current = partner

street_ok = (canonical.street or '').strip().lower() == (current.street or '').strip().lower()
zip_ok = (canonical.zip or '').strip().lower() == (current.zip or '').strip().lower()

if not (street_ok and zip_ok):
# Keep old canonical address as a delivery child (dedup by street+zip), then update canonical to the new address.
old_street = canonical.street or ''
old_zip = canonical.zip or ''

if (old_street or old_zip) and not partner_model.search_count([
('parent_id', '=', canonical.id),
('type', '=', 'delivery'),
('street', '=', old_street),
('zip', '=', old_zip),
]):
partner_model.create({
'parent_id': canonical.id,
'type': 'other',
'name': canonical.name,
'street': canonical.street,
'street2': canonical.street2,
'zip': canonical.zip,
'city': canonical.city,
'state_id': canonical.state_id.id,
'country_id': canonical.country_id.id,
})

canonical.write({
'street': current.street,
'street2': current.street2,
'zip': current.zip,
'city': current.city,
'state_id': current.state_id.id,
'country_id': current.country_id.id,
})

# Merge all main contacts with that email into the canonical one (children are handled by Odoo).
wizard = wizard_model.create({
'dst_partner_id': canonical.id,
'partner_ids': [(6, 0, same_email.ids)],
})
wizard.with_context(skip_auto_partner_merge=True).action_merge()


Fertig! Sobald du nun einen Verkaufsauftrag bestätigst, wird Odoo die Partner anhand der E-Mail-Adresse zusammenführen. 

Wenn du Fragen hast, kontaktiere mich gerne oder schreibe einen Kommentar. 

Nate

Danke für die Registrierung!



Anmelden , um einen Kommentar zu hinterlassen