Ein lokales Unternehmen existiert online an Dutzenden von Orten, die es nicht kontrolliert: Kartenapps, Bewertungsseiten, Branchenverzeichnisse, Datenaggregatoren, Social-Profile. Jeder davon hält seine eigene Kopie des Namens, der Adresse und der Telefonnummer des Unternehmens vor, im lokalen SEO als NAP bekannt. Wenn das Unternehmen umzieht, seine Nummer ändert oder sich umbenennt, bleiben die meisten dieser Kopien unverändert.
Das Ergebnis ist ein Kunde, der eine getrennte Nummer anruft, ein Lieferfahrer an der alten Adresse, und Suchmaschinen sowie Kartenapps, die widersprüchliche Fakten über dasselbe Unternehmen vorhalten. Viele kleinere Seiten übernehmen ihre Daten von größeren, sodass sich ein falscher Eintrag tendenziell verbreitet.
Ein NAP-Audit findet diese Inkonsistenzen systematisch. Dieser Leitfaden behandelt, was zu erfassen ist, wie man Einträge vergleicht, damit Formatierungsrauschen echte Probleme nicht überdeckt, den Code dafür, und wie man Korrekturen priorisiert.
Was ein NAP-Audit prüft
Für jeden Ort, an dem ein Unternehmen gelistet ist, beantwortet ein Audit drei Fragen:
- Name: Ist es der echte Name des Unternehmens, wie er am Ladengeschäft und auf der Website verwendet wird, ohne hinzugefügte Keywords oder eine alte Marke?
- Adresse: Ist es die aktuelle Adresse, einschließlich Suite oder Einheit, mit der richtigen Postleitzahl?
- Telefon: Ist es die aktuelle Hauptnummer, statt einer alten Leitung oder einer Tracking-Nummer, die niemand abnimmt?
Viele Audits prüfen auch die Website-URL, die Öffnungszeiten und die primäre Kategorie, da diese auf die gleiche Weise veralten. Die unten beschriebene Methode lässt sich leicht darauf ausweiten.
Schritt 1: Den kanonischen Datensatz festhalten
Alles wird gegen einen Datensatz verglichen: das NAP des Unternehmens, wie es überall erscheinen sollte. Nimm ihn vom Unternehmen selbst, nicht von einem Verzeichnis, und schreibe ihn vollständig auf: rechtliche Zusätze weggelassen, die Straßenadresse genau so, wie die Post sie führt, die Hauptnummer. Bei einem Unternehmen mit mehreren Standorten einen kanonischen Datensatz pro Standort führen, mit einer stabilen ID.
Das klingt offensichtlich, und genau hier gehen die meisten Audits schief. Wenn der kanonische Datensatz selbst veraltet ist, ist jeder Vergleich in dieselbe Richtung falsch.
Schritt 2: Die Einträge sammeln
Die zu sammelnden Einträge fallen in drei Gruppen:
| Quelle | Beispiele | Wie zu sammeln |
|---|---|---|
| Große Plattformen | Google Business Profile, Apple Business Connect, Bing Places, Facebook | Die eigenen Dashboards und offiziellen APIs des Unternehmens |
| Bewertungs- und Verzeichnisseiten | Allgemeine und Branchenverzeichnisse, Bewertungsplattformen | Offizielle APIs, sofern vorhanden, sonst die öffentliche Eintragsseite |
| Datenaggregatoren | Die Unternehmen, die viele kleinere Verzeichnisse beliefern | Deren Business-Portale |
Nutze offizielle APIs und die eigenen Konten des Unternehmens, wo immer sie existieren: Sie sind zuverlässiger und erlaubt. Für Verzeichnisse ohne API ist die Eintragsseite öffentlich, und das Sammeln einer Seite pro Unternehmen pro Verzeichnis ist eine leichte, gelegentliche Aufgabe. Einträge können auch nach Land und Stadt variieren, also prüfe sie so, wie ein lokaler Kunde sie sehen würde; unser Leitfaden zum Sammeln lokaler Unternehmensdaten behandelt die Erfassungsseite.
Erfasse die Rohwerte genau wie gelistet, zusammen mit der URL und dem Datum. Das Audit vergleicht normalisierte Werte, aber die Korrektur muss genau wissen, was auf jeder Seite falsch ist.
Schritt 3: Vergleichen, ohne im Rauschen zu ertrinken
Ein naiver Vergleich markiert fast alles. “St” gegen “Street”, “(312) 555-0142” gegen “312-555-0142”, “LLC” oder kein “LLC”: Keines davon sind echte Probleme, und ein Audit voller solcher Fälle versteckt den Eintrag, der noch die Telefonnummer vom letzten Jahr trägt.
Die Lösung besteht darin, jedes Feld vor dem Vergleich zu normalisieren und das Ergebnis zu klassifizieren:
| Status | Bedeutung | Priorität |
|---|---|---|
| match | Identisch mit dem kanonischen Datensatz | Keine |
| format | Unterschiedlicher Text, gleicher Wert nach Normalisierung | Niedrig: bei Gelegenheit aufräumen |
| close | Fast gleich, etwa eine fehlende Suite-Nummer oder ein Tippfehler | Mittel: prüfen und korrigieren |
| mismatch | Ein abweichender Wert: eine andere Adresse, eine andere Nummer, ein anderer Name | Hoch: zuerst korrigieren |
| missing | Das Feld ist bei diesem Eintrag leer | Mittel: hinzufügen |
Der folgende Code normalisiert jedes Feld auf eine Weise, die ihm entspricht. Namen verlieren Satzzeichen, Akzente, ein vorangestelltes “The” und rechtliche Zusätze. Adressen werden auf Standardabkürzungen erweitert (“Street” zu “st”, “Suite” zu “ste”) und die ZIP+4-Erweiterung wird entfernt. Telefonnummern werden mit phonenumbers geparst, dem Python-Port der Telefonnummernbibliothek von Google, und im internationalen Format verglichen, sodass jede Formatierung derselben Nummer übereinstimmt.
import re
import unicodedata
from difflib import SequenceMatcher
import phonenumbers
LEGAL_SUFFIXES = {"llc", "inc", "ltd", "co", "corp", "gmbh", "plc", "sl", "srl"}
ADDRESS_WORDS = {
"street": "st", "avenue": "ave", "boulevard": "blvd", "road": "rd", "drive": "dr",
"lane": "ln", "court": "ct", "place": "pl", "suite": "ste", "floor": "fl",
"north": "n", "south": "s", "east": "e", "west": "w", "apartment": "apt", "unit": "ste",
}
def _words(text):
text = unicodedata.normalize("NFKD", text).encode("ascii", "ignore").decode().lower()
text = text.replace("&", " and ").replace("#", " ste ")
return re.sub(r"[^a-z0-9 ]+", " ", text).split()
def norm_name(name):
words = [w for w in _words(name) if w not in LEGAL_SUFFIXES]
return " ".join(words[1:] if words[:1] == ["the"] else words)
def norm_address(address):
# Drop the ZIP+4 extension, so "60607-1234" matches "60607".
address = re.sub(r"\b(\d{5})-\d{4}\b", r"\1", address)
return " ".join(ADDRESS_WORDS.get(w, w) for w in _words(address))
def norm_phone(phone, region="US"):
try:
number = phonenumbers.parse(phone, region)
except phonenumbers.NumberParseException:
return None
if not phonenumbers.is_valid_number(number):
return None
return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.E164)
def compare(field, canonical, listed, region="US"):
"""'match', 'format' (same after normalising), 'close', 'mismatch' or 'missing'."""
if not listed:
return "missing"
if listed.strip() == canonical.strip():
return "match"
if field == "phone":
a, b = norm_phone(canonical, region), norm_phone(listed, region)
return "format" if a and a == b else "mismatch"
normalise = norm_name if field == "name" else norm_address
a, b = normalise(canonical), normalise(listed)
if a == b:
return "format"
return "close" if SequenceMatcher(None, a, b).ratio() >= 0.9 else "mismatch"
def audit(canonical, listings, region="US"):
"""One row per directory: the status of name, address and phone."""
rows = []
for source, listing in listings.items():
row = {"source": source}
for field in ("name", "address", "phone"):
row[field] = compare(field, canonical[field], listing.get(field), region)
rows.append(row)
return rows
Das Argument region teilt dem Telefon-Parser mit, von welchem Land auszugehen ist bei Nummern, die ohne Ländercode geschrieben sind, sodass derselbe Code für ein deutsches oder brasilianisches Unternehmen mit region="DE" oder region="BR" funktioniert. Die Adressabkürzungen sind englischsprachig; erweitere ADDRESS_WORDS für andere Märkte.
Ein Audit durchführen
Hier ist ein Audit eines Unternehmens gegen vier Verzeichniseinträge (ein veranschaulichendes Beispiel, keine echten Einträge):
from nap import audit
canonical = {
"name": "Corner Bakery",
"address": "123 North Main Street, Suite 4, Chicago, IL 60607",
"phone": "(312) 555-0142",
}
listings = {
"Directory A": {"name": "Corner Bakery", "address": "123 N Main St #4, Chicago IL 60607",
"phone": "312-555-0142"},
"Directory B": {"name": "The Corner Bakery LLC", "address": "123 North Main Street, Suite 4, Chicago, IL 60607",
"phone": "(312) 555-0142"},
"Directory C": {"name": "Corner Bakery", "address": "88 West Lake Street, Chicago, IL 60601",
"phone": "(312) 555-0199"},
"Directory D": {"name": "Corner Bakery & Cafe", "address": "123 N Main St, Chicago, IL 60607"},
}
print(f"{'source':<12} {'name':<9} {'address':<9} phone")
for row in audit(canonical, listings):
print(f"{row['source']:<12} {row['name']:<9} {row['address']:<9} {row['phone']}")
source name address phone
Directory A match format format
Directory B format match match
Directory C match mismatch mismatch
Directory D mismatch close missing
Zeile für Zeile gelesen:
- Directory A formatiert Adresse und Telefon unterschiedlich, aber jeder Wert ist korrekt. Nichts zu korrigieren.
- Directory B fügt dem Namen “The” und “LLC” hinzu. Ebenfalls unproblematisch, wenn auch aufräumwürdig.
- Directory C hat den richtigen Namen mit einer alten Adresse und einer alten Telefonnummer. Das ist der Eintrag, der Kunden an den falschen Ort schickt, und derjenige, der zuerst korrigiert werden sollte.
- Directory D hat einen anderen Namen (“Corner Bakery & Cafe”), es fehlt die Suite-Nummer, und es gibt gar keine Telefonnummer.
Schritt 4: In der richtigen Reihenfolge korrigieren
- Zuerst Mismatches auf großen Plattformen. Diese Einträge erreichen die meisten Menschen, und viele kleinere Seiten übernehmen von ihnen.
- Mismatches überall sonst, beginnend mit den Verzeichnissen, die für die Branche des Unternehmens am relevantesten sind, und denen, die in der Suche nach dem Unternehmensnamen ranken.
- Fehlende Felder, besonders die Telefonnummer.
- Nahezu übereinstimmende Fälle wie eine fehlende Suite-Nummer.
- Formatunterschiede zuletzt, wenn überhaupt.
Manche Einträge lassen sich direkt über das eigene Konto des Unternehmens bearbeiten. Andere benötigen einen Beanspruchungsprozess oder eine Support-Anfrage, und Datenaggregatoren benötigen oft Korrekturen, die über ihre eigenen Portale eingereicht werden, wonach die Änderung zu den von ihnen belieferten Seiten fließt. Rechne damit, dass Korrekturen auf manchen Verzeichnissen Wochen brauchen, um zu erscheinen.
Schritt 5: Nach Zeitplan erneut auditieren
Einträge driften zurück. Aggregatoren können Korrekturen überschreiben, Nutzer können auf manchen Plattformen Änderungen vorschlagen, und alte Daten tauchen aus Quellen wieder auf, an die niemand mehr dachte. Führe das Audit monatlich für die großen Plattformen durch und vierteljährlich für den Long Tail, und immer nach einem Umzug, einer Telefonänderung oder einer Umbenennung.
Behalte die Ergebnisse jedes Audits mit seinem Datum. Der Trend zählt mehr als jeder einzelne Durchlauf: Ein Eintrag, der nach jeder Korrektur zur alten Adresse zurückkippt, weist auf eine vorgelagerte Quelle hin, die noch immer die falschen Daten vorhält.
Für Unternehmen, bei denen Kartenrankings wichtig sind, kombiniere das Audit mit einer Rankingmessung über das vom Unternehmen bediente Gebiet. Unser Leitfaden zum Geo-Grid-Rank-Tracking zeigt, wie man das misst und wie sich feststellen lässt, ob sich die Sichtbarkeit verbessert, nachdem die Einträge bereinigt wurden.
Häufige Ursachen für inkonsistente NAP-Daten
- Umzüge und Telefonänderungen, die im Hauptprofil aktualisiert wurden, aber nirgendwo sonst.
- Call-Tracking-Nummern, die für eine Werbekampagne hinzugefügt und nie wieder entfernt wurden.
- Umbenennungen, bei denen der alte Name in Long-Tail-Verzeichnissen weiterlebt.
- Suite- und Einheitsnummern, die von Verzeichnissen ohne entsprechendes Feld weggelassen werden.
- Doppelte Einträge, oft automatisch erzeugt, jeweils mit eigenen, leicht abweichenden Daten.
- Unternehmen mit mehreren Standorten, bei denen die Daten eines Standorts auf den Eintrag eines anderen kopiert wurden.
FAQ
Was ist NAP-Konsistenz?
NAP steht für Name, Adresse und Telefonnummer. NAP-Konsistenz bedeutet, dass das NAP eines Unternehmens überall, wo es online gelistet ist, gleich und korrekt ist: Kartenapps, Verzeichnisse, Bewertungsseiten und die eigene Website.
Spielen Formatierungsunterschiede wie “St” und “Street” eine Rolle?
Viel weniger als falsche Daten. Ein Audit sollte die Formatierung vor dem Vergleich normalisieren, sodass die Einträge mit einer alten Adresse oder Telefonnummer auffallen, statt zwischen harmlosen Unterschieden unterzugehen.
Wie oft sollte ich Unternehmenseinträge auditieren?
Monatlich für die großen Plattformen und vierteljährlich für andere Verzeichnisse ist ein vernünftiger Rhythmus, dazu ein zusätzliches Audit nach jedem Umzug, jeder Telefonänderung oder Umbenennung.
Sollte ich Tracking-Telefonnummern bei Verzeichniseinträgen verwenden?
Mit Vorsicht verwenden. Eine Tracking-Nummer, die nach einer Kampagne entfernt wird, hinterlässt einen Eintrag mit einer toten Nummer. Wenn du eine verwendest, stelle sicher, dass die Hauptnummer ebenfalls gelistet ist, wo es die Plattform erlaubt, und notiere, welcher Eintrag welche Nummer trägt.
Fazit
Ein NAP-Audit ist eine Aufgabe der Datenqualität: ein kanonischer Datensatz, jeder Eintrag erfasst mit seiner Quelle und seinem Datum, Werte normalisiert vor dem Vergleich, und Ergebnisse klassifiziert, damit die echten Probleme auffallen. Korrigiere zuerst Mismatches auf den größten Plattformen, arbeite dich dann nach unten, und auditiere nach Zeitplan erneut, weil Einträge driften. Der obige Code übernimmt den Vergleich; die Disziplin besteht darin, den kanonischen Datensatz korrekt zu halten und auf das zu reagieren, was das Audit findet.