> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Vòng lặp

> Gửi email giao dịch và quản lý giao tiếp với khách hàng thông qua Vòng lặp dựa trên các sự kiện của Dodo Payments.

## Giới thiệu

Gửi email giao dịch và tự động quản lý giao tiếp với khách hàng khi các sự kiện thanh toán xảy ra. Gửi xác nhận thanh toán, cập nhật đăng ký và thông báo quan trọng với hạ tầng email của Vòng lặp.

<Info>
  Tích hợp này yêu cầu Khóa API Loops của bạn để xác thực.
</Info>

## Bắt đầu

<Steps>
  <Step title="Open the Webhook Section">
    Trong bảng điều khiển Dodo Payments của bạn, điều hướng đến <b>Webhooks → + Thêm Endpoint</b> và mở rộng danh sách tích hợp.

    <Frame>
      <img src="https://mintcdn.com/dodopayments/slbAEdrLLwKHfaRf/images/integrations/loops.png?fit=max&auto=format&n=slbAEdrLLwKHfaRf&q=85&s=2d66cf4c1f562427613d7b2704dcc8a3" alt="Thêm Endpoint và danh sách tích hợp" style={{ maxHeight: '500px', width: 'auto' }} width="1656" height="940" data-path="images/integrations/loops.png" />
    </Frame>
  </Step>

  <Step title="Select Loops">
    Chọn thẻ tích hợp <b>Loops</b>.
  </Step>

  <Step title="Enter API Key">
    Cung cấp Khóa API Loops của bạn trong phần cấu hình.
  </Step>

  <Step title="Configure Transformation">
    Chỉnh sửa mã chuyển đổi để định dạng email cho API của Loops.
  </Step>

  <Step title="Test & Create">
    Kiểm tra bằng các payload mẫu và bấm <b>Create</b> để kích hoạt việc gửi email.
  </Step>

  <Step title="Done!">
    🎉 Các sự kiện thanh toán giờ sẽ tự động kích hoạt email giao dịch thông qua Loops.
  </Step>
</Steps>

## Ví dụ Mã Biến đổi

### Email Xác nhận Thanh toán

```javascript payment_confirmation.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType === "payment.succeeded") {
    const p = webhook.payload.data;
    webhook.url = "https://api.loops.so/v1/events/send";
    webhook.payload = {
      eventName: "payment_confirmation",
      email: p.customer.email,
      properties: {
        customer_name: p.customer.name,
        payment_id: p.payment_id,
        amount: (p.total_amount / 100).toFixed(2),
        currency: p.currency || "USD",
        payment_method: p.payment_method || "unknown",
        payment_date: new Date(webhook.payload.timestamp).toLocaleDateString()
      }
    };
  }
  return webhook;
}
```

### Email Chào mừng Đăng ký

```javascript subscription_welcome.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType === "subscription.active") {
    const s = webhook.payload.data;
    webhook.url = "https://api.loops.so/v1/events/send";
    webhook.payload = {
      eventName: "subscription_welcome",
      email: s.customer.email,
      properties: {
        customer_name: s.customer.name,
        subscription_id: s.subscription_id,
        product_id: s.product_id,
        amount: (s.recurring_pre_tax_amount / 100).toFixed(2),
        frequency: s.payment_frequency_interval,
        next_billing: s.next_billing_date
      }
    };
  }
  return webhook;
}
```

### Thông báo Thất bại Thanh toán

```javascript payment_failure.js icon="js" expandable theme={null}
function handler(webhook) {
  if (webhook.eventType === "payment.failed") {
    const p = webhook.payload.data;
    webhook.url = "https://api.loops.so/v1/events/send";
    webhook.payload = {
      eventName: "payment_failed",
      email: p.customer.email,
      properties: {
        customer_name: p.customer.name,
        payment_id: p.payment_id,
        amount: (p.total_amount / 100).toFixed(2),
        error_message: p.error_message || "Payment processing failed",
        retry_link: `https://yourdomain.com/retry-payment/${p.payment_id}`
      }
    };
  }
  return webhook;
}
```

## Mẹo

* Sử dụng tên sự kiện mô tả để tổ chức mẫu email tốt hơn
* Bao gồm các thuộc tính khách hàng liên quan để cá nhân hóa
* Thiết lập các mẫu email trong bảng điều khiển Loops cho mỗi sự kiện
* Sử dụng tên thuộc tính nhất quán giữa các sự kiện
* Kiểm tra việc gửi email trước khi đưa vào hoạt động

## Khắc phục sự cố

<AccordionGroup>
  <Accordion title="Emails not being sent">
    * Xác minh Khóa API đúng và đang hoạt động
    * Kiểm tra tên sự kiện khớp với mẫu Loops của bạn
    * Đảm bảo địa chỉ email người nhận hợp lệ
    * Xem lại giới hạn và hạn mức gửi của Loops
  </Accordion>

  <Accordion title="Transformation errors">
    * Xác thực cấu trúc JSON khớp với định dạng API của Loops
    * Kiểm tra tất cả các trường bắt buộc đều có mặt
    * Đảm bảo tên sự kiện được định dạng đúng
    * Xác minh quyền của khóa API
  </Accordion>
</AccordionGroup>
