Contact Us

If you still have questions or prefer to get help directly from an agent, please submit a request.
We’ll get back to you as soon as possible.

Please fill out the contact form below and we will reply as soon as possible.

    Sign In
    • Home
    • Meistern der Plattform
    • Analytik

    Datenaustausch via Python

    Technische Dokumentation zum Erfassen von Datensharing-Tabellen über Python durch Kunden

    Contact Us

    If you still have questions or prefer to get help directly from an agent, please submit a request.
    We’ll get back to you as soon as possible.

    Please fill out the contact form below and we will reply as soon as possible.

    German
    FR French
    IT Italian
    JP Japanese
    DE German
    US English (US)
    ES Spanish
    • Meistern der Plattform
      Locator + Pages Plattform Anleitungen API Best Practices In meiner Nähe 360 KI Analytik Startseite Standort-Hub Locator + Seiten Nachrichten Mobile-App Plattformstatus und allgemeine FAQs Bewertungsverwaltung Sozial Das Dashboard Neuerungen
    • Verzeichnisse
      Google Facebook Verzeichnisse Allgemein Verzeichnisliste
    • Release Notes
    + More

    Hintergrund

    Für Kunden, die Data-Visualization-Tools haben, die nicht mit der Datasharing-Methode von Databricks funktionieren, werden wir diese Python-Implementierung verwenden, um eine erfolgreiche Aufnahme zu unterstützen.

    Einführung

    Delta Sharing ist ein offenes Protokoll von Databricks für sichere Datenschreiberung in Echtzeit zwischen Organisationen. Es ermöglicht es einem Datenanbieter, Datensätze mit Empfängern zu teilen, ohne dass diese Databricks oder eine bestimmte Plattform nutzen müssen.

    Diese Anleitung zeigt dir, wie du über Delta Sharing freigegebene Daten verbrauchst und in deine eigene Datenbank aufnimmst. Wir stellen ein gebrauchsfertiges Python-Referenzskript zur Verfügung, das eine gemeinsam genutzte Delta-Tabelle liest und in eine PostgreSQL-Datenbank schreibt.

    Für wen ist das gedacht?

    Diese Anleitung ist für Kunden gedacht, die Daten über Delta Sharing erhalten und diese in ein System laden möchten, das das Delta-Format nicht nativ unterstützt – wie PostgreSQL, MySQL oder eine beliebige SQL-Datenbank.

    Architekturübersicht

    Der Ingestion-Ablauf ist unkompliziert:

    ┌──────────────────────┐ ┌────────────────────┐ ┌──────────────────────┐ │ Databricks │ │ Python-Skript │ │ Deine Datenbank │ │ Delta Sharing │──────▶│ (dieses Repository)│──────▶│ (z.B. PostgreSQL) │ │ │ HTTPS │ │ SQL │ │ │ Shared tables are │ │ 1. Reads data via │ │ Data is written to │ │ accessed via a │ │ Delta Sharing │ │ the target table │ │ .share profile │ │ 2. Loads into a │ │ using standard SQL │ │ │ │ Pandas DataFrame│ │ (INSERT / REPLACE) │ └──────────────────────┘ └────────────────────┘ └──────────────────────┘

    Kein Databricks-Konto erforderlich auf der Empfängerseite.

    Keine speziellen Treiber — das Skript verwendet die Open-Source-Bibliothek delta-sharing.

    Deine Daten bleiben unter deiner Kontrolle — die Daten werden nach dem Einlesen in deiner Datenbank gespeichert.

    Voraussetzungen

    Stelle sicher, dass du folgendes hast, bevor du anfängst:

    Anforderung

    Details

    Python

    Version 3.9 oder höher. Prüfe mit python --version.

    Git

    Um das Repository zu klonen. Prüfe mit git --version.

    Docker (optional)

    Nur erforderlich, wenn du eine lokale PostgreSQL zum Testen starten möchtest.

    PostgreSQL

    Eine laufende Instanz, auf die du Schreibzugriff hast – entweder deine eigene oder die im Repository enthaltene Docker-Einrichtung.

    Delta Sharing-Profil

    Eine .share Datei, die von deinem Datenprovider (Uberall) bereitgestellt wird. Siehe Schritt 1.

     

     

    Schritt 1 – Dein Delta Sharing Profile abrufen

    Dein Datenanbieter (Uberall) stellt dir eine Delta Sharing Profile-Datei zur Verfügung. Es handelt sich um eine kleine JSON-Datei mit einer .share Erweiterung, die die Verbindungsdetails und das Authentifizierungstoken enthält.

    Die Datei sieht so aus:

     
     
    {
      "shareCredentialsVersion": 1,
      "endpoint": "https://<databricks-host>/api/2.0/delta-sharing/",
      "bearerToken": "<your-token>"
    }

    Speichere diese Datei an einem sicheren Ort auf deinem Computer. Du wirst ihren Pfad bei der Konfiguration des Skripts benötigen.

    Wichtig:

    Diese Datei enthält ein Bearer Token, das Zugriff auf die freigegebenen Daten gewährt. Behandle es wie ein Passwort.

    Gib sie nicht in die Versionskontrolle ein.

    Schränke die Dateiberechtigungen ein, damit nur dein Benutzer sie lesen kann:

     

    chmod 600 /path/to/your/profile.share

    Falls du deine Profile-Datei noch nicht erhalten hast, kontaktiere das Uberall Data Engineering Team.

    Schritt 2 — Repository klonen

    Öffne ein Terminal und klone das Repository:

    git clone https://gitlab.com/momentfeed/uberall/development/ar/data-lake/lakehouse/databricks/delta-sharing-code-examples.git

    Navigiere in das Projektverzeichnis:

    cd delta-sharing-code-examples

    Das Repository enthält die folgenden Dateien:

    Datei

    Beschreibung

    delta_sharing_to_postgres.py

    Das Hauptaufnahmeskript.

    requirements.txt

    Python-Abhängigkeiten.

    compose.yaml

    Docker-Compose-Datei, um eine lokale PostgreSQL zu starten.

    README.md

    Schnellstartanleitung und Referenzdokumentation.

    Schritt 3 – Richte eine Python-Umgebung ein

    Wir empfehlen dir, eine virtuelle Umgebung zu verwenden, um Konflikte mit anderen Python-Projekten zu vermeiden.

    Erstelle und aktiviere eine virtuelle Umgebung:

    # Create the virtual environment
    python -m venv venv
    
    # Activate it (Linux / macOS)
    source venv/bin/activate
    
    # Activate it (Windows PowerShell)
    .\venv\Scripts\Activate.ps1

    Installiere die erforderlichen Abhängigkeiten:

    pip install -r requirements.txt

    Dies installiert die folgenden Pakete:

    Paket

    Zweck

    delta-sharing

    Offizielle Databricks-Bibliothek zum Lesen von Delta-Sharing-Tabellen.

    pandas

    Datenmanipulation – die freigegebenen Daten werden als Pandas DataFrame geladen.

    sqlalchemy

    Datenbankabstraktionsebene zum Schreiben von Daten in PostgreSQL (oder andere Datenbanken).

    psycopg2-binary

    PostgreSQL-Treiber, der von SQLAlchemy verwendet wird.

    Schritt 4 – PostgreSQL-Datenbank einrichten

    Du hast zwei Möglichkeiten:

    Option A: Docker-Setup verwenden (empfohlen zum Testen)

    Wenn du Docker installiert hast, enthält das Repository eine compose.yaml, mit der du eine PostgreSQL-16-Instanz mit einem einzelnen Befehl starten kannst.

    Starte die Datenbank:

    docker compose up -d

    Überprüfe, ob sie läuft:

    docker compose logs db

    Suche in der Ausgabe nach database system is ready to accept connections.

    Schneller Verbindungstest:

    docker compose exec db psql -U postgres -d testdb -c "SELECT 1;"

    Die Docker-PostgreSQL-Instanz verwendet die folgenden Standardwerte:

    Einstellung

    Wert

    Host

    localhost

    Port

    5432

    Datenbank

    testdb

    Benutzer

    postgres

    Passwort

    example

    Diese stimmen mit der Standardkonfiguration im Skript überein, sodass keine zusätzlichen Änderungen erforderlich sind.

    Wenn du mit dem Testen fertig bist, fahre die Datenbank herunter:

    # Stop containers (data is preserved)
    docker compose down
    
    # Stop and delete all data
    docker compose down -v

    Option B: Deine eigene PostgreSQL-Instanz verwenden

    Wenn du bereits eine PostgreSQL-Datenbank hast, notiere dir einfach deine Verbindungsdetails (Host, Port, Datenbank, Benutzer, Passwort). Diese gibst du in Schritt 5 ein.

    Schritt 5 – Skript konfigurieren

    Öffne delta_sharing_to_postgres.py in einem beliebigen Texteditor. Am Anfang der Datei findest du den Abschnitt USER CONFIGURATION:

     

    # =============================================================================
    # USER CONFIGURATION — Edit the values below to match your environment.
    # =============================================================================
    
    DELTA_SHARING_PROFILE_PATH = "/path/to/your/profile.share"
    DELTA_SHARING_TABLE = "<share_name>.<schema_name>.<table_name>"
    
    PG_HOST = "localhost"
    PG_PORT = 5432
    PG_DATABASE = "testdb"
    PG_USER = "postgres"
    PG_PASSWORD = "example"
    
    PG_TARGET_SCHEMA = "public"
    PG_TARGET_TABLE = "delta_sharing_data"
    
    WRITE_MODE = "replace"

    Bearbeite die folgenden Werte:

    Variable

     

    Was du einstellen solltest

     

    Beispiel

     

    DELTA_SHARING_PROFILE_PATH

    Pfad zur .share-Datei, die du in Schritt 1 erhalten hast.

    "./config.share"

    DELTA_SHARING_TABLE

    Der vollständig qualifizierte Tabellenname. Format: <share>.<schema>.<table>. Wenn du dir nicht sicher über den Namen bist, sieh dir den Abschnitt „Verfügbare Tabellen entdecken" unten an.

    "my_share.analytics.sales_data"

    PG_HOST

    Dein PostgreSQL-Host. Verwende "localhost" für Docker.

    "localhost"

    PG_PORT

    Dein PostgreSQL-Port.

    5432

    PG_DATABASE

    Der Name deiner Zieldatenbank.

    "testdb"

    PG_USER

    Dein Datenbank-Benutzername.

    "postgres"

    PG_PASSWORD

    Dein Datenbank-Passwort.

    "example"

    PG_TARGET_SCHEMA

    Das Schema, in dem die Tabelle erstellt wird.

    "public"

    PG_TARGET_TABLE

    Der Name der Tabelle, die erstellt oder beschrieben wird.

    "delta_sharing_data"

    WRITE_MODE

    Wie mit bestehenden Daten umgegangen wird. Siehe „Schreibmodi" unten.

    "replace"

     
     
     

    Verfügbare Tabellen entdecken

    Falls du den genauen Tabellennamen nicht kennst, kannst du ein kurzes Discovery-Skript ausführen. Erstelle eine temporäre Python-Datei oder benutze eine Python-Shell:

     
     
    import delta_sharing
    
    client = delta_sharing.SharingClient("/path/to/your/profile.share")
    
    for table in client.list_all_tables():
        print(f"{table.share}.{table.schema}.{table.name}")

    Dies zeigt alle Tabellen, auf die du Zugriff hast. Verwende die vollständige <share>.<schema>.<table>-Zeichenkette als Wert für DELTA_SHARING_TABLE.

    Du kannst auch einfach das Hauptskript ausführen – es protokolliert beim Start alle verfügbaren Tabellen, bevor es versucht, Daten zu lesen.

    Schreibmodi

    Die WRITE_MODE-Einstellung kontrolliert, wie das Skript mit vorhandenen Daten in der Zieltabelle umgeht:

    Modus

    Verhalten

    Typischer Anwendungsfall

    replace

    Löscht und erstellt die Zieltabelle bei jeder Ausführung neu. Alle vorherigen Daten werden gelöscht.

    Vollständige Aktualisierung – du willst immer den neuesten vollständigen Snapshot.

    append

    Fügt neue Zeilen in die vorhandene Tabelle ein. Es wird keine Deduplizierung durchgeführt.

    Datenakkumulation über Zeit (z. B. tägliche Exporte).

    fail

    Das Skript bricht ab, wenn die Zieltabelle bereits vorhanden ist.

    Sicherheitsnetz – um versehentliche Überschreibungen zu vermeiden.

    Schritt 6 – Skript ausführen

    Stelle sicher, dass deine virtuelle Umgebung aktiviert ist (siehe Schritt 3), und führe dann folgendes aus:

    python delta_sharing_to_postgres.py

    Was du erwarten kannst

    Eine erfolgreiche Ausführung erzeugt eine Ausgabe ähnlich wie die folgende:

    2026-02-20 17:20:00,000 [INFO] ============================================================
    2026-02-20 17:20:00,000 [INFO] Delta Sharing to PostgreSQL — Ingestion Script
    2026-02-20 17:20:00,000 [INFO] ============================================================
    2026-02-20 17:20:00,001 [INFO] Loading Delta Sharing profile from: ./config.share
    2026-02-20 17:20:00,002 [INFO] Available shares and tables:
    2026-02-20 17:20:01,500 [INFO]   my_share.analytics.sales_data
    2026-02-20 17:20:01,500 [INFO] Reading table: my_share.analytics.sales_data
    2026-02-20 17:20:05,000 [INFO] Read 15000 rows and 12 columns.
    2026-02-20 17:20:05,001 [INFO] Preview of the data (first 5 rows):
    2026-02-20 17:20:05,002 [INFO]
       col_a  col_b  col_c ...
    0  ...    ...    ...
    1  ...    ...    ...
    2026-02-20 17:20:05,100 [INFO] Connecting to PostgreSQL...
    2026-02-20 17:20:05,200 [INFO] PostgreSQL connection successful.
    2026-02-20 17:20:05,201 [INFO] Writing 15000 rows to public.delta_sharing_data (mode=replace)...
    2026-02-20 17:20:08,000 [INFO] Write complete.
    2026-02-20 17:20:08,100 [INFO] Validation: public.delta_sharing_data now contains 15000 rows.
    2026-02-20 17:20:08,101 [INFO] ============================================================
    2026-02-20 17:20:08,101 [INFO] Ingestion completed successfully.
    2026-02-20 17:20:08,101 [INFO] ============================================================

    Das Skript:

    Verbindet sich mit Delta Sharing und listet alle verfügbaren Tabellen auf.

    Liest die angegebene Tabelle in den Arbeitsspeicher.

    Zeigt eine Vorschau der ersten 5 Zeilen.

    Schreibt die Daten in deine PostgreSQL-Instanz.

    Validiert die Aufnahme durch Zählen der Zeilen in der Zieltabelle.

    Schritt 7 – Daten überprüfen

    Nach einem erfolgreichen Durchlauf kannst du die Daten in PostgreSQL überprüfen.

    Über die Befehlszeile (Docker-Setup):

    docker compose exec db psql -U postgres -d testdb -c "SELECT COUNT(*) FROM public.delta_sharing_data;"

    Mit einem SQL-Client (DataGrip, DBeaver, pgAdmin, etc.):

    Verbinde dich mit deiner PostgreSQL-Instanz mit den gleichen Anmeldedaten aus Schritt 5 und führe dann aus:

    -- Zeilenzahl
    SELECT COUNT(*) FROM public.delta_sharing_data;
    
    -- Zeilen anzeigen
    SELECT * FROM public.delta_sharing_data LIMIT 10;
    
    -- Spaltendatentypen überprüfen
    SELECT column_name, data_type
    FROM information_schema.columns
    WHERE table_schema = 'public' AND table_name = 'delta_sharing_data';

    Anwendungsfälle

    Vollständige Snapshot-Aktualisierung

    Stelle WRITE_MODE = "replace" ein und führe das Skript nach einem Zeitplan aus (z. B. täglich über einen Cron-Job). Bei jedem Durchlauf werden alle Tabellendaten durch die neuesten Daten aus dem Share ersetzt.

    # Beispiel-Cron-Eintrag: täglich um 2:00 Uhr ausführen
    0 2 * * * /path/to/venv/bin/python /path/to/delta_sharing_to_postgres.py

     

    Anhängen / Daten im Laufe der Zeit sammeln

    Stelle WRITE_MODE = "append" ein, um bei jedem Durchlauf neue Zeilen hinzuzufügen. Das ist praktisch, wenn die gemeinsam genutzte Tabelle neue Datensätze enthält (z. B. täglich neue Ereignisse oder Logs) und du eine Historie in deiner Datenbank aufbauen möchtest.

    Hinweis: Dieser Modus führt keine Deduplizierung durch. Wenn du das Skript zweimal mit den gleichen Daten ausführst, wirst du doppelte Zeilen haben. Erwäge, eine Deduplizierungslogik in deiner Datenbank oder im Skript hinzuzufügen, wenn das ein Problem darstellt.

    In eine andere Datenbank laden

    Das Skript verwendet SQLAlchemy, das viele Datenbanken unterstützt. Um eine andere Datenbank anzusteuern, ändere die Verbindungszeichenfolge in build_pg_connection_string() und installiere den passenden Treiber:

    Zieldatenbank

    Format der Verbindungszeichenfolge

    Zu installierender Treiber

    PostgreSQL

    postgresql+psycopg2://user:pass@host:port/db

    psycopg2-binary (enthalten)

    MySQL

    mysql+pymysql://user:pass@host:port/db

    pip install pymysql

    Microsoft SQL Server

    mssql+pyodbc://user:pass@host:port/db?driver=ODBC+Driver+18+for+SQL+Server

    pip install pyodbc

    SQLite (lokale Datei)

    sqlite:///path/to/database.db

    Integriert (keine Installation erforderlich)

    Aufnahme in ein Data Warehouse oder Cloud-Datenbank

    Der gleiche Ansatz funktioniert mit in der Cloud gehosteten Datenbanken (Amazon RDS, Google Cloud SQL, Azure Database for PostgreSQL usw.). Aktualisiere einfach die Verbindungsparameter, um auf deine Cloud-Instanz zu verweisen.

    Anpassungsleitfaden

    Das Skript ist bewusst einfach gestaltet und soll an deine Anforderungen angepasst werden. Hier sind häufige Änderungen.

    Daten vor dem Laden filtern oder transformieren

    Nach dem Auslesen der Daten kannst du den Pandas DataFrame manipulieren, bevor du ihn in die Datenbank schreibst. Um zum Beispiel nur bestimmte Spalten zu behalten:

    df = read_delta_sharing_table(DELTA_SHARING_PROFILE_PATH, DELTA_SHARING_TABLE)
    
    # Keep only the columns you need
    df = df[["column_a", "column_b", "column_c"]]
    
    # Rename columns to match your schema
    df = df.rename(columns={"column_a": "id", "column_b": "name"})
    
    # Filter rows
    df = df[df["status"] == "active"]
    
    ingest_to_postgres(df, connection_string, PG_TARGET_SCHEMA, PG_TARGET_TABLE, WRITE_MODE)

     

    Inkrementelles Laden (nur neue Daten)

    Wenn die gemeinsame Tabelle eine Spalte für Zeitstempel oder Datum hat, kannst du filtern, um nur neue Datensätze zu laden:

    df = read_delta_sharing_table(DELTA_SHARING_PROFILE_PATH, DELTA_SHARING_TABLE)
    
    # Only load data from the last 7 days
    from datetime import datetime, timedelta
    cutoff = datetime.now() - timedelta(days=7)
    df = df[df["updated_at"] >= cutoff]
    
    ingest_to_postgres(df, connection_string, PG_TARGET_SCHEMA, PG_TARGET_TABLE, "append")

    Mehrere Tabellen laden

    Dupliziere den Konfigurationsblock oder durchlaufe eine Liste von Tabellen:

    TABLES_TO_INGEST = [
        {"delta_table": "my_share.schema.table_a", "pg_table": "table_a"},
        {"delta_table": "my_share.schema.table_b", "pg_table": "table_b"},
    ]
    
    for entry in TABLES_TO_INGEST:
        df = read_delta_sharing_table(DELTA_SHARING_PROFILE_PATH, entry["delta_table"])
        ingest_to_postgres(df, connection_string, PG_TARGET_SCHEMA, entry["pg_table"], WRITE_MODE)

    Umgebungsvariablen statt hartcodierter Werte verwenden

    Für den Produktivbetrieb solltest du keine Geheimnisse im Skript hartcodieren. Verwende stattdessen Umgebungsvariablen:

    import os
    
    DELTA_SHARING_PROFILE_PATH = os.environ["DELTA_SHARING_PROFILE_PATH"]
    PG_HOST = os.environ.get("PG_HOST", "localhost")
    PG_PASSWORD = os.environ["PG_PASSWORD"]

    Lege sie dann vor dem Ausführen fest:

    export DELTA_SHARING_PROFILE_PATH="./config.share"
    export PG_PASSWORD="your_password"
    python delta_sharing_to_postgres.py

    Sicherheits-Best-Practices

    Thema

    Empfehlung

    Profildatei (.share)

    Speichere deine Datei sicher ab. Niemals in die Versionskontrolle einchecken. Beschränke die Dateiberechtigungen (chmod 600).

    Bearer-Token-Ablauf

    Tokens können ein Ablaufdatum haben. Falls du 401 Unauthorized Fehlermeldungen erhältst, fordere ein neues Profil von deinem Datenanbieter an.

    Datenbankpasswörter

    Codiere diese nicht in das Skript für die Produktion. Verwende Umgebungsvariablen oder einen Secrets Manager.

    Netzwerkzugriff

    Stelle sicher, dass dein Rechner beide Verbindungen erreichen kann: den Databricks-Endpoint (HTTPS) und deine PostgreSQL-Instanz.

    Daten im Ruhezustand

    Nach dem Einspielen stehen die Daten unter deiner Kontrolle. Wende die Datenschutzrichtlinien deiner Organisation auf die Zieldatenbank an.

    Fehlerbehebung

    Fehler

    Ursache

    Lösung

    FileNotFoundError im Profil

    Der .share-Dateipfad ist falsch oder die Datei existiert nicht.

    Überprüfe DELTA_SHARING_PROFILE_PATH doppelt. Verwende einen absoluten Pfad, wenn du dir unsicher bist.

    HTTPError 401 Unauthorized

    Das Bearer-Token ist ungültig oder abgelaufen.

    Kontaktiere deinen Datenprovider (Uberall) für eine neue Profildatei.

    HTTPError 403 Forbidden

    Du hast keine Berechtigung für den Zugriff auf diese Freigabe oder Tabelle.

    Überprüfe den Tabellennamen. Wende dich an deinen Datenprovider, um die Empfängerberechtigungen zu überprüfen.

    HTTPError 404 Not Found / SHARE_DOES_NOT_EXIST

    Der Freigabename in DELTA_SHARING_TABLE ist fehlerhaft.

    Führe den Tabellenerkennungsschritt aus (siehe Schritt 5), um verfügbare Freigaben aufzulisten, und verwende den genauen angezeigten Namen.

    DS_MATERIALIZATION_QUERY_FAILED

    Der Datenprovider hat die Materialisierung für die Freigabe nicht konfiguriert. Dies ist ein serverseitiges Problem.

    Kontaktiere deinen Datenprovider (Uberall) und teile diese Fehlermeldung mit. Dies kann auf Empfängerseite nicht behoben werden.

    psycopg2.OperationalError: could not connect

    PostgreSQL ist nicht erreichbar.

    Überprüfe Host, Port und Anmeldedaten. Wenn du Docker verwendest, stelle sicher, dass Container laufen (docker compose ps). Überprüfe, dass Port 5432 nicht durch eine Firewall blockiert wird.

    psycopg2.OperationalError: password authentication failed

    Falscher Benutzername oder Passwort.

    Überprüfe PG_USER und PG_PASSWORD. Bei der Docker-Einrichtung sind die Standardwerte postgres / example.

    Empty DataFrame (0 rows)

    Die gemeinsame Tabelle existiert, enthält aber keine Daten.

    Erkundige dich bei deinem Datenprovider, ob die Tabelle voraussichtlich Daten enthalten soll.

    ModuleNotFoundError: No module named 'delta_sharing'

    Abhängigkeiten sind nicht installiert oder die virtuelle Umgebung ist nicht aktiviert.

    Führe pip install -r requirements.txt aus und stelle sicher, dass deine virtuelle Umgebung aktiviert ist.

    Support

    Falls du auf Probleme stößt, die sich beziehen auf:

    Die gemeinsamen Daten, Zugriffstoken oder Berechtigungen – kontaktiere das Uberall Data Engineering Team.

    Das Ingestion-Skript – lies diesen Guide und die README.md im Repository. Das Skript wird als Referenz-Implementierung bereitgestellt; du bist dafür verantwortlich, es für deine Umgebung anzupassen und zu warten.

    datenkommunikation datenübertragung

    Was this article helpful?

    Yes
    No
    Give feedback about this article

    Related Articles

    • Facebook Post Performance Report
    • Kundenerfolgsbericht
    • Reputation Insights (ehemals Customer Feedback/Experience)
    • Facebook Reach Veröffentlicht Juni 2025
    • Facebook Post Performance Veröffentlicht im Juni 2025
     

    Copyright 2026 – uberall.

    Expand