Gửi email và giao dịch qua Adapty Mail API

Adapty Mail API cho phép bạn gửi hồ sơ người dùng và giao dịch đến Adapty Mail trực tiếp từ máy chủ, không cần chuyển dữ liệu qua Adapty SDK. Sử dụng API này khi bạn muốn:

  • Thêm người đăng ký khi bạn chưa có danh sách trong Adapty Mail.
  • Tái sử dụng danh sách người đăng ký từ các ứng dụng khác của bạn.
  • Cung cấp dữ liệu cho Adapty Mail theo phương thức server-to-server, với backend của bạn là nguồn dữ liệu chính.
Note

API hay SDK? Hầu hết các ứng dụng gửi dữ liệu đến Adapty Mail thông qua SDK, vốn tự động thu thập email và thông tin mua hàng — xem Kết nối Adapty với Adapty Mail. Chọn API khi ứng dụng của bạn không có SDK, khi dữ liệu đã có sẵn trên server, hoặc khi bạn import người dùng từ nguồn khác. Bạn cũng có thể dùng API song song với một điểm nhập khác: Adapty Mail khớp dữ liệu đến theo customer_user_id và địa chỉ email, chỉ lưu một hồ sơ người dùng cho mỗi người.

Trước khi bắt đầu

Warning

Hoàn tất thiết lập Adapty Mail trước khi gửi dữ liệu — bao gồm tạo chiến dịch, phân khúc (nếu cần), web paywall và khởi chạy flow. Adapty Mail chỉ gửi email đến các hồ sơ người dùng được tạo sau khi hoàn tất thiết lập; các hồ sơ gửi trước đó sẽ không nhận được email nào. Hãy làm theo hướng dẫn Bắt đầu với Adapty Mail trước, rồi quay lại đây.

Bạn cũng cần API key và base URL:

  • Secret API key: Trong Adapty Mail, vào Settings > Project và sao chép Secret key. Key này gắn với từng project, giúp API xác định dữ liệu thuộc về project nào.
  • Base URL: Tất cả các request đều gửi đến https://api-mail.adapty.io.
  • Authentication: Gửi key trong header Authorization theo dạng Bearer {your_secret_api_key}.
Important

Hãy lấy sự đồng ý rõ ràng từ người dùng trước khi thu thập email và gửi chúng đến Adapty Mail. Bạn chịu trách nhiệm tuân thủ GDPR, CAN-SPAM và các quy định tương tự tại các thị trường bạn hoạt động.

Gửi hồ sơ người dùng

Một hồ sơ chứa email và các thuộc tính của người dùng. Để tạo hoặc cập nhật hồ sơ, gửi request POST đến /api/v1/profile/save/.

Ba trường bắt buộc:

  • external_profile_id ổn định do ứng dụng hoặc backend của bạn quản lý
  • email mà Adapty Mail dùng để gửi chiến dịch
  • external_created_at — thời điểm tạo người dùng, có thể dùng trong phân khúc
Important

Luôn gửi external_profile_id ổn định, không dùng giá trị ẩn danh hoặc thay đổi theo từng lần cài đặt. Adapty Mail dùng giá trị này để liên kết email, lượt nhấp và giao dịch mua vào một hồ sơ duy nhất.

Nếu cùng một người dùng cũng tiếp cận Adapty Mail thông qua Adapty SDK, hãy thêm customer_user_id — đây là ID người dùng của bạn, tức là ID bạn truyền vào Adapty.identify(). Adapty Mail sẽ khớp theo ID này và giữ cả hai nguồn trong cùng một hồ sơ người dùng, thay vì tạo ra một bản sao trùng lặp khiến người dùng nhận được email hai lần.

curl --request POST \
  --url 'https://api-mail.adapty.io/api/v1/profile/save/' \
  --header 'Authorization: Bearer {your_secret_api_key}' \
  --header 'Content-Type: application/json' \
  --data '{
    "external_profile_id": "user_12345",
    "external_created_at": "2026-06-01T10:30:00Z",
    "email": "jane@example.com",
    "country": "US",
    "custom_attributes": {
      "plan": "trial"
    }
  }'
Note

countrystore_country nhận mã hai chữ cái theo chuẩn ISO 3166-1 alpha-2US, không phải USA hay United States. Mọi giá trị khác đều bị từ chối.

Xem tài liệu tham khảo Save profile để biết tất cả các trường có sẵn.

Gửi sự kiện giao dịch

Note

Một hồ sơ có email là đủ để tiếp cận người dùng trong flow chưa từng mua hàng. Người dùng trong mọi flow khác cũng cần có sự kiện giao dịch.

Mọi flow ngoại trừ flow chưa từng mua hàng đều dựa vào lịch sử mua hàng. Gửi sự kiện giao dịch của hồ sơ khi xử lý các giao dịch mua, gia hạn và hủy, để Adapty Mail có thể đưa hồ sơ vào đúng flow. Sự kiện giao dịch cũng hỗ trợ attribution doanh thu. Bỏ qua bước này chỉ khi bạn chỉ chạy chiến dịch chưa từng mua hàng mà thôi.

Để ghi lại một giao dịch, gửi request POST đến /api/v1/profile/transaction-event/save/. Dùng cùng external_profile_id đã gửi với hồ sơ để Adapty Mail liên kết giao dịch với đúng người dùng.

curl --request POST \
  --url 'https://api-mail.adapty.io/api/v1/profile/transaction-event/save/' \
  --header 'Authorization: Bearer {your_secret_api_key}' \
  --header 'Content-Type: application/json' \
  --data '{
    "event_type": "subscription_started",
    "event_id": "evt_abc123",
    "event_datetime": "2026-06-10T14:20:05Z",
    "external_profile_id": "user_12345",
    "store": "app_store",
    "store_product_id": "premium_monthly",
    "store_transaction_id": "1000000123456789",
    "store_original_transaction_id": "1000000123456789",
    "purchased_at": "2026-06-10T14:20:00Z",
    "originally_purchased_at": "2026-06-10T14:20:00Z",
    "price_usd": "9.99"
  }'

Xem tài liệu tham khảo sự kiện lưu transaction để biết tất cả các trường có sẵn.

Bạn có thể gửi một transaction trước khi hồ sơ người dùng tồn tại. Adapty Mail sẽ giữ sự kiện ở trạng thái chưa liên kết, sau đó liên kết nó với hồ sơ người dùng trong lần lưu tiếp theo có cùng external_profile_id.

Xóa hồ sơ người dùng

Để thực hiện yêu cầu xóa dữ liệu, hãy gửi các định danh của hồ sơ người dùng đến /api/v1/profile/delete/. Adapty Mail sẽ xóa dữ liệu cá nhân của hồ sơ và hủy các email đã lên lịch.

curl --request POST \
  --url 'https://api-mail.adapty.io/api/v1/profile/delete/' \
  --header 'Authorization: Bearer {your_secret_api_key}' \
  --header 'Content-Type: application/json' \
  --data '{
    "external_profile_id": "user_12345"
  }'

Xác định hồ sơ người dùng bằng external_profile_id, customer_user_id, hoặc email — cần gửi ít nhất một trong số này. Việc xóa là vĩnh viễn: một yêu cầu lưu sau đó mang cùng các định danh sẽ không tạo lại hồ sơ người dùng.

Để thực hiện thử lại an toàn, hãy xác định hồ sơ người dùng bằng external_profile_id hoặc customer_user_id. Lặp lại thao tác xóa chỉ dùng email sẽ trả về 404, vì việc xóa đã xóa sạch địa chỉ đã lưu. Xem tài liệu tham khảo Xóa hồ sơ người dùng để biết thêm chi tiết.

Ánh xạ sự kiện vào flow

Gửi event_type tương ứng với những gì đã xảy ra. Adapty Mail suy ra trạng thái của hồ sơ từ lịch sử sự kiện và chuyển hồ sơ vào flow phù hợp.

event_typeGửi khiFlow
subscription_startedNgười dùng bắt đầu gói đăng ký mới.Đang hoạt động — không có flow tái tương tác
subscription_renewedGói đăng ký tự động gia hạn.Đang hoạt động — không có flow tái tương tác
subscription_renewal_reactivatedNgười dùng bật lại tự động gia hạn.Đang hoạt động — không có flow tái tương tác
non_subscription_purchaseNgười dùng thực hiện sản phẩm mua một lần.Đang hoạt động — không có flow tái tương tác
subscription_renewal_cancelledNgười dùng tắt tự động gia hạn (vẫn còn hiệu lực đến khi hết hạn).Đã hủy gia hạn
billing_issue_detectedThanh toán gia hạn thất bại.Vấn đề thanh toán
entered_grace_periodThanh toán thất bại nhưng người dùng vẫn đang trong thời gian ân hạn.Vấn đề thanh toán
subscription_expiredGói đăng ký hết hạn và quyền truy cập bị ngừng.Đã hết hạn
subscription_refundedGiao dịch mua gói đăng ký được hoàn tiền.Đã hoàn tiền
non_subscription_purchase_refundedSản phẩm mua một lần được hoàn tiền.Đã hoàn tiền