Zum Hauptinhalt springen

Einführung

Die Dodo Payments Slack-Integration ermöglicht es Ihnen, Echtzeitbenachrichtigungen über Ihre Zahlungen direkt in Ihrem Slack-Arbeitsbereich zu erhalten. Diese Integration ermöglicht es Ihnen, den Status Ihrer Zahlungen zu verfolgen, Transaktionen zu überwachen und Ihre Zahlungen effizienter zu verwalten.
Diese Integration nutzt unser Webhook-Management-Portal, um Dodo Payments Webhook-Ereignisse automatisch in Slack-kompatible Nachrichten umzuwandeln. Es sind keine zusätzlichen Programmierungen erforderlich - konfigurieren Sie einfach den Connector und beginnen Sie, Benachrichtigungen zu erhalten.

Erste Schritte

1

Webhook-Bereich öffnen

Gehen Sie zum Webhook-Bereich in Ihrem Dodo Payments-Dashboard. Klicken Sie auf die Schaltfläche + Endpunkt hinzufügen, und öffnen Sie das Dropdown-Menü für Webhooks, um andere Integrationen anzuzeigen.
Dodo Payments-Dashboard zeigt die Schaltfläche Endpunkt hinzufügen und das Dropdown-Menü für Integrationen
2

Slack-Integration auswählen

Wählen Sie die Slack-Integration aus und klicken Sie auf Verbinden Sie Ihren Slack-Arbeitsbereich.
Slack-Integrationskarte und Verbindungsschaltfläche
3

Slack-Berechtigungen gewähren

Gewähren Sie der Incoming Webhooks Slack-App die erforderlichen Berechtigungen, damit sie Nachrichten in Ihrem gewählten Kanal posten kann.
Slack OAuth-Berechtigungsbildschirm für die Incoming Webhooks-App
4

Transformationscode anpassen

Fügen Sie den Transformationscode hinzu oder bearbeiten Sie ihn, um Ihre Slack-Benachrichtigungen an Ihren Anwendungsfall anzupassen. Sie können die vorgefertigten Vorlagen verwenden oder Ihre eigene Logik schreiben.
Transformationscode-Editor für die Slack-Integration
5

Testen und Erstellen

Testen Sie Ihren Transformationscode mit benutzerdefinierten oder vorgefertigten Ereignis-Payloads. Sobald Sie zufrieden sind, klicken Sie auf Erstellen, um die Integration zu aktivieren.
Testen der Transformation und Erstellen-Schaltfläche
6

Integration abgeschlossen!

🎉 Sie haben erfolgreich die Slack-Integration erstellt! Ihre Dodo Payments-Ereignisse werden nun in Echtzeit an Ihren ausgewählten Slack-Kanal geliefert.

Transformationscode-Beispiele

Grundlegende Zahlungsbenachrichtigungen

Diese Transformation sendet einfache Textnachrichten für Zahlungsereignisse:
payment_notifs.js
function handler(webhook) {
  switch (webhook.eventType) {
    case "payment.succeeded":
      webhook.payload = {
        text: `✅ Payment Successful\nAmount: $${(webhook.payload.data.total_amount / 100).toFixed(2)}\nCustomer: ${webhook.payload.data.customer.email}\nPayment ID: ${webhook.payload.data.payment_id}`
      };
      break;
      
    case "payment.failed":
      webhook.payload = {
        text: `❌ Payment Failed\nAmount: $${(webhook.payload.data.total_amount / 100).toFixed(2)}\nCustomer: ${webhook.payload.data.customer.email}\nReason: ${webhook.payload.data.error_message || 'Unknown'}`
      };
      break;
      
    case "payment.processing":
      webhook.payload = {
        text: `⏳ Payment Processing\nAmount: $${(webhook.payload.data.total_amount / 100).toFixed(2)}\nCustomer: ${webhook.payload.data.customer.email}`
      };
      break;
  }

  return webhook;
}

Umfangreiche Abonnementbenachrichtigungen

Diese Transformation erstellt umfangreiche Slack-Nachrichten mit Anhängen für Abonnementereignisse:
subscription_notifs.js
function handler(webhook) {
  switch (webhook.eventType) {
    case "subscription.active":
      webhook.payload = {
        attachments: [{
          color: "good",
          title: "🎉 Subscription Activated",
          fields: [
            {
              title: "Customer",
              value: webhook.payload.data.customer.email,
              short: true
            },
            {
              title: "Product ID",
              value: webhook.payload.data.product_id,
              short: true
            },
            {
              title: "Amount",
              value: `$${(webhook.payload.data.recurring_pre_tax_amount / 100).toFixed(2)}/${webhook.payload.data.payment_frequency_interval}`,
              short: true
            },
            {
              title: "Next Billing",
              value: new Date(webhook.payload.data.next_billing_date).toLocaleDateString(),
              short: true
            }
          ],
          footer: "Dodo Payments",
          ts: Math.floor(new Date(webhook.payload.timestamp).getTime() / 1000)
        }]
      };
      break;
      
    case "subscription.cancelled":
      webhook.payload = {
        attachments: [{
          color: "warning",
          title: "⚠️ Subscription Cancelled",
          fields: [
            {
              title: "Customer",
              value: webhook.payload.data.customer.email,
              short: true
            },
            {
              title: "Product ID",
              value: webhook.payload.data.product_id,
              short: true
            },
            {
              title: "Cancellation Date",
              value: new Date(webhook.payload.data.cancelled_at).toLocaleDateString(),
              short: true
            },
            {
              title: "Cancel at Next Billing",
              value: webhook.payload.data.cancel_at_next_billing_date ? "Yes" : "No",
              short: true
            }
          ],
          footer: "Dodo Payments",
          ts: Math.floor(new Date(webhook.payload.timestamp).getTime() / 1000)
        }]
      };
      break;
      
    case "subscription.renewed":
      webhook.payload = {
        attachments: [{
          color: "good",
          title: "🔄 Subscription Renewed",
          fields: [
            {
              title: "Customer",
              value: webhook.payload.data.customer.email,
              short: true
            },
            {
              title: "Product ID",
              value: webhook.payload.data.product_id,
              short: true
            },
            {
              title: "Amount",
              value: `$${(webhook.payload.data.recurring_pre_tax_amount / 100).toFixed(2)}`,
              short: true
            },
            {
              title: "Next Billing",
              value: new Date(webhook.payload.data.next_billing_date).toLocaleDateString(),
              short: true
            }
          ],
          footer: "Dodo Payments",
          ts: Math.floor(new Date(webhook.payload.timestamp).getTime() / 1000)
        }]
      };
      break;
  }

  return webhook;
}

Streitbeilegungsbenachrichtigungen

Diese Transformation behandelt Streitereignisse mit entsprechenden Farben und Dringlichkeit:
dispute_notifs.js
function handler(webhook) {
  switch (webhook.eventType) {
    case "dispute.opened":
      webhook.payload = {
        attachments: [{
          color: "danger",
          title: "🚨 New Dispute Opened",
          fields: [
            {
              title: "Payment ID",
              value: webhook.payload.data.payment_id,
              short: true
            },
            {
              title: "Amount",
              value: `$${(webhook.payload.data.amount / 100).toFixed(2)}`,
              short: true
            },
            {
              title: "Status",
              value: webhook.payload.data.dispute_status,
              short: true
            },
            {
              title: "Stage",
              value: webhook.payload.data.dispute_stage,
              short: true
            },
            {
              title: "Remarks",
              value: webhook.payload.data.remarks || "No remarks",
              short: false
            }
          ],
          footer: "Dodo Payments - Action Required",
          ts: Math.floor(new Date(webhook.payload.timestamp).getTime() / 1000)
        }]
      };
      break;
      
    case "dispute.won":
      webhook.payload = {
        attachments: [{
          color: "good",
          title: "✅ Dispute Won",
          fields: [
            {
              title: "Payment ID",
              value: webhook.payload.data.payment_id,
              short: true
            },
            {
              title: "Amount",
              value: `$${(webhook.payload.data.amount / 100).toFixed(2)}`,
              short: true
            },
            {
              title: "Status",
              value: webhook.payload.data.dispute_status,
              short: true
            },
            {
              title: "Resolution",
              value: "Dispute resolved in your favor",
              short: false
            }
          ],
          footer: "Dodo Payments",
          ts: Math.floor(new Date(webhook.payload.timestamp).getTime() / 1000)
        }]
      };
      break;
      
    case "dispute.lost":
      webhook.payload = {
        attachments: [{
          color: "danger",
          title: "❌ Dispute Lost",
          fields: [
            {
              title: "Payment ID",
              value: webhook.payload.data.payment_id,
              short: true
            },
            {
              title: "Amount",
              value: `$${(webhook.payload.data.amount / 100).toFixed(2)}`,
              short: true
            },
            {
              title: "Status",
              value: webhook.payload.data.dispute_status,
              short: true
            },
            {
              title: "Impact",
              value: "Funds will be debited from your account",
              short: false
            }
          ],
          footer: "Dodo Payments - Review Required",
          ts: Math.floor(new Date(webhook.payload.timestamp).getTime() / 1000)
        }]
      };
      break;
  }

  return webhook;
}

Umfassender Handler für alle Ereignisse

Diese Transformation behandelt alle Ereignistypen mit konsistenter Formatierung:
all_events_notifs.js
function handler(webhook) {
  const event = webhook.payload.data;
  const timestamp = new Date(webhook.payload.timestamp).toLocaleString();
  
  let color, emoji, title, fields = [];
  
  switch (webhook.eventType) {
    case "payment.succeeded":
      color = "good";
      emoji = "✅";
      title = "Payment Successful";
      fields = [
        { title: "Amount", value: `$${(event.total_amount / 100).toFixed(2)}`, short: true },
        { title: "Customer", value: event.customer.email, short: true },
        { title: "Payment ID", value: event.payment_id, short: true },
        { title: "Method", value: event.payment_method || "Unknown", short: true }
      ];
      break;
      
    case "payment.failed":
      color = "danger";
      emoji = "❌";
      title = "Payment Failed";
      fields = [
        { title: "Amount", value: `$${(event.total_amount / 100).toFixed(2)}`, short: true },
        { title: "Customer", value: event.customer.email, short: true },
        { title: "Reason", value: event.error_message || "Unknown", short: false }
      ];
      break;
      
    case "subscription.active":
      color = "good";
      emoji = "🎉";
      title = "Subscription Activated";
      fields = [
        { title: "Customer", value: event.customer.email, short: true },
        { title: "Product ID", value: event.product_id, short: true },
        { title: "Amount", value: `$${(event.recurring_pre_tax_amount / 100).toFixed(2)}/${event.payment_frequency_interval}`, short: true },
        { title: "Next Billing", value: new Date(event.next_billing_date).toLocaleDateString(), short: true }
      ];
      break;
      
    case "subscription.cancelled":
      color = "warning";
      emoji = "⚠️";
      title = "Subscription Cancelled";
      fields = [
        { title: "Customer", value: event.customer.email, short: true },
        { title: "Product ID", value: event.product_id, short: true },
        { title: "Cancellation Date", value: new Date(event.cancelled_at).toLocaleDateString(), short: true },
        { title: "Cancel at Next Billing", value: event.cancel_at_next_billing_date ? "Yes" : "No", short: true }
      ];
      break;
      
    case "refund.succeeded":
      color = "good";
      emoji = "💰";
      title = "Refund Processed";
      fields = [
        { title: "Amount", value: `$${(event.amount / 100).toFixed(2)}`, short: true },
        { title: "Refund ID", value: event.refund_id, short: true },
        { title: "Payment ID", value: event.payment_id, short: true },
        { title: "Reason", value: event.reason || "Not specified", short: true }
      ];
      break;
      
    case "dispute.opened":
      color = "danger";
      emoji = "🚨";
      title = "New Dispute Opened";
      fields = [
        { title: "Payment ID", value: event.payment_id, short: true },
        { title: "Amount", value: `$${(event.amount / 100).toFixed(2)}`, short: true },
        { title: "Status", value: event.dispute_status, short: true },
        { title: "Stage", value: event.dispute_stage, short: true },
        { title: "Remarks", value: event.remarks || "No remarks", short: false }
      ];
      break;
      
    case "license_key.created":
      color = "good";
      emoji = "🔑";
      title = "License Key Created";
      fields = [
        { title: "License ID", value: event.id, short: true },
        { title: "Product ID", value: event.product_id, short: true },
        { title: "License Key", value: event.key.substring(0, 8) + "...", short: true },
        { title: "Expires", value: event.expires_at ? new Date(event.expires_at).toLocaleDateString() : "Never", short: true }
      ];
      break;
      
    default:
      // Handle any other events with a generic format
      color = "warning";
      emoji = "ℹ️";
      title = webhook.eventType.replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase());
      fields = [
        { title: "Event Type", value: webhook.eventType, short: true },
        { title: "Timestamp", value: timestamp, short: true }
      ];
  }
  
  webhook.payload = {
    attachments: [{
      color: color,
      title: `${emoji} ${title}`,
      fields: fields,
      footer: "Dodo Payments",
      ts: Math.floor(new Date(webhook.payload.timestamp).getTime() / 1000)
    }]
  };

  return webhook;
}

Best Practices

Um Ihre Slack-Benachrichtigungen effektiv zu gestalten:
  • Verwenden Sie umfangreiche Nachrichtenanhänge mit Farben, Feldern und Formatierungen für Klarheit und Handlungsfähigkeit.
  • Fügen Sie immer wichtige Daten wie Beträge, Kunden-E-Mails und IDs zur schnellen Identifizierung hinzu.
  • Wählen Sie Farben, die dem Ereignistyp entsprechen: grün (good) für Erfolg, rot (danger) für Streitigkeiten oder Fehler, gelb (warning) für Stornierungen und blau (#36a64f) für Informationsereignisse.
  • Fügen Sie Zeitstempel hinzu, um nachzuvollziehen, wann jedes Ereignis aufgetreten ist.
Umgang mit sensiblen Daten: Seien Sie vorsichtig, keine sensiblen Informationen wie vollständige Lizenzschlüssel oder persönliche Daten in Slack-Nachrichten einzuschließen. Ziehen Sie in Betracht, sensible Werte zu kürzen oder zu maskieren.

Fehlersuche

  • Überprüfen Sie, ob die Slack-Webhook-URL korrekt und aktiv ist
  • Stellen Sie sicher, dass der Transformationscode gültiges JavaScript ist
  • Stellen Sie sicher, dass die ausgewählten Ereignistypen ausgelöst werden
  • Überprüfen Sie, ob Ihre Slack-App die erforderlichen Berechtigungen hat
  • Überprüfen Sie das Webhook-Management-Portal auf Transformationsfehlerprotokolle
  • Stellen Sie sicher, dass die Struktur der Webhook-Payload mit Ihrem Transformationscode übereinstimmt
  • Testen Sie Ihren Transformationscode mit Beispieldaten
  • Stellen Sie sicher, dass alle erforderlichen Felder in der Webhook-Payload vorhanden sind
  • Bestätigen Sie, dass die Ereignisse, die Sie empfangen möchten, in Ihrer Dodo Payments Webhook-Konfiguration aktiviert sind
  • Überprüfen Sie, ob die Ereignistypen in Ihrer Slack-Connector-Konfiguration ausgewählt sind
  • Stellen Sie sicher, dass Ihr Endpunkt ordnungsgemäß konfiguriert ist, um die Ereignisse zu empfangen