Jak odstranit chybnou konverzi z Google Ads: návod, který v roce 2026 opravdu funguje

    Interní objednávka za 9 milionů v konverzích a Smart Bidding, který se z ní učí. Jak ji stáhnout přes API, když tlačítko v rozhraní zmizelo.

    Google Adskonverzeměření
    Grafický cover článku o odstranění chybné konverze z Google Ads s pixelovým motivem v oranžových a hnědých tónech

    Minulý týden mi v účtu jednoho e-shopu vyskočila konverze za 9 156 307 Kč. Jeden den, jedna objednávka. Klient si mezi svými e-shopy vyrovnával sklady, a protože tu interní objednávku zaplatil přes běžnou pokladnu v prohlížeči, kde měl v cookies proklik z reklamy, Google Ads si ji připsal jako svou zásluhu.

    Výsledek: PNO kampaní spadlo na 0,58 %, cílové ROAS se začalo učit z nesmyslu a všechny reporty za srpen byly k ničemu.

    Hodnota konverzí v Google Ads: jeden den s interní objednávkou za 9,15 milionu

    Takhle to vypadá v přehledu: jedna interní objednávka z 20. 8. za 9,16 mil. Kč. Běžné dny se vedle ní na grafu ani nezvednou od nuly. Celkovou hodnotu konverzí za období jsem zakryl, je to číslo klienta a na pointě nic nemění. Z toho jednoho sloupce se každý den učí Smart Bidding.

    Takovou konverzi je potřeba dostat z účtu pryč, a rychle. Jenže tady začíná problém, kvůli kterému píšu tenhle článek: postup, který najdete ve většině návodů i v nápovědě Googlu, už nefunguje. Tohle je zápis z jednoho reálného případu. Co všechno jsem zkusil, proč to nešlo a přesný postup, který nakonec zafungoval, abyste ty slepé uličky nemuseli procházet po mně.

    Proč je to vůbec průšvih

    Chybná konverze nerozbíjí jen report. Kampaně s cílovým ROAS nebo cílovou CPA se z hodnot konverzí učí, a jedna devítimilionová položka jim řekne, že se jim mimořádně daří. Bidding začne agresivněji nakupovat návštěvnost, kterou by jinak nekoupil, a dělá to každý den, dokud je chybná hodnota v datech.

    Druhá věc je důvěra. Dokud v účtu visí nesmysl, žádné číslo v něm nemá vypovídací hodnotu: PNO, ROAS ani srovnání s minulým obdobím.

    Den slepých uliček: co všechno nefunguje

    Google konverze nikdy nemazal tlačítkem. Místo toho existují „úpravy konverzí" a typ úpravy retrakce (zpětné stažení), který konverzi odstraní z reportů i z dat pro chytré nabídky. Potud dobré. Problém je, kudy tu retrakci do Googlu dostat. Tady je chronologie jednoho dne zkoušení:

    1. Nahrání souboru v rozhraní: neexistuje. Nápověda Googlu dodnes popisuje cestu Cíle → Konverze → Nahrané soubory → tlačítko plus → šablona Úpravy konverzí. V účtu ale žádné plus není, stránka ukazuje jen odkaz do Data Manageru. Google podobné změny nasazuje postupně, takže se do svého rozhraní radši podívejte, než se pustíte dál. Když tam plus máte, zbytek článku nepotřebujete.
    2. Data Manager: úpravy konverzí neumí. Prošel jsem celého průvodce připojením zdroje dat (Tabulky Google, offline konverze, mapování polí přes Gemini) a na konci zjistíte, že umí konverze jen importovat nebo obohacovat. Pole „typ úpravy" v něm prostě není. Průvodce vás nechá dojít skoro na konec, než to pochopíte.
    3. Google Ads Scripts: selžou potichu. Hromadné nahrání přes AdsApp.bulkUploads() doběhne s hláškou „Operace byla úspěšně dokončena. Dokončeno za 4 s". Vypadá to jako výhra. Jenže do účtu se nezapíše vůbec nic, druhý den je hodnota pořád v reportech a diagnostika nahrávání konverzí přes API je prázdná. Žádná chyba, žádný záznam. Tohle je nejzákeřnější slepá ulička, protože se tváří jako úspěch.
    4. Podpora Googlu: konverze nemaže. Můžou poradit, zásah do dat neudělají.

    Zbyla jediná cesta a ta zafungovala: Google Ads API. Zní to hůř, než to je. Je to jeden krátký skript a čtyři údaje.

    Co budete potřebovat

    Čas, a ten hraje proti vám. Nápověda Googlu uvádí na jednom místě, že úpravu lze nahrát do 54 dnů od kliknutí, na jiném místě 55. Přesnou hranici tedy negarantuje ani Google. Zároveň platí opačný limit: nahrávat byste měli nejdřív 24 hodin po konverzi, jinak ji Google nemusí mít ještě zaznamenanou a úprava se neprovede. A hlavně, report opravíte i za měsíc, ale co se bidding mezitím naučil, to už mu z hlavy nevytáhnete. Takže: druhý den, ne za týden.

    Order ID té konverze. Retrakce se páruje přes ID objednávky, které měřicí kód poslal do Ads společně s konverzí. U e-shopových konverzí s daty z košíku tam skoro vždycky je, ale pozor, nemusí to být číslo objednávky, které vidíte na faktuře. Víc v kroku 2.

    Přístup ke Google Ads API. Developer token (v MCC účtu zdarma, Administrátor → Centrum rozhraní API; základní přístup na vlastní účty stačí) a OAuth přihlášení. Pokud jste si někdy nastavovali export do BigQuery, skripty přes API nebo AI nástroje napojené na Ads, nejspíš už obojí máte.

    Python v počítači. Na Macu je předinstalovaný.

    Krok 1: Najděte ID konverzní akce

    V Google Ads: Cíle → Konverze → Přehled, klikněte na konverzní akci, do které chybná konverze spadla. V detailu najdete ID typu konverze, číslo jako 7573001960. Poznamenejte si ho.

    Krok 2: Najděte správné order ID

    Tady se láme chleba. Retrakce projde jen tehdy, když trefíte přesně ten řetězec, který měřicí kód odeslal, a ten se často liší od čísla objednávky v administraci.

    • Shopify (aplikace Google & YouTube): posílá se interní ID objednávky, ne její číslo. Najdete ho v adresním řádku, když objednávku otevřete v administraci: admin.shopify.com/store/…/orders/17155174596995, to dlouhé číslo na konci je ono. V mém případě jsem nejdřív zkoušel číslo objednávky z faktury a Google odpověděl „conversion can't be found". S interním ID to prošlo napoprvé.
    • Vlastní měření přes GTM nebo gtag: order ID je to, co posíláte jako transaction_id v purchase eventu. Ověříte v GA4 (Průzkumy → dimenze ID transakce) nebo v náhledu GTM. Jestli si nejste jistí, že vám tam chodí správně, patří to k nastavení konverzí v GA4.
    • Objednávka vznikla z konceptu (draft)? Počítá se ID výsledné objednávky, ne konceptu.

    Krok 3: Skript

    Vytvořte soubor retrakce.py a doplňte tři hodnoty nahoře:

    #!/usr/bin/env python3
    # Retrakce (zpetne stazeni) konverze z Google Ads
    # Pouziti: pip3 install google-ads && python3 retrakce.py "ORDER_ID"
    import sys
    from datetime import datetime
    from zoneinfo import ZoneInfo
    
    from google.ads.googleads.client import GoogleAdsClient
    from google.ads.googleads.errors import GoogleAdsException
    
    CUSTOMER_ID = "1234567890"          # ID uctu Google Ads (bez pomlcek)
    LOGIN_CUSTOMER_ID = "0987654321"    # ID MCC uctu (bez pomlcek)
    CONVERSION_ACTION_ID = "7573001960" # ID typu konverze z kroku 1
    
    def main():
        order_id = sys.argv[1].strip()
    
        # google-ads.yaml: developer_token, client_id, client_secret,
        # refresh_token — viz dokumentace klienta google-ads pro Python
        client = GoogleAdsClient.load_from_storage()
        client.login_customer_id = LOGIN_CUSTOMER_ID
    
        now = datetime.now(ZoneInfo("Europe/Prague"))
        adj_time = now.strftime("%Y-%m-%d %H:%M:%S%z")
        adj_time = adj_time[:-2] + ":" + adj_time[-2:]
    
        service = client.get_service("ConversionAdjustmentUploadService")
        adj = client.get_type("ConversionAdjustment")
        adj.conversion_action = (
            f"customers/{CUSTOMER_ID}/conversionActions/{CONVERSION_ACTION_ID}"
        )
        adj.adjustment_type = client.enums.ConversionAdjustmentTypeEnum.RETRACTION
        adj.order_id = order_id
        adj.adjustment_date_time = adj_time  # povinne i u retrakce
    
        request = client.get_type("UploadConversionAdjustmentsRequest")
        request.customer_id = CUSTOMER_ID
        request.conversion_adjustments.append(adj)
        request.partial_failure = True
    
        try:
            response = service.upload_conversion_adjustments(request=request)
        except GoogleAdsException as ex:
            for error in ex.failure.errors:
                print(f"CHYBA: {error.message}")
            sys.exit(1)
    
        pf = response.partial_failure_error
        if pf and pf.code != 0:
            print(f"NEPROSLO: {pf.message}")
            sys.exit(1)
    
        for result in response.results:
            print(f"OK — retrakce prijata pro order ID {result.order_id}")
    
    if __name__ == "__main__":
        main()
    

    Přihlašovací údaje patří do souboru google-ads.yaml v domovské složce (developer token, OAuth client ID, client secret a refresh token). Přesný postup popisuje dokumentace Python klienta Google Ads API. Pak už jen:

    pip3 install google-ads
    python3 retrakce.py "17155174596995"
    

    Krok 4: Kontrola

    • „OK — retrakce prijata" znamená, že Google konverzi našel a stáhl. V reportech se změna propíše zhruba do 24 hodin, hodnota konverzí za daný den klesne o hodnotu stažené objednávky.
    • „The conversion … can't be found" znamená špatné order ID. Vraťte se ke kroku 2 a zkuste jinou variantu: interní ID, ID s prefixem, ID výsledné objednávky místo konceptu. Neúspěšný pokus nic nerozbije, můžete jich zkusit kolik chcete.
    • Po propsání zkontrolujte cílové ROAS a rozpočty kampaní, do kterých konverze spadla. Pokud v účtu žila několik dní, bidding mohl mezitím zvednout nabídky. Chvíli ho po opravě hlídejte.

    V popsaném případě to dopadlo takhle: retrakce přijata v úterý odpoledne, druhý den ráno byla hodnota konverzí za 20. 8. zpátky na běžných jednotkách tisíc a PNO kampaní dávalo zase smysl. Od chybné konverze k čistým datům to trvalo pět dní, z toho čtyři padly na hledání cesty, kterou teď máte v tomhle článku.

    Jak se tomu příště vyhnout

    Nejlevnější retrakce je ta, kterou nemusíte dělat.

    Interní a testovací objednávky nepouštějte přes běžnou pokladnu. V Shopify označte draft objednávku jako zaplacenou ručně (Mark as paid v administraci), purchase event pak vůbec nevystřelí. Kdo měří přes GTM, může si pro interní IP vypnout spouštění purchase eventu, ale ruční platba je jistější, protože nezávisí na tom, odkud se kdo připojí.

    A jednou týdně si srovnejte hodnotu konverzí v Ads s reálnými tržbami e-shopu. Devítimilionovou anomálii uvidíte na první pohled, ale i menší duplicity a testy umí PNO tiše pokřivit. Když chcete vědět, jaké PNO váš e-shop vůbec unese a od kterého čísla se má ta kontrola odpichovat, spočítá vám ho kalkulačka PNO.


    Rozbila se vám v účtu konverze a nechcete se prokousávat API sami? Ozvěte se mi — je to půlhodina práce, když člověk ví, kudy vedou slepé uličky.

    Časté otázky

    Jde to udělat bez API, jen v rozhraní Google Ads?

    V účtech, které jsem v srpnu 2026 viděl, ne. Tlačítko pro nahrání souboru s úpravami konverzí v rozhraní chybí a Data Manager typ úpravy neumí. Google podobné změny nasazuje postupně, takže se do rozhraní nejdřív podívejte — když tam plus máte, ušetříte si práci. Když ne, zbývá API.

    Co když konverze nemá zaznamenané order ID?

    Existuje druhá varianta retrakce, přes GCLID a přesný čas konverze. Je výrazně pracnější a při špatném odhadu hrozí stažení cizí, legitimní konverze. Bez order ID je bezpečnější minimalizovat škody jinak: vyloučením dat pro chytré nabídky řeknete biddingu, ať se z daného období neučí. Z reportů ale hodnota nezmizí.

    Smaže retrakce konverzi úplně?

    Z hlavních sloupců i z dat pro chytré nabídky ano. Stažená konverze se navíc už nedá dál upravovat, takže si order ID před spuštěním dvakrát zkontrolujte. Vrátit ji zpět jde jen tak, že data nahrajete znovu s jiným časem konverze, což už je spíš záplata než oprava.

    Jak dlouho na to mám čas?

    Nápověda Googlu uvádí na jednom místě 54 dnů od kliknutí, na jiném 55. Přesnou hranici tedy negarantuje ani Google, spolehněte se radši na pravidlo čím dřív, tím líp. Report se opraví i po měsíci, ale co se chytré nabídky mezitím naučily, to už z nich nedostanete.

    Další články na téma Metriky a měření PPC.

    Související články

    Potřebujete s PPC pomoct?

    Napište mi, co řešíte. Úvodní konzultace je nezávazná a zdarma — ozvu se do 24 hodin.