Ich zeige dir, wie ich in wenigen Schritten ein Stripe‑Abo mit Make (ehemals Integromat) und Google Sheets automatisiere und gleichzeitig eine robuste Retry‑Logik für fehlgeschlagene Zahlungen einbaue. Das Setup ist praktisch, wenn du wiederkehrende Zahlungen verfolgst, Kund:innen bei fehlgeschlagenen Zahlungen automatisch Erinnerungen schicken willst oder Retry‑Versuche orchestrieren möchtest — ohne ein kompliziertes Backend.

Warum ich Make + Google Sheets benutze

Ich mag Make, weil es schnell geht, viele Konnektoren hat und visuelle Szenen erlaubt, die ich leicht anpassen kann. Google Sheets dient bei mir oft als leichtgewichtige Datenbank und Audit‑Trail: jede Änderung lässt sich nachvollziehen, man kann Filter, Pivot‑Tabellen oder Google‑Formeln hinzufügen. Für kleine bis mittlere Abonnentenstämme ist das eine pragmatische Kombination.

Überblick: Was das Szenario abdeckt

  • Neues Abonnement/Invoice in Stripe erkennt Make via Webhook
  • Daten werden in Google Sheets eingetragen oder aktualisiert
  • Fehlgeschlagene Zahlung → Einträge markieren und Retry‑Workflow starten
  • Retry‑Logik mit zeitverzögerten Versuchen (Backoff), E‑Mails und Eskalation
  • Wichtig ist, dass Zahlungen in Stripe transient sein können (z. B. 3‑D Secure), deshalb verwende ich PaymentIntent/Invoice‑Status als Trigger und nicht allein Webhook‑Events ohne Prüfung.

    Benötigte Ressourcen

  • Stripe Account mit API‑Keys
  • Make Account
  • Google Account / Google Sheets
  • Optional: Mail‑Provider (SMTP, SendGrid, Mailgun) oder Make's E‑Mail Modul
  • Schritt 1 — Webhook in Stripe einrichten

    Ich erstelle in Stripe einen Webhook, der folgende Events an Make schickt:

  • invoice.payment_succeeded
  • invoice.payment_failed
  • payment_intent.payment_failed (für manuelle Retries / SCA)
  • Im Webhook‑Payload prüfe ich in Make den object und status, z. B. invoice.status == "open" oder "paid" bzw. "payment_intent.status". So vermeide ich Doppeltrigger.

    Schritt 2 — In Make: Szenario aufsetzen

    Mein Szenario besteht grob aus diesen Modulen:

  • Webhook (Custom Webhook) — empfängt Stripe
  • Router — teilt Erfolg vs. Fehler
  • Google Sheets — Search row / Update row / Add row
  • Delay / Scheduler — für geplante Retries
  • Mail Modul — Benachrichtigung an Kund:in
  • Iterator / Aggregator — falls mehrere Items im Payload
  • Wichtige Tipps beim Erstellen:

  • Verwende Search Row in Google Sheets anhand der Stripe Customer ID oder Invoice ID, damit du idempotent arbeiten kannst.
  • Setze bei jeder Aktion eine Kommentar‑Spalte oder ein Log (z. B. "retry_count", "last_attempt", "next_attempt") in deinem Sheet.
  • Schritt 3 — Google Sheet Struktur (Empfehlung)

    SpalteBeschreibung
    customer_idStripe Customer ID
    invoice_idStripe Invoice ID
    statuspaid / failed / pending
    retry_countAnzahl der bisherigen Retry‑Versuche
    last_attemptTimestamp letzter Versuch
    next_attemptGeplanter Timestamp für nächsten Retry
    email_sentFlag: Benachrichtigung gesendet
    notesFreitext für Logs

    Schritt 4 — Retry‑Logik: Prinzipien

    Meine Retry‑Logik basiert auf drei Prinzipien:

  • Idempotenz: Jede Stripe‑Aktion wird anhand von invoice_id oder payment_intent überprüft, bevor eine neue Aktion erfolgt.
  • Exponential Backoff: Ich vermeide aggressive Polling. Mein Standard ist: 1. Versuch sofort, 2. Versuch nach 6 Stunden, 3. Versuch nach 24 Stunden, 4. Versuch nach 3 Tagen — dann Eskalation.
  • Transparenz: Jede Änderung wird ins Google Sheet geschrieben, damit Support oder du jederzeit den Status sehen.
  • Retry‑Zeitplan (Beispiel)

    VersuchWartezeit seit Fehler
    1Sofort (erste Erkennung)
    26 Stunden
    324 Stunden
    472 Stunden
    5Eskalation an Support / Kündigungsprozess

    Schritt 5 — Umsetzung des Retries in Make

    So setze ich das in Make um:

  • Wenn invoice.payment_failed reinkommt: Search Row nach invoice_id; falls keine Zeile: Add row mit retry_count = 0.
  • Update die Row: status = failed, last_attempt = now, retry_count = retry_count + 1.
  • Berechne next_attempt basierend auf retry_count. Beispiel in Make: Setze ein Datumfeld mit AddHours/AddDays.
  • Füge ein Modul "Schedule" oder "Delay" hinzu: plane ein Sub‑Szenario oder sende ein weiteres Webhook/Make‑Event zum Zeitpunkt next_attempt.
  • Beim Auslösen des Retry: rufe Stripe's PaymentIntent confirm oder Invoice pay via API auf. Prüfe die Antwort: bei Erfolg markiere paid; bei erneutem Fehler erhöhe retry_count und berechne neues next_attempt.
  • Wenn du kein Server‑Side PHP/Node laufen hast, kannst du in Make den Stripe‑Konnektor nutzen — er unterstützt viele API Calls wie "Retrieve Invoice", "Pay Invoice", "Retrieve Payment Intent".

    Fehlerbehandlung und Best Practices

  • Verwende idempotency keys bei API‑Calls, wenn du mehrere ähnliche Anfragen schicken könntest.
  • Prüfe die failure_code und failure_message von Stripe. Manche Fehler (z. B. card_declined) benötigen Kundenkontakt, andere sind temporär.
  • Für SCA‑Schritte (3‑D Secure) leite die Kund:innen an Stripe Checkout oder sende einen Link, statt automatisch zu retryen.
  • Logge jede Aktion in Google Sheets: wer, wann, warum. So vermeidest du Verwirrung beim Support.
  • E‑Mails und Eskalation

    Meine Betreffzeilen sind klar: "Deine Zahlung bei [Produkt] ist fehlgeschlagen". Inhalte:

  • Kurze Erklärung, was passiert ist
  • Konkrete Handlungsoptionen: Zahlungsmethode aktualisieren (Link zu Stripe Customer Portal), Karte erneut belasten (falls du das möchtest), Kontakt zum Support
  • Hinweis auf nächste Schritte (z. B. "Wir versuchen es erneut in 6 Stunden")
  • Im Make‑Szenario verschicke ich automatisierte E‑Mails nach dem 1. und 3. fehlgeschlagenen Versuch. Nach dem letzten Versuch setze ich eine Eskalation — Ticket im Support‑Tool oder manuelle Prüfung.

    Edge Cases, die ich gelernt habe

  • Zahlungsanbieter‑Timeouts: Wiederhole API‑Calls mit begrenzter Anzahl (3 Versuche) und Backoff.
  • Doppelte Webhook‑Events: Stripe kann Events mehrfach senden. Deshalb: Search Row + Prüfung auf last_attempt Timestamp, bevor du erneut handelst.
  • Abonnements, die komplett storniert werden: Wenn invoice.subscription.status == 'canceled', update dein Sheet und stoppe Retries.
  • Monitoring & Reporting

    Ich überwache auf zwei Wegen:

  • Dashboards in Google Sheets (Filter für failed und sortiert nach next_attempt)
  • Ein tägliches Make‑Szenario, das alle Rows mit next_attempt <= now abfragt und eine Zusammenfassung an mein Team sendet
  • So erkenne ich schnell, ob Retry‑Raten ansteigen — ein Indikator für größere Probleme (z. B. PSP‑Ausfall, massenhaft abgelaufene Karten).

    Feineinstellungen und Skalierung

    Für größere Volumina würde ich die Logik aus Sheets in eine kleine Datenbank (Postgres / Firebase) und ein kleines Backend auslagern. Make bleibt ideal für Orchestrierung und Benachrichtigung, aber bei Zehntausenden von Retries wird es teuer und langsam. Bis dahin ist das beschriebene Setup jedoch sehr wartbar und transparent.

    Wenn du möchtest, kann ich dir gern eine Make‑Szenario‑Exportdatei vorbereiten oder ein Beispiel‑Google‑Sheet als Template bereitstellen — sag mir, welche Retry‑Regeln du bevorzugst und ob du Mailings selbst hostest oder einen Provider nutzt.