Các loại sự kiện và trường dữ liệu webhook

Adapty gửi webhook để phản hồi các sự kiện gói đăng ký. Phần này định nghĩa các loại sự kiện và dữ liệu có trong mỗi webhook.

Các loại sự kiện Webhook

Bạn có thể gửi tất cả các loại sự kiện đến webhook của mình hoặc chỉ chọn một số loại nhất định. Tham khảo Event flows để tìm hiểu loại dữ liệu đầu vào cần mong đợi và cách xây dựng logic nghiệp vụ xung quanh đó. Bạn có thể tắt các loại sự kiện không cần thiết khi thiết lập tích hợp Webhook. Tại đó, bạn cũng có thể thay thế ID sự kiện mặc định của Adapty bằng ID của riêng mình nếu cần.

Tên sự kiệnMô tả
subscription_startedKích hoạt khi người dùng bắt đầu gói đăng ký trả phí không có thời gian dùng thử, tức là bị tính phí ngay lập tức.
subscription_renewedXảy ra khi gói đăng ký được gia hạn và người dùng bị tính phí. Sự kiện này bắt đầu từ lần thanh toán thứ hai, dù là gói đăng ký có hay không có dùng thử.
subscription_renewal_cancelledNgười dùng đã tắt tính năng tự động gia hạn gói đăng ký. Người dùng vẫn có thể sử dụng các tính năng cao cấp cho đến khi kết thúc chu kỳ đăng ký đã thanh toán.
subscription_renewal_reactivatedKích hoạt khi người dùng bật lại tính năng tự động gia hạn gói đăng ký.
subscription_expiredKích hoạt khi gói đăng ký hết hạn hoàn toàn sau khi bị hủy. Ví dụ: nếu người dùng hủy gói đăng ký vào ngày 12 tháng 12 nhưng vẫn còn hiệu lực đến ngày 31 tháng 12, sự kiện sẽ được ghi nhận vào ngày 31 tháng 12 khi gói đăng ký hết hạn.
subscription_pausedXảy ra khi người dùng kích hoạt tính năng tạm dừng gói đăng ký (chỉ dành cho Android).
subscription_deferredKích hoạt khi giao dịch mua gói đăng ký được hoãn lại, cho phép người dùng trì hoãn việc thanh toán trong khi vẫn duy trì quyền truy cập các tính năng cao cấp. Tính năng này có sẵn thông qua Google Play Developer API và có thể dùng cho các bản dùng thử miễn phí hoặc hỗ trợ người dùng gặp khó khăn về tài chính.
non_subscription_purchaseBất kỳ sản phẩm mua một lần nào, chẳng hạn như quyền truy cập trọn đời hoặc các sản phẩm consumable như tiền trong game.
trial_startedKích hoạt khi người dùng bắt đầu gói đăng ký dùng thử.
trial_convertedXảy ra khi thời gian dùng thử kết thúc và người dùng bị tính phí (lần mua đầu tiên). Ví dụ: nếu người dùng có thời gian dùng thử đến ngày 14 tháng 1 nhưng bị tính phí vào ngày 7 tháng 1, sự kiện sẽ được ghi nhận vào ngày 7 tháng 1.
trial_renewal_cancelledNgười dùng đã tắt tính năng tự động gia hạn trong thời gian dùng thử. Người dùng vẫn có thể sử dụng các tính năng cao cấp cho đến khi thời gian dùng thử kết thúc nhưng sẽ không bị tính phí hay chuyển sang gói đăng ký.
trial_renewal_reactivatedXảy ra khi người dùng bật lại tính năng tự động gia hạn trong thời gian dùng thử.
trial_expiredKích hoạt khi thời gian dùng thử kết thúc mà không chuyển sang gói đăng ký.
entered_grace_periodXảy ra khi một lần thanh toán thất bại và người dùng bước vào thời gian ân hạn (nếu được bật). Người dùng vẫn có thể truy cập các tính năng cao cấp trong thời gian này.
billing_issue_detectedKích hoạt khi xảy ra sự cố thanh toán trong quá trình thực hiện giao dịch (ví dụ: số dư thẻ không đủ).
subscription_refundedKích hoạt khi gói đăng ký được hoàn tiền (ví dụ: do Apple Support xử lý).
non_subscription_purchase_refundedKích hoạt khi một sản phẩm mua một lần được hoàn tiền.
access_level_updatedXảy ra khi mức độ truy cập của người dùng được cập nhật.

subscription_renewal_reactivated mang ID sản phẩm trước đó — tức là sản phẩm đang hoạt động khi người dùng hủy — ngay cả khi người dùng sau đó kích hoạt lại bằng cách mua một sản phẩm khác. Apple giữ nguyên original_transaction_id trong toàn bộ chuỗi hủy → kích hoạt lại, vì vậy sự kiện này phản ánh sản phẩm ban đầu. Sản phẩm mới sẽ xuất hiện trong sự kiện subscription_renewed tiếp theo khi việc tính phí cho sản phẩm mới bắt đầu.

Cấu trúc sự kiện Webhook

Adapty chỉ gửi những sự kiện mà bạn đã chọn trong phần Events names của trang Integrations -> Webhooks. Các sự kiện webhook được tuần tự hóa dưới dạng JSON. Phần thân của yêu cầu POST gửi đến máy chủ của bạn sẽ chứa sự kiện đã được tuần tự hóa, được đóng gói trong cấu trúc dưới đây. Tất cả các sự kiện đều có cùng cấu trúc, nhưng các trường dữ liệu sẽ khác nhau tùy theo loại sự kiện, cửa hàng và cấu hình cụ thể của bạn. Thuộc tính người dùng là các thuộc tính người dùng tùy chỉnh mà bạn đã thiết lập, vì vậy chúng chứa những gì bạn đã cấu hình. Các trường dữ liệu attribution cũng giống nhau cho tất cả các loại sự kiện, tuy nhiên danh sách các attribution sẽ phụ thuộc vào nguồn attribution bạn sử dụng trong ứng dụng di động của mình. Xem bên dưới ví dụ về một sự kiện:

{
  "profile_id": "00000000-0000-0000-0000-000000000000",
  "customer_user_id": "UserIdInYourSystem",
  "idfv": "00000000-0000-0000-0000-000000000000",
  "idfa": "00000000-0000-0000-0000-000000000000",
  "advertising_id": "00000000-0000-0000-0000-000000000000",
  "profile_install_datetime": "2000-01-31T00:00:00.000000+0000",
  "user_agent": "ExampleUserAgent/1.0 (Device; OS Version) Browser/Engine",
  "email": "[email protected]",
  "event_type": "subscription_started",
  "event_datetime": "2000-01-31T00:00:00.000000+0000",
  "event_properties": {
    "store": "play_store",
    "currency": "USD",
    "price_usd": 4.99,
    "profile_id": "00000000-0000-0000-0000-000000000000",
    "cohort_name": "All Users",
    "environment": "Production",
    "price_local": 4.99,
    "base_plan_id": "b1",
    "developer_id": "onboarding_placement",
    "ab_test_name": "onboarding_ab_test",
    "ab_test_revision": 1,
    "paywall_name": "UsedPaywall",
    "proceeds_usd": 4.2315,
    "variation_id": "00000000-0000-0000-0000-000000000000",
    "purchase_date": "2024-11-15T10:45:36.181000+0000",
    "store_country": "AR",
    "event_datetime": "2000-01-31T00:00:00.000000+0000",
    "proceeds_local": 4.2415,
    "tax_amount_usd": 0,
    "transaction_id": "0000000000000000",
    "net_revenue_usd": 4.2415,
    "profile_country": "AR",
    "paywall_revision": "1",
    "profile_event_id": "00000000-0000-0000-0000-000000000000",
    "tax_amount_local": 0,
    "net_revenue_local": 4.2415,
    "vendor_product_id": "onemonth_no_trial",
    "profile_ip_address": "10.10.1.1",
    "consecutive_payments": 1,
    "rate_after_first_year": false,
    "original_purchase_date": "2000-01-31T00:00:00.000000+0000",
    "original_transaction_id": "0000000000000000",
    "subscription_expires_at": "2000-01-31T00:00:00.000000+0000",
    "profile_has_access_level": true,
    "profile_total_revenue_usd": 4.99,
    "promotional_offer_id": null,
    "store_offer_category": null,
    "store_offer_discount_type": null
  },
  "event_api_version": 1,
  "profiles_sharing_access_level": [{"profile_id": "00000000-0000-0000-0000-000000000000", "customer_user_id": "UserIdInYourSystem"}],
   "attributions": {
    "appsflyer": {
      "ad_set": "Keywords 1.12",
      "status": "non_organic",
      "channel": "Google Ads",
      "ad_group": null,
      "campaign": "Social media influencers - Rest of the world",
      "creative": null,
      "created_at": "2000-01-31T00:00:00.000000+0000"
    }
  },
  "user_attributes": {"Favourite_color": "Violet", "Pet_name": "Fluffy"},
  "integration_ids": {"firebase_app_instance_id": "val1", "branch_id": "val2", "one_signal_player_id": "val3"},
  "play_store_purchase_token": {
    "product_id": "product_123",
    "purchase_token": "token_abc_123",
    "is_subscription": true
  }
}

Các trường của sự kiện

Các tham số sự kiện đều giống nhau cho tất cả các loại sự kiện.

TrườngKiểuMô tả
advertising_idUUIDID quảng cáo (chỉ dành cho Android).
attributionsJSONDữ liệu attribution. Được đính kèm nếu Send Attribution được bật trong Webhook settings.
customer_user_idStringID người dùng từ app của bạn (UUID, email, hoặc ID khác) nếu bạn đã thiết lập trong code app khi xác định người dùng. Nếu bạn không xác định người dùng trong code app hoặc người dùng cụ thể này là ẩn danh (chưa đăng nhập), trường này sẽ là null.
emailStringEmail của người dùng nếu bạn thiết lập bằng phương thức updateProfile trong Adapty SDK hoặc khi tạo/cập nhật hồ sơ người dùng qua server-side API. Nếu bạn không truyền giá trị email vào SDK hoặc phương thức API, trường này sẽ là null.
event_api_versionIntegerPhiên bản Adapty API (hiện tại: 1).
event_datetimeISO 8601Thời điểm thực tế (nghiệp vụ) của sự kiện, chẳng hạn ngày mua hàng đối với giao dịch mua hoặc ngày hết hạn đối với sự kiện hết hạn — không phải thời điểm Adapty nhận hoặc gửi sự kiện. Định dạng ISO 8601 (ví dụ: 2020-07-10T15:00:00.000000+0000). Xem ghi chú bên dưới về thứ tự sắp xếp.
event_propertiesJSONThuộc tính sự kiện.
event_typeStringTên sự kiện theo định dạng Adapty. Xem Loại sự kiện Webhook để biết danh sách đầy đủ.
idfaUUIDID quảng cáo (chỉ dành cho Apple). IDFA trong hồ sơ người dùng trên Adapty Dashboard. Có thể là null nếu không khả dụng do hạn chế theo dõi, chế độ trẻ em, hoặc cài đặt quyền riêng tư.
idfvUUIDIdentifier for Vendors (IDFV), duy nhất theo nhà phát triển. IDFV trong hồ sơ người dùng trên Adapty Dashboard.
integration_idsJSONID tích hợp người dùng nếu bạn thiết lập bằng phương thức setIntegrationIdentifier trong Adapty SDK hoặc khi tạo/cập nhật hồ sơ người dùng qua server-side API. null nếu không khả dụng hoặc các tích hợp bị tắt.
play_store_purchase_tokenJSONToken mua hàng Play Store, được đính kèm nếu Send Play Store purchase token được bật trong Webhook settings.
profile_idUUIDID hồ sơ người dùng được Adapty tự động tạo cho mỗi hồ sơ. Một Apple/Google ID có thể được liên kết với nhiều profile ID khác nhau nếu bạn không xác định người dùng hoặc cho phép mua hàng trước khi đăng nhập. Tìm hiểu thêm về cách Adapty hoạt động với hồ sơ cha/con.
profile_install_datetimeISO 8601Thời điểm cài đặt theo định dạng ISO 8601 (ví dụ: 2020-07-10T15:00:00.000000+0000).
profiles_sharing_access_levelJSONDanh sách người dùng chia sẻ mức độ truy cập ngoại trừ hồ sơ người dùng hiện tại. Nếu tính năng chia sẻ mức độ truy cập được bật cho app của bạn, danh sách này bao gồm các hồ sơ khác đã được sử dụng với cùng Apple/Google ID.
Định dạng:
  • profile_id: (UUID) Adapty ID
  • customer_user_id: (String) Customer User ID nếu được cung cấp
user_agentStringUser-agent trình duyệt của thiết bị.
user_attributesJSONDữ liệu tùy chỉnh bạn có thể thiết lập để bổ sung thông tin cụ thể của app vào hồ sơ người dùng. Thường dùng để theo dõi tùy chọn của người dùng (ví dụ: giao diện, ngôn ngữ) hoặc các cờ hành vi (đã hoàn thành onboarding, mức độ sử dụng tính năng).
Được định dạng dưới dạng các cặp key-value trong đó key là chuỗi và value có thể là chuỗi hoặc số (ví dụ: {"Favourite_color": "Violet", "Pet_name": "Fluffy"}).
Bạn có thể thiết lập thuộc tính tùy chỉnh thủ công trong Adapty Dashboard cho từng hồ sơ người dùng riêng lẻ, theo lập trình bằng phương thức updateProfile trong Adapty SDK, hoặc qua server-side API khi tạo/cập nhật hồ sơ người dùng.
Được đính kèm nếu Send User Attributes được bật trong Webhook settings.

Trong khi các giá trị thuộc tính tùy chỉnh trong code app di động có thể được thiết lập dưới dạng float hoặc string, các thuộc tính nhận được qua server-side API hoặc import lịch sử có thể có định dạng khác. Trong trường hợp này, các giá trị boolean và integer sẽ được chuyển đổi thành float.

event_datetime phản ánh thời điểm một sự kiện xảy ra trong vòng đời gói đăng ký, chứ không phải thời điểm Adapty xử lý hay gửi nó. Vì vậy, các sự kiện có thể có cùng event_datetime hoặc đến không theo thứ tự thời gian. Ví dụ, một sự kiện subscription_expired có thể mang event_datetime sớm hơn một sự kiện subscription_renewal_cancelled mà Adapty gửi trước nó. Đừng dựa vào event_datetime để sắp xếp thứ tự các sự kiện. Thay vào đó, hãy sắp xếp sự kiện theo thời gian bạn nhận được, và loại bỏ trùng lặp bằng profile_event_id hoặc các transaction ID.

Attribution

Để gửi dữ liệu attribution, hãy bật tùy chọn Send Attribution trong trang Integrations -> Webhooks. Nếu bạn đã bật tính năng gửi dữ liệu attribution và đã thiết lập tích hợp attribution, dữ liệu dưới đây sẽ được gửi kèm theo sự kiện cho mỗi nguồn. Cùng một dữ liệu attribution sẽ được gửi cho tất cả các loại sự kiện.

{
  "attributions": {
    "appsflyer": {
      "ad_set": "sample_ad_set_123",
      "status": "non_organic",
      "channel": "sample_channel",
      "ad_group": "sample_ad_group_456",
      "campaign": "sample_ios_campaign",
      "creative": "sample_creative_789",
      "created_at": "2000-01-31T00:00:00.000000+0000",
      "network_user_id": "0000000000000-0000000"
    }
  }
}
Tên trườngKiểu dữ liệuMô tả
ad_setStringAd set attribution.
statusStringCó thể là organic, non_organic, hoặc unknown.
channelStringTên kênh marketing.
ad_groupStringAd group attribution.
campaignStringTên chiến dịch marketing.
creativeStringTừ khóa creative của attribution.
created_atISO 8601 dateNgày và giờ tạo bản ghi attribution.
network_user_idStringID được nguồn attribution gán cho người dùng.

ID tích hợp

Các ID tích hợp sau đây hiện được sử dụng trong các sự kiện:

  • adjust_device_id
  • airbridge_device_id
  • amplitude_device_id
  • amplitude_user_id
  • appmetrica_device_id
  • appmetrica_profile_id
  • appsflyer_id
  • branch_id
  • facebook_anonymous_id
  • firebase_app_instance_id
  • mixpanel_user_id
  • pushwoosh_hwid
  • one_signal_player_id
  • one_signal_subscription_id
  • tenjin_analytics_installation_id
  • posthog_distinct_user_id

Mã token mua hàng trên Play Store

Trường này chứa toàn bộ dữ liệu cần thiết để xác thực lại giao dịch khi cần. Nó chỉ được gửi khi tùy chọn Send Play Store purchase token được bật trong cài đặt tích hợp Webhook.

FieldTypeDescription
product_idStringMã định danh duy nhất của sản phẩm (SKU) được mua trên Play Store.
purchase_tokenStringToken do Google Play tạo ra để xác định duy nhất giao dịch mua này.
is_subscriptionBooleanCho biết sản phẩm được mua là gói đăng ký (true) hay sản phẩm mua một lần (false).

Thuộc tính sự kiện

Thuộc tính sự kiện có thể khác nhau tùy theo loại sự kiện và thậm chí giữa các sự kiện cùng loại. Ví dụ, một sự kiện từ App Store sẽ không bao gồm các thuộc tính dành riêng cho Android như base_plan_id. Sự kiện Access Level Updated có các thuộc tính riêng biệt, vì vậy chúng tôi đã dành một mục riêng cho nó. Tương tự, chúng tôi cũng tách riêng Thuộc tính sự kiện thuế và doanh thu bổ sung, vì chúng chỉ áp dụng cho một số loại sự kiện nhất định.

Đối với hầu hết các loại sự kiện

Các thuộc tính sự kiện của hầu hết các loại sự kiện đều nhất quán (ngoại trừ sự kiện Access Level Updated, được mô tả trong phần riêng của nó). Dưới đây là bảng tổng hợp các thuộc tính và chỉ rõ chúng thuộc về những sự kiện cụ thể nào.

TrườngKiểuMô tả
ab_test_nameStringTên của A/B test Adapty nơi giao dịch phát sinh.
ab_test_revisionIntegerPhiên bản của A/B test nơi giao dịch phát sinh.
base_plan_idStringBase plan ID trong Google Play Store hoặc price ID trong Stripe.
cancellation_reasonString

Các lý do hủy có thể có: voluntarily_cancelled, billing_error, price_increase, product_was_not_available, refund, cancelled_by_developer, new_subscription_replace, upgraded, unknown, adapty_revoked.

Xuất hiện trong các loại sự kiện sau:

subscription_cancelled, subscription_refundedtrial_cancelled.
cohort_nameStringTên của đối tượng đã xác định paywall nào được hiển thị cho người dùng.
consecutive_paymentsIntegerSố kỳ mà người dùng đã đăng ký liên tục không gián đoạn. Bao gồm kỳ hiện tại.
currencyStringĐơn vị tiền tệ địa phương.
developer_idStringID của placement nơi giao dịch phát sinh.
environmentStringGiá trị có thể là Sandbox hoặc Production.
event_datetimeISO 8601 dateNgày và giờ của sự kiện. Giống với giá trị ở cấp gốc của sự kiện.
original_purchase_dateISO 8601 dateĐối với gói đăng ký định kỳ, giao dịch mua ban đầu là giao dịch đầu tiên trong chuỗi, ID của nó được gọi là original transaction ID, liên kết chuỗi gia hạn; các giao dịch sau là phần mở rộng của nó. Ngày mua ban đầu là ngày và giờ của giao dịch đầu tiên này.
original_transaction_idString

Đối với gói đăng ký định kỳ, đây là original transaction ID liên kết chuỗi gia hạn. Giao dịch ban đầu là giao dịch đầu tiên trong chuỗi; các giao dịch sau là phần mở rộng của nó.

Nếu không có phần mở rộng, original_transaction_id trùng với store_transaction_id.

paywall_nameStringTên của paywall nơi giao dịch phát sinh.
paywall_revisionStringPhiên bản của paywall nơi giao dịch phát sinh. Giá trị mặc định là 1.
price_localFloatGiá sản phẩm trước khi Apple/Google khấu trừ, tính bằng đơn vị tiền tệ địa phương.
price_usdFloatGiá sản phẩm trước khi Apple/Google khấu trừ, tính bằng USD.
profile_countryStringĐược Adapty xác định dựa trên IP của hồ sơ người dùng.
profile_event_idUUIDID sự kiện duy nhất có thể dùng để loại trùng lặp.
profile_has_access_levelBooleanGiá trị boolean cho biết hồ sơ người dùng có mức độ truy cập đang hoạt động hay không.
profile_idUUIDID hồ sơ người dùng do Adapty tạo ra. Giống với giá trị ở cấp gốc của sự kiện.
profile_ip_addressStringIP của hồ sơ người dùng (có thể là IPv4 hoặc IPv6, ưu tiên IPv4 khi có). null nếu Collect users’ IP addresses bị tắt trong cài đặt ứng dụng.
profile_total_revenue_usdFloatTổng doanh thu của hồ sơ người dùng sau khi đã trừ các khoản hoàn tiền.
promotional_offer_idStringID Adapty của ưu đãi đã được áp dụng. Bạn đặt ID này khi tạo ưu đãi trong dashboard.
purchase_dateISO 8601 dateNgày và giờ mua sản phẩm.
rate_after_first_yearBooleanBoolean cho biết gói đăng ký đủ điều kiện áp dụng mức hoa hồng giảm (thường là 15%) sau một năm gia hạn liên tục. Mức hoa hồng thay đổi tùy theo điều kiện tham gia chương trình và quốc gia. Xem Hoa hồng cửa hàng và thuế để biết thêm chi tiết.
storeStringCửa hàng nơi sản phẩm được mua. Giá trị tiêu chuẩn: app_store, play_store, stripe, paddle.
Nếu bạn thiết lập giao dịch cửa hàng tùy chỉnh bằng server-side API, giá trị từ tham số store sẽ được sử dụng.
store_countryStringQuốc gia được app store gửi cho chúng tôi.
store_offer_categoryStringDanh mục ưu đãi được áp dụng. Giá trị có thể là introductory, promotional, winback.
store_offer_discount_typeStringLoại ưu đãi được áp dụng. Giá trị có thể là free_trial, pay_as_you_gopay_up_front.
subscription_expires_atISO 8601 dateNgày hết hạn của gói đăng ký. Thường là trong tương lai.
transaction_idStringMã định danh duy nhất cho một giao dịch.
trial_durationStringThời hạn của giai đoạn dùng thử tính bằng ngày. Được gửi theo định dạng ” days”, ví dụ “7 days”. Chỉ xuất hiện trong các loại sự kiện liên quan đến dùng thử: trial_started, trial_converted, trial_cancelled.
variation_idUUIDID duy nhất của paywall nơi thực hiện giao dịch mua.
vendor_product_idString

ID sản phẩm trong Apple App Store, Google Play Store hoặc Stripe.

Nếu quyền truy cập được cấp mà không có giao dịch thực từ cửa hàng, vendor_product_id sẽ là một trong các giá trị sau:

Thuộc tính sự kiện về thuế và doanh thu bổ sung

Các thuộc tính sự kiện liên quan đến thuế và doanh thu dưới đây là các trường bổ sung chỉ áp dụng cho một số loại sự kiện nhất định. Điều này có nghĩa là các loại sự kiện được liệt kê bao gồm Thuộc tính sự kiện cho hầu hết các loại sự kiện, cùng với các trường bổ sung được liệt kê bên dưới.

Các loại sự kiện có thuộc tính sự kiện về thuế và doanh thu:

  • subscription_renewed
  • subscription_initial_purchase (còn được gọi là subscription_started — cùng một sự kiện)
  • subscription_refunded
  • non_subscription_purchase | Field | Type | Description | | :-------------------- | :---- | :----------------------------------------------------------- | | net_revenue_local | Float | Doanh thu thuần (thu nhập sau khi trừ phần của Apple/Google và thuế) tính theo tiền tệ địa phương. | | net_revenue_usd | Float | Doanh thu thuần (thu nhập sau khi trừ phần của Apple/Google và thuế) tính theo USD. | | proceeds_local | Float | Giá sản phẩm sau khi trừ phần của Apple/Google tính theo tiền tệ địa phương. | | proceeds_usd | Float | Giá sản phẩm sau khi trừ phần của Apple/Google. | | tax_amount_local | Float | Số tiền thuế bị khấu trừ tính theo tiền tệ địa phương. | | tax_amount_usd | Float | Số tiền thuế bị khấu trừ tính theo USD. |

Ví dụ payload non_subscription_purchase

non_subscription_purchase có cùng cấu trúc với các sự kiện gói đăng ký nhưng phản ánh một lần mua một lần hoặc consumable. Các trường chỉ dành cho gói đăng ký không áp dụng: cancellation_reason, will_renew, is_in_grace_period, is_refund, is_lifetime, và trial_duration đều không có. subscription_expires_at có mặt nhưng là null. Các trường thuế và doanh thu (net_revenue_*, proceeds_*, tax_amount_*) được bao gồm.

Ví dụ payload (nhấn để mở rộng)
{
  "profile_id": "00000000-0000-0000-0000-000000000000",
  "customer_user_id": "UserIdInYourSystem",
  "event_type": "non_subscription_purchase",
  "event_datetime": "2000-01-31T00:00:00.000000+0000",
  "event_properties": {
    "store": "app_store",
    "currency": "USD",
    "price_usd": 4.99,
    "price_local": 4.99,
    "proceeds_usd": 4.2415,
    "proceeds_local": 4.2415,
    "net_revenue_usd": 4.2415,
    "net_revenue_local": 4.2415,
    "tax_amount_usd": 0,
    "tax_amount_local": 0,
    "profile_id": "00000000-0000-0000-0000-000000000000",
    "environment": "Production",
    "vendor_product_id": "100coins",
    "transaction_id": "0000000000000000",
    "original_transaction_id": "0000000000000000",
    "purchase_date": "2024-11-15T10:45:36.181000+0000",
    "original_purchase_date": "2024-11-15T10:45:36.181000+0000",
    "subscription_expires_at": null,
    "store_country": "US",
    "profile_country": "US",
    "profile_ip_address": "10.10.1.1",
    "profile_has_access_level": false,
    "profile_total_revenue_usd": 4.99,
    "consecutive_payments": 1,
    "rate_after_first_year": false,
    "profile_event_id": "00000000-0000-0000-0000-000000000000"
  },
  "event_api_version": 1
}

Đối với sự kiện Access Level Updated

Sự kiện Access Level Updated là một loại sự kiện webhook đặc biệt, chỉ được tạo ra khi tích hợp Webhook đang hoạt động và loại sự kiện này được bật. Nếu được bật, sự kiện sẽ được gửi đến Webhook đã cấu hình và hiển thị trong Event Feed. Nếu không được bật, sự kiện sẽ không được tạo.

Nếu bạn đã bật chia sẻ mức độ truy cập, sự kiện access level updated sẽ được gửi cho tất cả các hồ sơ người dùng đang chia sẻ mức độ truy cập đó.

Sử dụng sự kiện này để cập nhật mức độ truy cập của người dùng trong cơ sở dữ liệu, cấp hoặc thu hồi các tính năng cao cấp trên backend, và đồng bộ quyền truy cập trên các thiết bị hoặc nền tảng khác nhau.

Thuộc tínhKiểuMô tả
ab_test_nameStringTên A/B test nơi giao dịch bắt nguồn.
access_level_idStringID của mức độ truy cập.
activated_atISO 8601 dateNgày và giờ khi quyền truy cập được kích hoạt lần gần nhất.
active_introductory_offer_typeStringLoại ưu đãi giới thiệu được áp dụng. Các giá trị có thể là free_trial, pay_as_you_go, và pay_up_front.
active_promotional_offer_idStringID của ưu đãi như được chỉ định trong phần Product của Adapty Dashboard
active_promotional_offer_typeStringLoại ưu đãi được áp dụng. Các giá trị có thể là free_trial, pay_as_you_go, và pay_up_front.
base_plan_idStringBase plan ID trong Google Play Store hoặc price ID trong Stripe.
billing_issue_detected_atISO 8601 dateNgày và giờ xảy ra sự cố thanh toán.
cancellation_reasonStringCác lý do hủy có thể có: voluntarily_cancelled, billing_error, price_increase, product_was_not_available, refund, cancelled_by_developer, new_subscription_replace, upgraded, unknown, adapty_revoked.
cohort_nameStringTên đối tượng mà hồ sơ người dùng thuộc về.
currencyStringĐơn vị tiền tệ địa phương (mặc định là USD).
developer_idStringID của placement nơi giao dịch bắt nguồn.
environmentStringCác giá trị có thể là Sandbox hoặc Production.
event_datetimeISO 8601 dateNgày và giờ của sự kiện.
expires_atISO 8601 dateNgày và giờ khi quyền truy cập hết hạn.
is_activeBooleanBoolean cho biết mức độ truy cập có đang hoạt động hay không.
is_in_grace_periodBooleanBoolean cho biết hồ sơ người dùng có đang trong thời gian ân hạn hay không.
is_lifetimeBooleanBoolean cho biết mức độ truy cập có phải là trọn đời hay không.
is_refundBooleanBoolean cho biết giao dịch có phải là hoàn tiền hay không.
original_purchase_dateISO 8601 dateĐối với các gói đăng ký định kỳ, giao dịch mua ban đầu là giao dịch đầu tiên trong chuỗi, ID của nó được gọi là original transaction ID liên kết chuỗi gia hạn; các giao dịch sau là phần mở rộng của nó. Ngày mua ban đầu là ngày và giờ của giao dịch đầu tiên này.
original_transaction_idString

Đối với các gói đăng ký định kỳ, đây là original transaction ID liên kết chuỗi gia hạn. Giao dịch ban đầu là giao dịch đầu tiên trong chuỗi; các giao dịch sau là phần mở rộng của nó.

Nếu không có phần mở rộng nào, original_transaction_id trùng với store_transaction_id.

Mã định danh giao dịch của lần mua ban đầu.
paywall_nameStringTên paywall nơi giao dịch bắt nguồn.
paywall_revisionStringPhiên bản của paywall nơi giao dịch bắt nguồn. Giá trị mặc định là 1.
profile_countryStringĐược xác định bởi Adapty, dựa trên IP của hồ sơ người dùng.
profile_event_idUUIDID sự kiện duy nhất có thể dùng để loại trùng lặp.
profile_has_access_levelBooleanBoolean cho biết hồ sơ người dùng có mức độ truy cập đang hoạt động hay không.
profile_idUUIDID hồ sơ người dùng nội bộ của Adapty.
profile_ip_addressStringIP của hồ sơ người dùng (có thể là IPv4 hoặc IPv6, ưu tiên IPv4 khi có). null nếu Collect users’ IP addresses bị tắt trong cài đặt ứng dụng.
profile_total_revenue_usdFloatTổng doanh thu của hồ sơ người dùng, bao gồm cả hoàn tiền.
purchase_dateISO 8601 dateNgày và giờ mua sản phẩm.
renewed_atISO 8601 dateNgày và giờ khi quyền truy cập sẽ được gia hạn.
starts_atISO 8601 dateNgày và giờ khi mức độ truy cập bắt đầu.
storeStringCửa hàng nơi sản phẩm được mua. Các giá trị tiêu chuẩn: app_store, play_store, stripe, paddle.
Nếu bạn thiết lập giao dịch cửa hàng tùy chỉnh bằng API phía máy chủ, giá trị từ tham số store sẽ được sử dụng.
store_countryStringQuốc gia được app store gửi đến Adapty.
subscription_expires_atISO 8601 dateNgày hết hạn của gói đăng ký.
transaction_idStringMã định danh duy nhất cho một giao dịch.
trial_durationStringThời hạn của giai đoạn dùng thử tính theo ngày (ví dụ: “7 days”).
variation_idUUIDMã định danh của một biến thể, dùng để gán các giao dịch mua cho paywall này.
vendor_product_idString

ID sản phẩm trong cửa hàng (Apple/Google/Stripe).

Nếu quyền truy cập được cấp mà không có giao dịch cửa hàng thực, vendor_product_id sẽ là một trong các giá trị sau:

will_renewBooleanCho biết mức độ truy cập trả phí có được gia hạn hay không.

Lưu ý rằng cấu trúc này có thể mở rộng theo thời gian — với dữ liệu mới được chúng tôi hoặc các bên thứ ba mà chúng tôi hợp tác giới thiệu. Hãy đảm bảo rằng code xử lý cấu trúc này đủ linh hoạt và chỉ phụ thuộc vào các trường cụ thể thay vì toàn bộ cấu trúc.