{"id":475,"date":"2026-09-17T15:30:00","date_gmt":"2026-09-17T13:30:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/?p=475"},"modified":"2026-10-26T12:09:31","modified_gmt":"2026-10-26T11:09:31","slug":"automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/","title":{"rendered":"Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python &amp; Scripts"},"content":{"rendered":"<p>Ein Preis- und Bestandsmonitor kann Anzeigen f\u00fcr nicht verf\u00fcgbare Produkte erkennen und \u00c4nderungen vorbereiten. Daf\u00fcr braucht der Prozess aktuelle Produktdaten, eine eindeutige Anzeigenzuordnung und klare Regeln f\u00fcr vorhandene Pausen. Ein st\u00fcndlicher Lauf arbeitet weder in Echtzeit noch ohne Verz\u00f6gerung; bessere Rendite oder vollst\u00e4ndig vermiedene unn\u00f6tige Ausgaben lassen sich daraus nicht garantieren.<\/p>\n<h2>1. Zuerst das richtige Objekt bestimmen<\/h2>\n<p>Eine einzelne Produktanzeige kann einer SKU zugeordnet werden, der internen Kennung einer bestimmten Produktvariante im Shop. Eine Anzeigengruppe kann dagegen mehrere Anzeigen und Produkte enthalten. Das Pausieren der gesamten Gruppe wegen einer SKU trifft dann auch verf\u00fcgbare Angebote. Bei Katalog-Anzeigen geh\u00f6rt die Produktverf\u00fcgbarkeit in den Katalog, etwa \u00fcber <code>availability<\/code>; Datenannahme, Verarbeitung und tats\u00e4chliche Auslieferung ben\u00f6tigen eigene Kontrollen.<\/p>\n<p>Eine gepr\u00fcfte Zuordnung aus Werbekonto, Anzeigen-ID und SKU ist belastbarer als ein Namensfragment. Namen k\u00f6nnen ge\u00e4ndert oder mehrfach verwendet werden. Katalog-Anzeigen und Anzeigen mit mehreren Produkten bleiben au\u00dferhalb der unten gezeigten Einzelproduktregel.<\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-474-admonitor-20261024-de.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Datenpr\u00fcfung, \u00c4nderungsvorschlag und tats\u00e4chliche Status\u00e4nderung sind getrennte Schritte.\"><figcaption>Datenpr\u00fcfung, \u00c4nderungsvorschlag und tats\u00e4chliche Status\u00e4nderung sind getrennte Schritte.<\/figcaption><\/figure>\n<h2>2. Regeln ohne falsche Gewissheit<\/h2>\n<ul><li><strong>Bestand:<\/strong> Verf\u00fcgbarer verkaufbarer Bestand muss Reservierungen und den vorgesehenen Umgang mit Vorbestellungen ber\u00fccksichtigen. Fehlende oder veraltete Daten bedeuten nicht null Bestand. Negative Werte ben\u00f6tigen eine ausdr\u00fccklich definierte Behandlung.<\/li><li><strong>Preis:<\/strong> Varianten, Packungsgr\u00f6\u00dfe, W\u00e4hrung, Steuer, Versand und Lieferbarkeit m\u00fcssen vergleichbar sein. Ein automatisch aus einer Webseite ausgelesener Zahlenwert allein gen\u00fcgt nicht.<\/li><li><strong>Schwelle:<\/strong> Acht Prozent sind eine Beispielentscheidung, keine belegte allgemeine Grenze f\u00fcr Conversion-Verluste. Bezogen auf den eigenen Preis gilt <code>(eigener Preis \u2212 Vergleichspreis) \/ eigener Preis<\/code>. Bei 100 \u20ac und 92 \u20ac ergibt das genau 8 %; mit dem Vergleichspreis als Nenner w\u00e4ren es rund 8,70 %.<\/li><li><strong>Reaktivierung:<\/strong> Eine manuelle Pause darf nicht durch einen guten Lagerbestand aufgehoben werden. Auch eine vom Monitor verursachte Pause ben\u00f6tigt einen Nachweis, dass keine andere Sperre hinzugekommen ist.<\/li><\/ul>\n<h2>3. Eine isolierte Entscheidungsfunktion<\/h2>\n<p>Das folgende Python-Beispiel gibt ausschlie\u00dflich Vorschl\u00e4ge zur\u00fcck. Es l\u00e4dt keinen Produktfeed, liest kein Werbekonto und ver\u00e4ndert keine Anzeige. Die vorgelagerte Datenaufbereitung liefert eine gepr\u00fcfte Einzelproduktzuordnung, den aktuellen konfigurierten Anzeigenstatus und einen expliziten manuellen Sperrzustand. <code>manual_hold=False<\/code> ist eine bewusst gepflegte Eingabe, kein Meta-API-Feld.<\/p>\n<p>Geldwerte kommen als Text mit Dezimalpunkt, etwa <code>&quot;19.95&quot;<\/code>, Bestand als nicht negative ganze Zahl und Zeitpunkte mit Zeitzone. Das Beispiel begrenzt Preisgr\u00f6\u00dfen auf einen Dezimalexponenten von \u22126 bis 12 (Werte ab 0,000001 und kleiner als 10.000.000.000.000) und erwartet dreistellige Gro\u00dfbuchstaben als W\u00e4hrungsformat; die tats\u00e4chliche ISO-W\u00e4hrung und fachliche Vergleichbarkeit pr\u00fcft die Datenaufbereitung. Die maximale Datenalterung von einer Stunde ist ebenfalls eine Beispielregel.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"python\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Python<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-python\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">from<\/span> datetime <span class=\"cbb-keyword\">import<\/span> datetime, timezone\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">from<\/span> decimal <span class=\"cbb-keyword\">import<\/span> Decimal, InvalidOperation\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">MAX_AGE_SECONDS = <span class=\"cbb-number\">3600<\/span>  <span class=\"cbb-comment\"># Example policy, not a Meta requirement.<\/span>\n<\/span><span class=\"cbb-line\">PRICE_GAP = <span class=\"cbb-function\">Decimal<\/span>(<span class=\"cbb-string\">\"0.08\"<\/span>)\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">fresh<\/span>(value, now):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">try<\/span>:\n<\/span><span class=\"cbb-line\">        stamp = datetime.<span class=\"cbb-function\">fromisoformat<\/span>(value.<span class=\"cbb-function\">replace<\/span>(<span class=\"cbb-string\">\"Z\"<\/span>, <span class=\"cbb-string\">\"+00:00\"<\/span>))\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> stamp.tzinfo <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-constant\">None<\/span>:\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">False<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-number\">0<\/span> &lt;= (now - stamp).<span class=\"cbb-function\">total_seconds<\/span>() &lt;= MAX_AGE_SECONDS\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">except<\/span> (AttributeError, TypeError, ValueError):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-constant\">False<\/span>\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">positive_money<\/span>(value):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(value, str) <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-function\">len<\/span>(value) &gt; <span class=\"cbb-number\">40<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"Money must be a decimal string\"<\/span>)\n<\/span><span class=\"cbb-line\">    amount = <span class=\"cbb-function\">Decimal<\/span>(value)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> amount.<span class=\"cbb-function\">is_finite<\/span>() <span class=\"cbb-keyword\">or<\/span> amount &lt;= <span class=\"cbb-number\">0<\/span> <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-number\">-6<\/span> &lt;= amount.<span class=\"cbb-function\">adjusted<\/span>() &lt;= <span class=\"cbb-number\">12<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"Invalid price\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> amount\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">def<\/span> <span class=\"cbb-function\">propose<\/span>(item, ad, now):\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-string\">\"\"\"Pure decision function: no API calls and no status writes.\"\"\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> now.tzinfo <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-constant\">None<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">raise<\/span> <span class=\"cbb-function\">ValueError<\/span>(<span class=\"cbb-string\">\"now must include a timezone\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> (ad.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"kind\"<\/span>) != <span class=\"cbb-string\">\"single_product\"<\/span>\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">or<\/span> ad.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"sku\"<\/span>) != item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"sku\"<\/span>)\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"sku\"<\/span>), str) <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> item&#91;<span class=\"cbb-string\">\"sku\"<\/span>&#93;\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(ad.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"id\"<\/span>), str) <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> ad&#91;<span class=\"cbb-string\">\"id\"<\/span>&#93;.<span class=\"cbb-function\">isascii<\/span>()\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> ad&#91;<span class=\"cbb-string\">\"id\"<\/span>&#93;.<span class=\"cbb-function\">isdigit<\/span>()):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"mapping\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> ad.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"manual_hold\"<\/span>) <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-constant\">False<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"manual_or_unknown_hold\"<\/span>\n<\/span><span class=\"cbb-line\">    status = ad.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"status\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> status <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-keyword\">in<\/span> {<span class=\"cbb-string\">\"ACTIVE\"<\/span>, <span class=\"cbb-string\">\"PAUSED\"<\/span>}:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"unsupported_status\"<\/span>\n<\/span><span class=\"cbb-line\">    stock = item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"stock\"<\/span>)\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-function\">type<\/span>(stock) <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-keyword\">not<\/span> int <span class=\"cbb-keyword\">or<\/span> stock &lt; <span class=\"cbb-number\">0<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"invalid_stock\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">fresh<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"stock_at\"<\/span>), now):\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"stale_stock\"<\/span>\n<\/span><span class=\"cbb-line\">    reason = <span class=\"cbb-constant\">None<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> stock == <span class=\"cbb-number\">0<\/span>:\n<\/span><span class=\"cbb-line\">        reason = <span class=\"cbb-string\">\"out_of_stock\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">else<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> (item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"comparable\"<\/span>) <span class=\"cbb-keyword\">is<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-constant\">True<\/span>\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"currency\"<\/span>) != item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"competitor_currency\"<\/span>)\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">isinstance<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"currency\"<\/span>), str)\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-function\">len<\/span>(item&#91;<span class=\"cbb-string\">\"currency\"<\/span>&#93;) != <span class=\"cbb-number\">3<\/span>\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> item&#91;<span class=\"cbb-string\">\"currency\"<\/span>&#93;.<span class=\"cbb-function\">isascii<\/span>()\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> item&#91;<span class=\"cbb-string\">\"currency\"<\/span>&#93;.<span class=\"cbb-function\">isalpha<\/span>()\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> item&#91;<span class=\"cbb-string\">\"currency\"<\/span>&#93; != item&#91;<span class=\"cbb-string\">\"currency\"<\/span>&#93;.<span class=\"cbb-function\">upper<\/span>()\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">fresh<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"price_at\"<\/span>), now)\n<\/span><span class=\"cbb-line\">                <span class=\"cbb-keyword\">or<\/span> <span class=\"cbb-keyword\">not<\/span> <span class=\"cbb-function\">fresh<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"competitor_at\"<\/span>), now)):\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"incomparable_or_stale_prices\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">try<\/span>:\n<\/span><span class=\"cbb-line\">            own = <span class=\"cbb-function\">positive_money<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"price\"<\/span>))\n<\/span><span class=\"cbb-line\">            other = <span class=\"cbb-function\">positive_money<\/span>(item.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"competitor_price\"<\/span>))\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">except<\/span> (ValueError, InvalidOperation):\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"REVIEW\"<\/span>, <span class=\"cbb-string\">\"invalid_price\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-comment\"># Competitor discount relative to the shop's own price.<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> (own - other) \/ own &gt; PRICE_GAP:\n<\/span><span class=\"cbb-line\">            reason = <span class=\"cbb-string\">\"price_gap\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> reason:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> (<span class=\"cbb-string\">\"PAUSE_REVIEW\"<\/span> <span class=\"cbb-keyword\">if<\/span> status == <span class=\"cbb-string\">\"ACTIVE\"<\/span> <span class=\"cbb-keyword\">else<\/span> <span class=\"cbb-string\">\"NO_CHANGE\"<\/span>), reason\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">if<\/span> status == <span class=\"cbb-string\">\"PAUSED\"<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">if<\/span> ad.<span class=\"cbb-function\">get<\/span>(<span class=\"cbb-string\">\"pause_owner\"<\/span>) == <span class=\"cbb-string\">\"inventory_monitor\"<\/span>:\n<\/span><span class=\"cbb-line\">            <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"RESUME_REVIEW\"<\/span>, <span class=\"cbb-string\">\"conditions_recovered\"<\/span>\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"NO_CHANGE\"<\/span>, <span class=\"cbb-string\">\"pause_not_owned\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-keyword\">return<\/span> <span class=\"cbb-string\">\"NO_CHANGE\"<\/span>, <span class=\"cbb-string\">\"conditions_ok\"<\/span><\/span><\/code><\/pre><\/figure>\n<p><code>PAUSE_REVIEW<\/code> bedeutet einen begr\u00fcndeten Pausenvorschlag. <code>RESUME_REVIEW<\/code> ist ein Pr\u00fcfauftrag zur m\u00f6glichen Wiederaufnahme, kein Status <code>ACTIVE<\/code>. <code>REVIEW<\/code> kennzeichnet unbrauchbare oder unklare Eingaben; <code>NO_CHANGE<\/code> l\u00f6st keine \u00c4nderung aus. Das Beispiel betrachtet g\u00fcltigen Nullbestand unabh\u00e4ngig von fehlenden Vergleichspreisen. Bei positivem Bestand verhindert ein fehlender Preisvergleich eine Freigabeempfehlung.<\/p>\n<h2>4. API-Anbindung und tats\u00e4chliche Ausf\u00fchrung erg\u00e4nzen<\/h2>\n<p>F\u00fcr einen produktiven Adapter ben\u00f6tigt die Anwendung passende App-Berechtigungen und zugewiesene Werbekonto-Ressourcen. Eine pauschale Admin-Systemnutzer-Empfehlung ist unn\u00f6tig. Lesezugriff und Schreibzugriff sind getrennt zu planen; <code>ads_management<\/code> erm\u00f6glicht \u00c4nderungen. Auch ein Token ohne festen Ablauftermin kann ung\u00fcltig werden. Zugangsdaten geh\u00f6ren nicht in Quellcode, Beispielwerte oder Logs.<\/p>\n<p>Die Marketing-API-Version muss ausdr\u00fccklich festgelegt und vor Ablauf aktualisiert werden. Die am 24. Oktober 2026 gepr\u00fcfte Referenz nennt v26.0; ein altes fest eingebautes v20.0 ist keine belastbare Grundlage. Beim Laden einer Anzeigenliste m\u00fcssen alle Ergebnisseiten verarbeitet werden. Ein gr\u00f6\u00dferes <code>limit<\/code> ersetzt das Abrufen weiterer Ergebnisseiten nicht. Scheitert eine Seite, darf das Teilergebnis nicht als vollst\u00e4ndiger erfolgreicher Lauf gelten.<\/p>\n<ol><li>Vor einer \u00c4nderung freigegebene Anzeigen-ID, Kontozuordnung, frische Produktdaten, manuelle Sperren und aktuellen Status erneut pr\u00fcfen. Eine Vorschlagsdatei kann inzwischen veraltet sein.<\/li><li>Nur den ausdr\u00fccklich ausgew\u00e4hlten Status schreiben. API-Fehler, ung\u00fcltige JSON-Antworten, Zeit\u00fcberschreitungen und Rate-Limits als Fehler behandeln. Nach unklarem Ausgang zuerst den Status lesen, bevor eine Wiederholung erfolgt.<\/li><li>Erfolgreiche \u00c4nderung und anschlie\u00dfenden Statusabgleich dokumentieren. HTTP 200 allein ist kein Auslieferungsnachweis. <code>effective_status<\/code> kann wegen \u00fcbergeordneter Pausen, Pr\u00fcfung oder anderer Probleme vom gesetzten Status abweichen.<\/li><li>Eigene Pausen mit Zeitpunkt, vorherigem Status, Regel und Produktdatennachweis in einem dauerhaften Journal festhalten. Wiederaufnahme nur nach zus\u00e4tzlicher Freigabe; konkurrierende manuelle \u00c4nderungen d\u00fcrfen nicht \u00fcberschrieben werden.<\/li><\/ol>\n<p>Automatische Reaktivierung ben\u00f6tigt dar\u00fcber hinaus einen geregelten Schreibzugriff, eine ausdr\u00fcckliche Zust\u00e4ndigkeit und eine Strategie f\u00fcr konkurrierende \u00c4nderungen. Ein blo\u00dfes Feld <code>pause_owner<\/code> beweist diese Voraussetzungen nicht. Das Beispiel liefert deshalb auch bei einer eigenen Pause lediglich einen Wiederaufnahmevorschlag.<\/p>\n<h2>5. Den Monitor selbst \u00fcberwachen<\/h2>\n<p>Ein Zeitplan ersetzt keine Betriebs\u00fcberwachung. Zu jedem Lauf geh\u00f6ren Start, Ende, gelesene Seiten, Datenalter, Zahl gepr\u00fcfter Zuordnungen, Vorschl\u00e4ge und Fehler. Leere Feeds und fehlende Zuordnungen ben\u00f6tigen eine ausdr\u00fccklich festgelegte Bewertung. Ein externer Pr\u00fcfer muss ausbleibende erfolgreiche L\u00e4ufe erkennen; ein Alarm nur bei Statuswechseln \u00fcbersieht einen abgest\u00fcrzten Monitor.<\/p>\n<p>Eine Ausf\u00fchrungssperre l\u00e4sst nur einen Monitorlauf gleichzeitig zu. Zur Betriebsintegration geh\u00f6ren au\u00dferdem eine begrenzte Zahl von Wiederholungen mit Wartezeit, ein sicherer Wechsel der Protokolldateien zur Gr\u00f6\u00dfenbegrenzung und gepr\u00fcfte Benachrichtigungen. Diese Komponenten und ein tats\u00e4chlicher Meta-Zugriff sind nicht Bestandteil der reinen Entscheidungsfunktion.<\/p>\n<div class=\"lw-faq\"><h2>Fragen und Antworten<\/h2><h3>Warum wird ein manuell pausiertes Angebot nicht automatisch aktiviert?<\/h3><p>Der Pausengrund kann au\u00dferhalb von Bestand und Preis liegen, etwa in einer laufenden Pr\u00fcfung oder Kampagnenentscheidung. Ein weiterhin vorhandener Bestand widerlegt diesen Grund nicht. Freigabe und \u00c4nderungsjournal m\u00fcssen den aktuellen Zustand ber\u00fccksichtigen.<\/p><h3>Verhindert ein erfolgreicher Lauf alle unn\u00f6tigen Ausgaben?<\/h3><p>Nein. Zwischen Bestands\u00e4nderung, Feed\u00fcbertragung, Verarbeitung, API-Aufruf und tats\u00e4chlicher Auslieferung liegen Verz\u00f6gerungen. Ein Monitor kann diese L\u00fccke verkleinern, aber weder auf null setzen noch einen bestimmten ROAS garantieren. Der ROAS setzt den zugerechneten Umsatz ins Verh\u00e4ltnis zu den Werbekosten. Wirkung und Fehlalarme ben\u00f6tigen Messungen am konkreten Konto.<\/p><\/div><div class=\"lw-quellen\"><h2>Quellen<\/h2><ul><li><a href=\"https:\/\/developers.facebook.com\/documentation\/ads-commerce\/marketing-api\/reference\/adgroup\">Meta: Anzeigenreferenz<\/a><\/li><li><a href=\"https:\/\/developers.facebook.com\/documentation\/ads-commerce\/marketing-api\/overview\/versioning\">Meta: Versionierung der Marketing API<\/a><\/li><li><a href=\"https:\/\/developers.facebook.com\/documentation\/ads-commerce\/marketing-api\/best-practices\/manage-your-ad-object-status\">Meta: Anzeigenstatus<\/a><\/li><li><a href=\"https:\/\/developers.facebook.com\/docs\/marketing-api\/reference\/product-item\/\">Meta: Produkteintrag<\/a><\/li><li><a href=\"https:\/\/developers.facebook.com\/docs\/graph-api\/results\/\">Meta: Ergebnisse seitenweise abrufen<\/a><\/li><li><a href=\"https:\/\/developers.facebook.com\/docs\/business-management-apis\/system-users\">Meta: Systemnutzer<\/a><\/li><\/ul><\/div>","protected":false},"excerpt":{"rendered":"<p>Ein Python-Konzept zur Pr\u00fcfung von Bestand und Preisen vor \u00c4nderungen am Status von Meta Ads. Datenvalidierung, Pausierungsregeln, kontrollierte Wiederaufnahme und API-Fehler werden getrennt behandelt; Beispielcode ben\u00f6tigt eine kontospezifische Anbindung.<\/p>\n","protected":false},"author":1,"featured_media":28037,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[129],"tags":[92055,92026,92107,92424,92048,92235],"class_list":["post-475","post","type-post","status-publish","format-standard","hentry","category-tutorials-de-digital-marketing-de","tag-automation-de","tag-marketing-cyfrowy-pl-de","tag-e-commerce-de","tag-python-de","tag-rest-api-de","tag-tutorial-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python &amp; Scripts | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Meta-Anzeigen mit Python \u00fcberwachen: Lagerbestand und Preise auswerten, Anzeigen pausieren oder fortsetzen und Cron-L\u00e4ufe kontrollieren.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python &amp; Scripts | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Meta-Anzeigen mit Python \u00fcberwachen: Lagerbestand und Preise auswerten, Anzeigen pausieren oder fortsetzen und Cron-L\u00e4ufe kontrollieren.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-17T13:30:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T11:09:31+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-475-automatisches-preis-bestands-monitor-g.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python &amp; Scripts\",\"datePublished\":\"2026-09-17T13:30:00+00:00\",\"dateModified\":\"2026-10-26T11:09:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/\"},\"wordCount\":962,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/lw-flux3-20261031\\\/hero-475.png\",\"keywords\":[\"Automation\",\"Digital Marketing\",\"E-Commerce\",\"Python\",\"REST API\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/\",\"name\":\"Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python &amp; Scripts | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/lw-flux3-20261031\\\/hero-475.png\",\"datePublished\":\"2026-09-17T13:30:00+00:00\",\"dateModified\":\"2026-10-26T11:09:31+00:00\",\"description\":\"Meta-Anzeigen mit Python \u00fcberwachen: Lagerbestand und Preise auswerten, Anzeigen pausieren oder fortsetzen und Cron-L\u00e4ufe kontrollieren.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/lw-flux3-20261031\\\/hero-475.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/lw-flux3-20261031\\\/hero-475.png\",\"width\":1200,\"height\":630,\"caption\":\"Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python & Scripts\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/digital-marketing-de\\\/tutorials-de-digital-marketing-de\\\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python &amp; Scripts\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python &amp; Scripts | Lukas Wojcik","description":"Meta-Anzeigen mit Python \u00fcberwachen: Lagerbestand und Preise auswerten, Anzeigen pausieren oder fortsetzen und Cron-L\u00e4ufe kontrollieren.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/","og_locale":"en_US","og_type":"article","og_title":"Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python &amp; Scripts | Lukas Wojcik","og_description":"Meta-Anzeigen mit Python \u00fcberwachen: Lagerbestand und Preise auswerten, Anzeigen pausieren oder fortsetzen und Cron-L\u00e4ufe kontrollieren.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-17T13:30:00+00:00","article_modified_time":"2026-10-26T11:09:31+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/09\/hero-475-automatisches-preis-bestands-monitor-g.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python &amp; Scripts","datePublished":"2026-09-17T13:30:00+00:00","dateModified":"2026-10-26T11:09:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/"},"wordCount":962,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/lw-flux3-20261031\/hero-475.png","keywords":["Automation","Digital Marketing","E-Commerce","Python","REST API","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/","name":"Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python &amp; Scripts | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/lw-flux3-20261031\/hero-475.png","datePublished":"2026-09-17T13:30:00+00:00","dateModified":"2026-10-26T11:09:31+00:00","description":"Meta-Anzeigen mit Python \u00fcberwachen: Lagerbestand und Preise auswerten, Anzeigen pausieren oder fortsetzen und Cron-L\u00e4ufe kontrollieren.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/lw-flux3-20261031\/hero-475.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/lw-flux3-20261031\/hero-475.png","width":1200,"height":630,"caption":"Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python & Scripts"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/digital-marketing-de\/tutorials-de-digital-marketing-de\/automatisches-preis-und-bestands-monitoring-fur-meta-ads-via-python-scripts\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Automatisches Preis- und Bestands-Monitoring f\u00fcr Meta Ads via Python &amp; Scripts"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/475","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=475"}],"version-history":[{"count":8,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/475\/revisions"}],"predecessor-version":[{"id":26782,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/475\/revisions\/26782"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/28037"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=475"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}