> For the complete documentation index, see [llms.txt](https://help.daasity.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.daasity.com/core-concepts/data-integrations/setup-guides/digital-integrations/tiktok-shop/integration-specifications.md).

# Integration Specifications

TikTok Shop integration for order data, discounts, refunds, and returns — unified in Daasity.

### Integration Overview

TikTok Shop is TikTok's native ecommerce platform, enabling merchants to sell products directly within the TikTok app. Daasity's TikTok Shop integration connects directly to the TikTok Shop API to replicate transactional order data — orders, payments, line items, pricing, discounts, returns, and refunds.

This document provides context on what kind of data is being gathered through this extractor, which endpoints that data is coming from, and how the extracted tables relate to each other.

### Integration Availability

This integration is currently in **Beta** and is enabled per-account by Daasity. It is not part of the standard integration set on any plan — contact your Account Manager to have it enabled.

### API Endpoints

The Daasity TikTok Shop extractor is built based on the TikTok Shop Partner API. The following endpoints are used by Daasity to replicate data from TikTok Shop:

* Authorized Shops — `GET /authorization/202309/shops` (identifies the authorized shop at setup; does not create a table)
* Order List — `POST /order/202309/orders/search`
* Order Price Detail — `GET /order/202407/orders/{order_id}/price_detail`
* External Orders — `GET /order/202406/orders/{order_id}/external_orders`
* Transactions by Order — `GET /finance/202501/orders/{order_id}/statement_transactions`
* Returns — `POST /return_refund/202309/returns/search`
* Products — `POST /product/202502/products/search`
* Coupons — `POST /promotion/202406/coupons/search`
* Activities — `POST /promotion/202309/activities/search`
* Shop Performance — `GET /analytics/202509/shop/performance`
* Shop Product Performance — `GET /analytics/202509/shop_products/{product_id}/performance`

{% hint style="info" %}
Payment data is not a separate endpoint — it is parsed from the `payment` object embedded in the Order List response and lands in `order_payments`. Order Price Detail, External Orders and Transactions by Order are fetched per order (one API call per order ID) as children of the Orders sync; External Orders is only retrieved when the integration is configured with external platforms. Shop Product Performance is fetched per product as a child of the Products sync.
{% endhint %}

#### Entity Relationship Diagram (ERD)

An ERD for the TikTok Shop integration is not yet available.

### TikTok Shop Schema

The Daasity TikTok Shop extractor creates these tables using the endpoints and replication methods listed. All tables are stored in the `tiktok_shop` schema, are upserted on `__sync_key`, and carry Daasity housekeeping columns (`_account_id`, `__synced_at`, `__shop_id`) in addition to the columns listed below.

**Order tables**

* [Orders](#orders)
* [Order Payments](#order-payments)
* [Order Line Items](#order-line-items)
* [Order Line Item Combined SKUs](#order-line-item-combined-skus)
* [Order Price Detail](#order-price-detail)
* [Order Line Item Price Detail](#order-line-item-price-detail)
* [External Orders](#external-orders)
* [Returns](#returns)
* [Return Line Items](#return-line-items)
* [Transactions by Order](#transactions-by-order)

**Non-order tables**

* [Products and related tables](#products)
* [Coupons](#coupons)
* [Activities](#activities)
* [Shop Performance](#shop-performance)
* [Shop Product Performance](#shop-product-performance)

#### Table Relationships

* `orders` — keyed on shop + order ID
* `order_payments` → `orders` — **joins on `__sync_key`, not an order\_id column** (it has none; one row per order)
* `order_line_items.order_id` → `orders.id`
* `order_line_item_combined_skus.order_id` → `orders.id`, `.order_line_item_id` → `order_line_items.id`
* `order_price_detail` → `orders` — **joins on `__sync_key`, not an order\_id column** (it has none; one row per order)
* `order_line_item_price_detail.line_item_id` → `order_line_items.id` (there is no order\_id column)
* `external_orders.order_id` → `orders.id`
* `returns.order_id` → `orders.id`
* `return_line_items.return_id` → `returns.return_id`, `.order_line_item_id` → `order_line_items.id`
* `transactions_by_orders.order_id` → `orders.id`, `.sku_id` → `order_line_items.sku_id`
* `product_skus.product_id`, `product_family_products.product_id`, `product_sku_inventory.product_id`, `product_sku_fees.product_id` → `products.id`
* `product_sku_inventory.sku_id`, `product_sku_fees.sku_id` → `product_skus.id`
* `activity_bmsm_discount_details.activity_id` → `activities.id`
* `shop_product_performance*.product_id` → `products.id`

{% hint style="info" %}
For multi-shop accounts, include `__shop_id` in any join made on raw IDs, since sync keys incorporate the shop.
{% endhint %}

#### Orders

* Endpoint: `POST /order/202309/orders/search`
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.orders`]

| JSON Element                                               | Database Column                          |
| ---------------------------------------------------------- | ---------------------------------------- |
| `id`                                                       | `id`                                     |
| `status`                                                   | `status`                                 |
| `fulfillment_type`                                         | `fulfillment_type`                       |
| `delivery_type`                                            | `delivery_type`                          |
| `create_time`                                              | `create_time`                            |
| `paid_time`                                                | `paid_time`                              |
| `update_time`                                              | `update_time`                            |
| `cancel_time`                                              | `cancel_time`                            |
| `cancel_reason`                                            | `cancel_reason`                          |
| `cancellation_initiator`                                   | `cancellation_initiator`                 |
| `payment_method_name`                                      | `payment_method_name`                    |
| `shipping_provider`                                        | `shipping_provider`                      |
| `shipping_provider_id`                                     | `shipping_provider_id`                   |
| `shipping_type`                                            | `shipping_type`                          |
| `tracking_number`                                          | `tracking_number`                        |
| `warehouse_id`                                             | `warehouse_id`                           |
| `buyer_message`                                            | `buyer_message`                          |
| `buyer_email`                                              | `buyer_email`                            |
| `buyer_nickname`                                           | `buyer_nickname`                         |
| `buyer_avatar`                                             | `buyer_avatar`                           |
| `user_id`                                                  | `user_id`                                |
| `seller_note`                                              | `seller_note`                            |
| `is_cod`                                                   | `is_cod`                                 |
| `is_sample_order`                                          | `is_sample_order`                        |
| `is_subscription_order`                                    | `is_subscription_order`                  |
| `is_on_hold_order`                                         | `is_on_hold_order`                       |
| `is_replacement_order`                                     | `is_replacement_order`                   |
| `replaced_order_id`                                        | `replaced_order_id`                      |
| `is_exchange_order`                                        | `is_exchange_order`                      |
| `exchange_source_order_id`                                 | `exchange_source_order_id`               |
| `is_buyer_request_cancel`                                  | `is_buyer_request_cancel`                |
| `request_cancel_time`                                      | `request_cancel_time`                    |
| `commerce_platform`                                        | `commerce_platform`                      |
| `order_type`                                               | `order_type`                             |
| `release_date`                                             | `release_date`                           |
| `cpf`                                                      | `cpf`                                    |
| `cpf_name`                                                 | `cpf_name`                               |
| `consultation_id`                                          | `consultation_id`                        |
| `fast_delivery_program`                                    | `fast_delivery_program`                  |
| `fast_dispatch_sla_time`                                   | `fast_dispatch_sla_time`                 |
| `fulfillment_priority_level`                               | `fulfillment_priority_level`             |
| `auto_combine_group_id`                                    | `auto_combine_group_id`                  |
| `split_or_combine_tag`                                     | `split_or_combine_tag`                   |
| `need_upload_invoice`                                      | `need_upload_invoice`                    |
| `has_updated_recipient_address`                            | `has_updated_recipient_address`          |
| `rts_time`                                                 | `rts_time`                               |
| `rts_sla_time`                                             | `rts_sla_time`                           |
| `tts_sla_time`                                             | `tts_sla_time`                           |
| `delivery_time`                                            | `delivery_time`                          |
| `delivery_sla_time`                                        | `delivery_sla_time`                      |
| `delivery_due_time`                                        | `delivery_due_time`                      |
| `delivery_option_id`                                       | `delivery_option_id`                     |
| `delivery_option_name`                                     | `delivery_option_name`                   |
| `delivery_option_required_delivery_time`                   | `delivery_option_required_delivery_time` |
| `shipping_due_time`                                        | `shipping_due_time`                      |
| `collection_time`                                          | `collection_time`                        |
| `collection_due_time`                                      | `collection_due_time`                    |
| `cancel_order_sla_time`                                    | `cancel_order_sla_time`                  |
| `pick_up_cut_off_time`                                     | `pick_up_cut_off_time`                   |
| `recommended_shipping_time`                                | `recommended_shipping_time`              |
| `handling_duration.days`                                   | `handling_duration_days`                 |
| `handling_duration.type`                                   | `handling_duration_type`                 |
| `recipient_address.recipient_name`                         | `recipient_name`                         |
| `recipient_address.first_name`                             | `recipient_first_name`                   |
| `recipient_address.last_name`                              | `recipient_last_name`                    |
| `recipient_address.first_name_local_script`                | `recipient_first_name_local_script`      |
| `recipient_address.last_name_local_script`                 | `recipient_last_name_local_script`       |
| `recipient_address.recipient_full_address`                 | `recipient_full_address`                 |
| `recipient_address.recipient_phone_number`                 | `recipient_phone_number`                 |
| `recipient_address.address_detail`                         | `recipient_address_detail`               |
| `recipient_address.address_line1`                          | `recipient_address_line1`                |
| `recipient_address.address_line2`                          | `recipient_address_line2`                |
| `recipient_address.address_line3`                          | `recipient_address_line3`                |
| `recipient_address.address_line4`                          | `recipient_address_line4`                |
| `recipient_address.postal_code`                            | `recipient_postal_code`                  |
| `recipient_address.region_code`                            | `recipient_region_code`                  |
| `recipient_address.post_town`                              | `recipient_post_town`                    |
| `recipient_address.district_info[0].address_level`         | `recipient_district_address_level`       |
| `recipient_address.district_info[0].address_level_name`    | `recipient_district_address_level_name`  |
| `recipient_address.district_info[0].address_name`          | `recipient_district_address_name`        |
| `recipient_address.district_info[0].iso_code`              | `recipient_district_iso_code`            |
| `recipient_address.delivery_preferences.drop_off_location` | `recipient_delivery_drop_off_location`   |
| `packages[].id` (comma-joined)                             | `package_ids`                            |
| `order_rights[]` (comma-joined)                            | `order_rights`                           |
| MD5(shop\_id + `id`)                                       | `__sync_key`                             |

#### Order Payments

* Source: `payment` object in the Order List response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.order_payments`]

One row per order. There is no `order_id` column — join to `orders` on `__sync_key`.

| JSON Element                      | Database Column                  |
| --------------------------------- | -------------------------------- |
| `currency`                        | `currency`                       |
| `sub_total`                       | `sub_total`                      |
| `total_amount`                    | `total_amount`                   |
| `original_total_product_price`    | `original_total_product_price`   |
| `seller_discount`                 | `seller_discount`                |
| `platform_discount`               | `platform_discount`              |
| `payment_platform_discount`       | `payment_platform_discount`      |
| `payment_discount_service_fee`    | `payment_discount_service_fee`   |
| `shipping_fee`                    | `shipping_fee`                   |
| `original_shipping_fee`           | `original_shipping_fee`          |
| `shipping_fee_seller_discount`    | `shipping_fee_seller_discount`   |
| `shipping_fee_platform_discount`  | `shipping_fee_platform_discount` |
| `shipping_fee_cofunded_discount`  | `shipping_fee_cofunded_discount` |
| `shipping_fee_tax`                | `shipping_fee_tax`               |
| `shipping_insurance_fee`          | `shipping_insurance_fee`         |
| `tax`                             | `tax`                            |
| `product_tax`                     | `product_tax`                    |
| `retail_delivery_fee`             | `retail_delivery_fee`            |
| `small_order_fee`                 | `small_order_fee`                |
| `buyer_service_fee`               | `buyer_service_fee`              |
| `handling_fee`                    | `handling_fee`                   |
| `item_insurance_fee`              | `item_insurance_fee`             |
| `item_insurance_tax`              | `item_insurance_tax`             |
| `distance_shipping_fee`           | `distance_shipping_fee`          |
| `distance_fee`                    | `distance_fee`                   |
| MD5(shop\_id + parent order `id`) | `__sync_key`                     |

#### Order Line Items

* Source: `line_items[]` in the Order List response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.order_line_items`]

| JSON Element             | Database Column          |
| ------------------------ | ------------------------ |
| parent `orders[].id`     | `order_id`               |
| `id`                     | `id`                     |
| `product_id`             | `product_id`             |
| `product_name`           | `product_name`           |
| `sku_id`                 | `sku_id`                 |
| `sku_name`               | `sku_name`               |
| `seller_sku`             | `seller_sku`             |
| `sku_type`               | `sku_type`               |
| `sku_image`              | `sku_image`              |
| `sale_price`             | `sale_price`             |
| `original_price`         | `original_price`         |
| `platform_discount`      | `platform_discount`      |
| `seller_discount`        | `seller_discount`        |
| `currency`               | `currency`               |
| `pfand_fee`              | `pfand_fee`              |
| `retail_delivery_fee`    | `retail_delivery_fee`    |
| `buyer_service_fee`      | `buyer_service_fee`      |
| `small_order_fee`        | `small_order_fee`        |
| `distance_shipping_fee`  | `distance_shipping_fee`  |
| `distance_fee`           | `distance_fee`           |
| `display_status`         | `display_status`         |
| `package_status`         | `package_status`         |
| `package_id`             | `package_id`             |
| `cancel_reason`          | `cancel_reason`          |
| `cancel_user`            | `cancel_user`            |
| `rts_time`               | `rts_time`               |
| `tracking_number`        | `tracking_number`        |
| `shipping_provider_name` | `shipping_provider_name` |
| `shipping_provider_id`   | `shipping_provider_id`   |
| `is_gift`                | `is_gift`                |
| `is_dangerous_good`      | `is_dangerous_good`      |
| `needs_prescription`     | `needs_prescription`     |
| `gift_retail_price`      | `gift_retail_price`      |
| `is_unboxing_item`       | `is_unboxing_item`       |
| `unboxing_sku_code`      | `unboxing_sku_code`      |
| `handling_duration_days` | `handling_duration_days` |
| MD5(shop\_id + `id`)     | `__sync_key`             |

#### Order Line Item Combined SKUs

* Source: `line_items[].combined_listing_skus[]` in the Order List response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.order_line_item_combined_skus`]

| JSON Element                              | Database Column      |
| ----------------------------------------- | -------------------- |
| parent `orders[].id`                      | `order_id`           |
| parent `line_items[].id`                  | `order_line_item_id` |
| `sku_id`                                  | `sku_id`             |
| `sku_count`                               | `sku_count`          |
| `product_id`                              | `product_id`         |
| `seller_sku`                              | `seller_sku`         |
| MD5(shop\_id + line item `id` + `sku_id`) | `__sync_key`         |

#### Order Price Detail

* Endpoint: `GET /order/202407/orders/{order_id}/price_detail`
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.order_price_detail`]

One row per order. There is no `order_id` column — join to `orders` on `__sync_key`.

| JSON Element                              | Database Column                           |
| ----------------------------------------- | ----------------------------------------- |
| `currency`                                | `currency`                                |
| `total`                                   | `total`                                   |
| `payment`                                 | `payment`                                 |
| `subtotal`                                | `subtotal`                                |
| `sku_list_price`                          | `sku_list_price`                          |
| `sku_sale_price`                          | `sku_sale_price`                          |
| `subtotal_deduction_seller`               | `subtotal_deduction_seller`               |
| `subtotal_deduction_platform`             | `subtotal_deduction_platform`             |
| `subtotal_tax_amount`                     | `subtotal_tax_amount`                     |
| `voucher_deduction_seller`                | `voucher_deduction_seller`                |
| `voucher_deduction_platform`              | `voucher_deduction_platform`              |
| `shipping_list_price`                     | `shipping_list_price`                     |
| `shipping_sale_price`                     | `shipping_sale_price`                     |
| `shipping_fee_deduction_seller`           | `shipping_fee_deduction_seller`           |
| `shipping_fee_deduction_platform`         | `shipping_fee_deduction_platform`         |
| `shipping_fee_deduction_platform_voucher` | `shipping_fee_deduction_platform_voucher` |
| `tax_amount`                              | `tax_amount`                              |
| `tax_rate`                                | `tax_rate`                                |
| `net_price_amount`                        | `net_price_amount`                        |
| `cod_fee`                                 | `cod_fee`                                 |
| `cod_fee_net_amount`                      | `cod_fee_net_amount`                      |
| `sku_gift_original_price`                 | `sku_gift_original_price`                 |
| `sku_gift_net_price`                      | `sku_gift_net_price`                      |
| `distance_shipping_fee`                   | `distance_shipping_fee`                   |
| `distance_fee`                            | `distance_fee`                            |
| MD5(shop\_id + order\_id)                 | `__sync_key`                              |

#### Order Line Item Price Detail

* Source: `line_items[]` in the Price Detail response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.order_line_item_price_detail`]

Contains the same columns as `order_price_detail`, with the addition of `line_item_id` (← `id`) and `cod_fee_amount` (← `cod_fee_amount`) in place of `cod_fee_net_amount`. There is no `order_id` column — join to `order_line_items` on `line_item_id`.

| JSON Element                               | Database Column                           |
| ------------------------------------------ | ----------------------------------------- |
| `id`                                       | `line_item_id`                            |
| `currency`                                 | `currency`                                |
| `total`                                    | `total`                                   |
| `payment`                                  | `payment`                                 |
| `subtotal`                                 | `subtotal`                                |
| `sku_list_price`                           | `sku_list_price`                          |
| `sku_sale_price`                           | `sku_sale_price`                          |
| `subtotal_deduction_seller`                | `subtotal_deduction_seller`               |
| `subtotal_deduction_platform`              | `subtotal_deduction_platform`             |
| `subtotal_tax_amount`                      | `subtotal_tax_amount`                     |
| `voucher_deduction_seller`                 | `voucher_deduction_seller`                |
| `voucher_deduction_platform`               | `voucher_deduction_platform`              |
| `shipping_list_price`                      | `shipping_list_price`                     |
| `shipping_sale_price`                      | `shipping_sale_price`                     |
| `shipping_fee_deduction_seller`            | `shipping_fee_deduction_seller`           |
| `shipping_fee_deduction_platform`          | `shipping_fee_deduction_platform`         |
| `shipping_fee_deduction_platform_voucher`  | `shipping_fee_deduction_platform_voucher` |
| `tax_amount`                               | `tax_amount`                              |
| `tax_rate`                                 | `tax_rate`                                |
| `net_price_amount`                         | `net_price_amount`                        |
| `cod_fee`                                  | `cod_fee`                                 |
| `cod_fee_amount`                           | `cod_fee_amount`                          |
| `sku_gift_original_price`                  | `sku_gift_original_price`                 |
| `sku_gift_net_price`                       | `sku_gift_net_price`                      |
| `distance_shipping_fee`                    | `distance_shipping_fee`                   |
| `distance_fee`                             | `distance_fee`                            |
| MD5(shop\_id + order\_id + line item `id`) | `__sync_key`                              |

#### External Orders

* Endpoint: `GET /order/202406/orders/{order_id}/external_orders`
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.external_orders`]

Retrieved once per order per configured external platform.

| JSON Element                        | Database Column |
| ----------------------------------- | --------------- |
| order id (from job context)         | `order_id`      |
| `id` (external platform's order id) | `id`            |
| `platform`                          | `platform`      |
| MD5(shop\_id + order\_id + `id`)    | `__sync_key`    |

#### Returns

* Endpoint: `POST /return_refund/202309/returns/search`
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.returns`]

| JSON Element                            | Database Column                 |
| --------------------------------------- | ------------------------------- |
| `order_id`                              | `order_id`                      |
| `return_id`                             | `return_id`                     |
| `return_type`                           | `return_type`                   |
| `return_status`                         | `return_status`                 |
| `arbitration_status`                    | `arbitration_status`            |
| `role`                                  | `role`                          |
| `return_reason`                         | `return_reason`                 |
| `return_reason_text`                    | `return_reason_text`            |
| `shipment_type`                         | `shipment_type`                 |
| `handover_method`                       | `handover_method`               |
| `return_tracking_number`                | `return_tracking_number`        |
| `return_provider_name`                  | `return_provider_name`          |
| `return_provider_id`                    | `return_provider_id`            |
| `return_method`                         | `return_method`                 |
| `return_shipping_document_type`         | `return_shipping_document_type` |
| `pre_return_id`                         | `pre_return_id`                 |
| `next_return_id`                        | `next_return_id`                |
| `is_combined_return`                    | `is_combined_return`            |
| `combined_return_id`                    | `combined_return_id`            |
| `can_buyer_keep_item`                   | `can_buyer_keep_item`           |
| `seller_proposed_return_type`           | `seller_proposed_return_type`   |
| `buyer_rejected_partial_refund`         | `buyer_rejected_partial_refund` |
| `is_quick_refund`                       | `is_quick_refund`               |
| `create_time`                           | `create_time`                   |
| `update_time`                           | `update_time`                   |
| `partial_refund.currency`               | `partial_refund_currency`       |
| `partial_refund.amount`                 | `partial_refund_amount`         |
| `return_warehouse_address.full_address` | `return_warehouse_full_address` |
| MD5(shop\_id + `return_id`)             | `__sync_key`                    |

#### Return Line Items

* Source: `return_line_items[]` in the Returns response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.return_line_items`]

| JSON Element                                       | Database Column                            |
| -------------------------------------------------- | ------------------------------------------ |
| parent `return_orders[].return_id`                 | `return_id`                                |
| `return_line_item_id`                              | `return_line_item_id`                      |
| `order_line_item_id`                               | `order_line_item_id`                       |
| `sku_id`                                           | `sku_id`                                   |
| `sku_name`                                         | `sku_name`                                 |
| `product_name`                                     | `product_name`                             |
| `seller_sku`                                       | `seller_sku`                               |
| `product_image.url`                                | `product_image_url`                        |
| `product_image.width`                              | `product_image_width`                      |
| `product_image.height`                             | `product_image_height`                     |
| `refund_amount.currency`                           | `refund_amount_currency`                   |
| `refund_amount.refund_total`                       | `refund_amount_refund_total`               |
| `refund_amount.refund_subtotal`                    | `refund_amount_refund_subtotal`            |
| `refund_amount.refund_shipping_fee`                | `refund_amount_refund_refund_shipping_fee` |
| `refund_amount.refund_tax`                         | `refund_amount_refund_tax`                 |
| `refund_amount.retail_delivery_fee`                | `refund_amount_retail_delivery_fee`        |
| `refund_amount.buyer_service_fee`                  | `refund_amount_buyer_service_fee`          |
| MD5(shop\_id + return\_id + `return_line_item_id`) | `__sync_key`                               |

#### Transactions by Order

* Endpoint: `GET /finance/202501/orders/{order_id}/statement_transactions`
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.transactions_by_orders`]

Fetched per order as a child of the Orders sync. One row per `sku_transactions[]` entry (per statement and SKU). All amounts are stored as text.

| JSON Element                                                     | Database Column                            |
| ---------------------------------------------------------------- | ------------------------------------------ |
| order id (from job context)                                      | `order_id`                                 |
| `statement_id`                                                   | `statement_id`                             |
| `sku_id`                                                         | `sku_id`                                   |
| `sku_name`                                                       | `sku_name`                                 |
| `product_name`                                                   | `product_name`                             |
| `quantity`                                                       | `quantity`                                 |
| `currency` (top level of the response)                           | `currency`                                 |
| `settlement_amount`                                              | `settlement_amount`                        |
| `revenue_amount`                                                 | `revenue_amount`                           |
| `shipping_cost_amount`                                           | `shipping_cost_amount`                     |
| `fee_tax_amount`                                                 | `fee_tax_amount`                           |
| `fee_tax_breakdown.fee.platform_commission_amount`               | `platform_commission_amount`               |
| `fee_tax_breakdown.fee.referral_fee_amount`                      | `referral_fee_amount`                      |
| `fee_tax_breakdown.fee.refund_administration_fee_amount`         | `refund_administration_fee_amount`         |
| `fee_tax_breakdown.fee.transaction_fee_amount`                   | `transaction_fee_amount`                   |
| `fee_tax_breakdown.fee.credit_card_handling_fee_amount`          | `credit_card_handling_fee_amount`          |
| `fee_tax_breakdown.fee.affiliate_commission_amount`              | `affiliate_commission_amount`              |
| `fee_tax_breakdown.fee.affiliate_commission_amount_before_pit`   | `affiliate_commission_amount_before_pit`   |
| `fee_tax_breakdown.fee.affiliate_partner_commission_amount`      | `affiliate_partner_commission_amount`      |
| `fee_tax_breakdown.fee.affiliate_ads_commission_amount`          | `affiliate_ads_commission_amount`          |
| `fee_tax_breakdown.fee.sfp_service_fee_amount`                   | `sfp_service_fee_amount`                   |
| `fee_tax_breakdown.fee.live_specials_fee_amount`                 | `live_specials_fee_amount`                 |
| `fee_tax_breakdown.fee.bonus_cashback_service_fee_amount`        | `bonus_cashback_service_fee_amount`        |
| `fee_tax_breakdown.fee.mall_service_fee_amount`                  | `mall_service_fee_amount`                  |
| `fee_tax_breakdown.fee.voucher_xtra_service_fee_amount`          | `voucher_xtra_service_fee_amount`          |
| `fee_tax_breakdown.fee.flash_sales_service_fee_amount`           | `flash_sales_service_fee_amount`           |
| `fee_tax_breakdown.fee.cofunded_promotion_service_fee_amount`    | `cofunded_promotion_service_fee_amount`    |
| `fee_tax_breakdown.fee.pre_order_service_fee_amount`             | `pre_order_service_fee_amount`             |
| `fee_tax_breakdown.fee.tsp_commission_amount`                    | `tsp_commission_amount`                    |
| `fee_tax_breakdown.fee.dt_handling_fee_amount`                   | `dt_handling_fee_amount`                   |
| `fee_tax_breakdown.fee.epr_pob_service_fee_amount`               | `epr_pob_service_fee_amount`               |
| `fee_tax_breakdown.fee.fee_per_item_sold_amount`                 | `fee_per_item_sold_amount`                 |
| `fee_tax_breakdown.fee.seller_paylater_handling_fee_amount`      | `seller_paylater_handling_fee_amount`      |
| `fee_tax_breakdown.fee.cofunded_creator_bonus_amount`            | `cofunded_creator_bonus_amount`            |
| `fee_tax_breakdown.fee.dynamic_commission_amount`                | `dynamic_commission_amount`                |
| `fee_tax_breakdown.fee.external_affiliate_marketing_fee_amount`  | `external_affiliate_marketing_fee_amount`  |
| `fee_tax_breakdown.fee.vn_fix_infrastructure_fee`                | `vn_fix_infrastructure_fee`                |
| `fee_tax_breakdown.fee.affiliate_commission_deposit`             | `affiliate_commission_deposit`             |
| `fee_tax_breakdown.fee.affiliate_commission_release`             | `affiliate_commission_release`             |
| `fee_tax_breakdown.fee.tap_shop_ads_commission`                  | `tap_shop_ads_commission`                  |
| `fee_tax_breakdown.fee.shipping_fee_guarantee_service_fee`       | `shipping_fee_guarantee_service_fee`       |
| `fee_tax_breakdown.fee.installation_service_fee`                 | `installation_service_fee`                 |
| `fee_tax_breakdown.fee.campaign_resource_fee`                    | `campaign_resource_fee`                    |
| `fee_tax_breakdown.fee.platform_special_service_fee_amount`      | `platform_special_service_fee_amount`      |
| `fee_tax_breakdown.fee.smart_promotion_fee_amount`               | `smart_promotion_fee_amount`               |
| `fee_tax_breakdown.fee.gmv_max_ad_fee_amount`                    | `gmv_max_ad_fee_amount`                    |
| `fee_tax_breakdown.fee.platform_semi_managed_commission_fee`     | `platform_semi_managed_commission_fee`     |
| `fee_tax_breakdown.fee.platform_semi_managed_commission_fee_tax` | `platform_semi_managed_commission_fee_tax` |
| `fee_tax_breakdown.fee.campaign_period_fee_cfp_amount`           | `campaign_period_fee_cfp_amount`           |
| `fee_tax_breakdown.fee.campaign_period_fee_sp_amount`            | `campaign_period_fee_sp_amount`            |
| `fee_tax_breakdown.fee.campaign_period_fee_sp_tax_amount`        | `campaign_period_fee_sp_tax_amount`        |
| `fee_tax_breakdown.fee.campaign_period_fee_cfp_tax_amount`       | `campaign_period_fee_cfp_tax_amount`       |
| `fee_tax_breakdown.fee.seller_growth_fee_amount`                 | `seller_growth_fee_amount`                 |
| `fee_tax_breakdown.fee.category_led_campaign_fee_amount`         | `category_led_campaign_fee_amount`         |
| `fee_tax_breakdown.fee.category_led_campaign_fee_tax_amount`     | `category_led_campaign_fee_tax_amount`     |
| `fee_tax_breakdown.fee.brand_amplification_program_commission`   | `brand_amplification_program_commission`   |
| `fee_tax_breakdown.fee.brand_amplification_program_fee_tax`      | `brand_amplification_program_fee_tax`      |
| `fee_tax_breakdown.fee.brand_campaign_fee`                       | `brand_campaign_fee`                       |
| `fee_tax_breakdown.fee.brand_campaign_fee_tax`                   | `brand_campaign_fee_tax`                   |
| `fee_tax_breakdown.fee.failed_delivery_shipping_fee`             | `failed_delivery_shipping_fee`             |
| `fee_tax_breakdown.fee.buyer_fault_return_shipping_fee`          | `buyer_fault_return_shipping_fee`          |
| `fee_tax_breakdown.fee.insurance_fee`                            | `insurance_fee`                            |
| `fee_tax_breakdown.fee.gmv_max_coupon_fee`                       | `gmv_max_coupon_fee`                       |
| `fee_tax_breakdown.fee.cps_shop_ads_commission_tax_amount`       | `cps_shop_ads_commission_tax_amount`       |
| `fee_tax_breakdown.fee.shipping_insurance_fee_tax_amount`        | `shipping_insurance_fee_tax_amount`        |
| `fee_tax_breakdown.tax.vat_amount`                               | `vat_amount`                               |
| `fee_tax_breakdown.tax.import_vat_amount`                        | `import_vat_amount`                        |
| `fee_tax_breakdown.tax.customs_duty_amount`                      | `customs_duty_amount`                      |
| `fee_tax_breakdown.tax.customs_clearance_amount`                 | `customs_clearance_amount`                 |
| `fee_tax_breakdown.tax.sst_amount`                               | `sst_amount`                               |
| `fee_tax_breakdown.tax.gst_amount`                               | `gst_amount`                               |
| `fee_tax_breakdown.tax.iva_amount`                               | `iva_amount`                               |
| `fee_tax_breakdown.tax.isr_amount`                               | `isr_amount`                               |
| `fee_tax_breakdown.tax.anti_dumping_duty_amount`                 | `anti_dumping_duty_amount`                 |
| `fee_tax_breakdown.tax.local_vat_amount`                         | `local_vat_amount`                         |
| `fee_tax_breakdown.tax.pit_amount`                               | `pit_amount`                               |
| `fee_tax_breakdown.tax.sales_tax_referral_fee_amount`            | `sales_tax_referral_fee_amount`            |
| `fee_tax_breakdown.tax.smart_promotion_fee_tax_amount`           | `smart_promotion_fee_tax_amount`           |
| `fee_tax_breakdown.tax.cedular_tax`                              | `cedular_tax`                              |
| MD5(shop\_id + order\_id + `statement_id` + `sku_id`)            | `__sync_key`                               |

#### Non-order tables

In addition to the order tables above, the extractor creates the following tables for products, promotions, and shop analytics. Each is detailed below.

| Table                                                     | Endpoint                                                       | Description                                   |
| --------------------------------------------------------- | -------------------------------------------------------------- | --------------------------------------------- |
| `tiktok_shop.products`                                    | `POST /product/202502/products/search`                         | Product catalog                               |
| `tiktok_shop.product_skus`                                | `POST /product/202502/products/search`                         | SKU-level product data                        |
| `tiktok_shop.product_sku_inventory`                       | `POST /product/202502/products/search`                         | SKU inventory                                 |
| `tiktok_shop.product_sku_fees`                            | `POST /product/202502/products/search`                         | SKU-level fees                                |
| `tiktok_shop.product_family_products`                     | `POST /product/202502/products/search`                         | Product family relationships                  |
| `tiktok_shop.coupons`                                     | `POST /promotion/202406/coupons/search`                        | Coupon records                                |
| `tiktok_shop.activities`                                  | `POST /promotion/202309/activities/search`                     | Promotional activity records                  |
| `tiktok_shop.activity_bmsm_discount_details`              | `POST /promotion/202309/activities/search`                     | "Buy more, save more" discount detail         |
| `tiktok_shop.shop_performance`                            | `GET /analytics/202509/shop/performance`                       | Shop-level performance analytics              |
| `tiktok_shop.shop_performance_gmv_breakdowns`             | `GET /analytics/202509/shop/performance`                       | Shop performance broken down by GMV           |
| `tiktok_shop.shop_performance_gross_revenue_breakdowns`   | `GET /analytics/202509/shop/performance`                       | Shop performance broken down by gross revenue |
| `tiktok_shop.shop_product_performance`                    | `GET /analytics/202509/shop_products/{product_id}/performance` | Product-level performance analytics           |
| `tiktok_shop.shop_product_performance_sales_breakdowns`   | `GET /analytics/202509/shop_products/{product_id}/performance` | Product performance broken down by sales      |
| `tiktok_shop.shop_product_performance_traffic_breakdowns` | `GET /analytics/202509/shop_products/{product_id}/performance` | Product performance broken down by traffic    |

#### Products

* Endpoint: `POST /product/202502/products/search`
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.products`]

Source: `products[]`.

| JSON Element                                | Database Column                |
| ------------------------------------------- | ------------------------------ |
| `id`                                        | `id`                           |
| `title`                                     | `title`                        |
| `status`                                    | `status`                       |
| `create_time`                               | `create_time`                  |
| `update_time`                               | `update_time`                  |
| `is_not_for_sale`                           | `is_not_for_sale`              |
| `listing_quality_tier`                      | `listing_quality_tier`         |
| `audit.status`                              | `audit_status`                 |
| `audit.pre_approved_reasons` (JSON array)   | `audit_pre_approved_reasons`   |
| `has_draft`                                 | `has_draft`                    |
| `sales_regions` (JSON array)                | `sales_regions`                |
| `product_sync_fail_reasons` (JSON array)    | `product_sync_fail_reasons`    |
| `recommended_categories` (JSON array)       | `recommended_categories`       |
| `integrated_platform_statuses` (JSON array) | `integrated_platform_statuses` |
| MD5(shop\_id + `id`)                        | `__sync_key`                   |

#### Product Family Products

* Source: `products[].product_families[]` in the Products response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.product_family_products`]

| JSON Element                        | Database Column     |
| ----------------------------------- | ------------------- |
| `id`                                | `product_family_id` |
| parent `products[].id`              | `product_id`        |
| MD5(shop\_id + product `id` + `id`) | `__sync_key`        |

#### Product SKUs

* Source: `products[].skus[]` in the Products response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.product_skus`]

| JSON Element                                       | Database Column                                    |
| -------------------------------------------------- | -------------------------------------------------- |
| `id`                                               | `id`                                               |
| parent `products[].id`                             | `product_id`                                       |
| `seller_sku`                                       | `seller_sku`                                       |
| `price.currency`                                   | `price_currency`                                   |
| `price.tax_exclusive_price`                        | `price_tax_exclusive_price`                        |
| `price.sale_price`                                 | `price_sale_price`                                 |
| `list_price.amount`                                | `list_price_amount`                                |
| `list_price.currency`                              | `list_price_currency`                              |
| `external_list_prices` (JSON array)                | `external_list_prices`                             |
| `pre_sale.type`                                    | `pre_sale_type`                                    |
| `pre_sale.fulfillment_type.handling_duration_days` | `pre_sale_fulfillment_type_handling_duration_days` |
| `pre_sale.fulfillment_type.release_date`           | `pre_sale_fulfillment_type_release_date`           |
| `status_info.status`                               | `status_info_status`                               |
| `status_info.deactivation_source`                  | `status_info_deactivation_source`                  |
| MD5(shop\_id + product `id` + `id`)                | `__sync_key`                                       |

#### Product SKU Inventory

* Source: `products[].skus[].inventory[]` in the Products response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.product_sku_inventory`]

| JSON Element                                             | Database Column      |
| -------------------------------------------------------- | -------------------- |
| parent `products[].id`                                   | `product_id`         |
| parent `skus[].id`                                       | `sku_id`             |
| `warehouse_id`                                           | `warehouse_id`       |
| `quantity`                                               | `quantity`           |
| `backorder_quantity`                                     | `backorder_quantity` |
| `handling_time`                                          | `handling_time`      |
| MD5(shop\_id + product `id` + SKU `id` + `warehouse_id`) | `__sync_key`         |

#### Product SKU Fees

* Source: `products[].skus[].fees[]` in the Products response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.product_sku_fees`]

| JSON Element                                     | Database Column        |
| ------------------------------------------------ | ---------------------- |
| parent `products[].id`                           | `product_id`           |
| parent `skus[].id`                               | `sku_id`               |
| `type`                                           | `type`                 |
| `amount`                                         | `amount`               |
| `additional_attribute`                           | `additional_attribute` |
| MD5(shop\_id + product `id` + SKU `id` + `type`) | `__sync_key`           |

#### Coupons

* Endpoint: `POST /promotion/202406/coupons/search`
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.coupons`]

Source: `coupons[]`.

| JSON Element                            | Database Column                         |
| --------------------------------------- | --------------------------------------- |
| `id`                                    | `id`                                    |
| `title`                                 | `title`                                 |
| `display_type`                          | `display_type`                          |
| `status`                                | `status`                                |
| `create_time`                           | `create_time`                           |
| `update_time`                           | `update_time`                           |
| `claim_duration.start_time`             | `claim_duration_start_time`             |
| `claim_duration.end_time`               | `claim_duration_end_time`               |
| `redemption_duration.type`              | `redemption_duration_type`              |
| `redemption_duration.start_time`        | `redemption_duration_start_time`        |
| `redemption_duration.end_time`          | `redemption_duration_end_time`          |
| `redemption_duration.relative_time`     | `redemption_duration_relative_time`     |
| `promo_code`                            | `promo_code`                            |
| `target_buyer_segment`                  | `target_buyer_segment`                  |
| `usage_limits.single_buyer_claim_limit` | `usage_limits_single_buyer_claim_limit` |
| `usage_limits.total_claim_limit`        | `usage_limits_total_claim_limit`        |
| `usage_limits.redemption_limit`         | `usage_limits_redemption_limit`         |
| `discount.type`                         | `discount_type`                         |
| `discount.reduction_amount.amount`      | `discount_reduction_amount_amount`      |
| `discount.reduction_amount.currency`    | `discount_reduction_amount_currency`    |
| `discount.percentage`                   | `discount_percentage`                   |
| `discount.max_discount.amount`          | `discount_max_discount_amount`          |
| `discount.max_discount.currency`        | `discount_max_discount_currency`        |
| `threshold.type`                        | `threshold_type`                        |
| `threshold.min_spend.amount`            | `threshold_min_spend_amount`            |
| `threshold.min_spend.currency`          | `threshold_min_spend_currency`          |
| `product_scope`                         | `product_scope`                         |
| `creation_source`                       | `creation_source`                       |
| MD5(shop\_id + `id`)                    | `__sync_key`                            |

#### Activities

* Endpoint: `POST /promotion/202309/activities/search`
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.activities`]

Source: `activities[]`. Note: `participation_limit` is currently filled from `activity_commands`, not from the API's `participation_limit` field.

| JSON Element                                           | Database Column                                        |
| ------------------------------------------------------ | ------------------------------------------------------ |
| `id`                                                   | `id`                                                   |
| `title`                                                | `title`                                                |
| `activity_type`                                        | `activity_type`                                        |
| `duration_type`                                        | `duration_type`                                        |
| `begin_time`                                           | `begin_time`                                           |
| `end_time`                                             | `end_time`                                             |
| `status`                                               | `status`                                               |
| `create_time`                                          | `create_time`                                          |
| `update_time`                                          | `update_time`                                          |
| `product_level`                                        | `product_level`                                        |
| `activity_commands`                                    | `activity_commands`                                    |
| `activity_commands` (JSON array)                       | `participation_limit`                                  |
| `discount.shipping_discount.threshold_type`            | `discount_shipping_discount_threshold_type`            |
| `discount.shipping_discount.threshold_value`           | `discount_shipping_discount_threshold_value`           |
| `discount.shipping_discount.type`                      | `discount_shipping_discount_type`                      |
| `discount.shipping_discount.value`                     | `discount_shipping_discount_value`                     |
| `discount.shipping_discount.shipping_method`           | `discount_shipping_discount_shipping_method`           |
| `discount.shipping_discount.inventory_type`            | `discount_shipping_discount_inventory_type`            |
| `discount.shipping_discount.area_scope.type`           | `discount_shipping_discount_area_scope_type`           |
| `discount.shipping_discount.area_scope.specific_areas` | `discount_shipping_discount_area_scope_specific_areas` |
| `discount.gift_discount.gift_receiving_type`           | `discount_gift_discount_gift_receiving_type`           |
| `discount.gift_discount.gift_infos` (JSON array)       | `discount_gift_discount_gift_infos`                    |
| MD5(shop\_id + `id`)                                   | `__sync_key`                                           |

#### Activity BMSM Discount Details

* Source: `activities[].discount.bmsm_discount.details[]` in the Activities response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.activity_bmsm_discount_details`]

"Buy more, save more" discount tiers.

| JSON Element                           | Database Column   |
| -------------------------------------- | ----------------- |
| parent `activities[].id`               | `activity_id`     |
| `tier`                                 | `tier`            |
| `threshold_type`                       | `threshold_type`  |
| `threshold_value`                      | `threshold_value` |
| `type`                                 | `type`            |
| `value`                                | `value`           |
| MD5(shop\_id + activity `id` + `tier`) | `__sync_key`      |

#### Shop Performance

* Endpoint: `GET /analytics/202509/shop/performance`
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.shop_performance`]

Source: `performance.intervals[]`.

| JSON Element                              | Database Column                        |
| ----------------------------------------- | -------------------------------------- |
| `start_date`                              | `start_date`                           |
| `end_date`                                | `end_date`                             |
| `sales.gmv.overall.amount`                | `sales_gmv_overall_amount`             |
| `sales.gmv.overall.currency`              | `sales_gmv_overall_currency`           |
| `sales.gross_revenue.overall.amount`      | `sales_gross_revenue_overall_amount`   |
| `sales.gross_revenue.overall.currency`    | `sales_gross_revenue_overall_currency` |
| `sales.items_sold`                        | `sales_items_sold`                     |
| `sales.sku_orders_count`                  | `sales_sku_orders_count`               |
| `sales.orders_count`                      | `sales_orders_count`                   |
| `sales.avg_customers_count`               | `sales_avg_customers_count`            |
| `sales.refunds.amount`                    | `sales_refunds_amount`                 |
| `sales.refunds.currency`                  | `sales_refunds_currency`               |
| `traffic.avg_page_views`                  | `traffic_avg_page_views`               |
| `traffic.avg_visitors`                    | `traffic_avg_visitors`                 |
| `traffic.avg_conversation_rate`           | `traffic_avg_conversation_rate`        |
| MD5(shop\_id + `start_date` + `end_date`) | `__sync_key`                           |

#### Shop Performance GMV Breakdowns

* Source: `performance.intervals[].sales.gmv.breakdowns[]` in the Shop Performance response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.shop_performance_gmv_breakdowns`]

| JSON Element                                       | Database Column |
| -------------------------------------------------- | --------------- |
| parent interval `start_date`                       | `start_date`    |
| parent interval `end_date`                         | `end_date`      |
| `gmv.amount`                                       | `gmv_amount`    |
| `gmv.currency`                                     | `gmv_currency`  |
| `type`                                             | `type`          |
| MD5(shop\_id + `start_date` + `end_date` + `type`) | `__sync_key`    |

#### Shop Performance Gross Revenue Breakdowns

* Source: `performance.intervals[].sales.gross_revenue.breakdowns[]` in the Shop Performance response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.shop_performance_gross_revenue_breakdowns`]

| JSON Element                                       | Database Column |
| -------------------------------------------------- | --------------- |
| parent interval `start_date`                       | `start_date`    |
| parent interval `end_date`                         | `end_date`      |
| `percentage`                                       | `percentage`    |
| `type`                                             | `type`          |
| MD5(shop\_id + `start_date` + `end_date` + `type`) | `__sync_key`    |

#### Shop Product Performance

* Endpoint: `GET /analytics/202509/shop_products/{product_id}/performance`
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.shop_product_performance`]

Fetched per product as a child of the Products sync. Source: `performance.intervals[]`.

| JSON Element                                           | Database Column                   |
| ------------------------------------------------------ | --------------------------------- |
| product id (from job context)                          | `product_id`                      |
| `start_date`                                           | `start_date`                      |
| `end_date`                                             | `end_date`                        |
| `sales.gmv.amount`                                     | `sales_gmv_amount`                |
| `sales.gmv.currency`                                   | `sales_gmv_currency`              |
| `sales.orders`                                         | `sales_orders`                    |
| `sales.items_sold`                                     | `sales_items_sold`                |
| `cancel_and_refunds.returned`                          | `cancel_and_refunds_returned`     |
| `cancel_and_refunds.canceled`                          | `cancel_and_refunds_canceled`     |
| `cancel_and_refunds.refunded`                          | `cancel_and_refunds_refunded`     |
| `cancel_and_refunds.replacements`                      | `cancel_and_refunds_replacements` |
| MD5(shop\_id + product id + `start_date` + `end_date`) | `__sync_key`                      |

#### Shop Product Performance Sales Breakdowns

* Source: `performance.intervals[].sales.breakdowns[]` in the Shop Product Performance response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.shop_product_performance_sales_breakdowns`]

| JSON Element                                                            | Database Column       |
| ----------------------------------------------------------------------- | --------------------- |
| product id (from job context)                                           | `product_id`          |
| parent interval `start_date`                                            | `start_date`          |
| parent interval `end_date`                                              | `end_date`            |
| `content_type`                                                          | `content_type`        |
| `sales.gmv.amount`                                                      | `sales_gmv_amount`    |
| `sales.gmv.currency`                                                    | `sales_gmv_currency`  |
| `sales.items_sold`                                                      | `sales_items_sold`    |
| `sales.avg_customers`                                                   | `sales_avg_customers` |
| MD5(shop\_id + product id + `start_date` + `end_date` + `content_type`) | `__sync_key`          |

#### Shop Product Performance Traffic Breakdowns

* Source: `performance.intervals[].traffic.breakdowns[]` in the Shop Product Performance response
* Update Method: UPSERT
* Table Name: \[`tiktok_shop.shop_product_performance_traffic_breakdowns`]

| JSON Element                                                            | Database Column                 |
| ----------------------------------------------------------------------- | ------------------------------- |
| product id (from job context)                                           | `product_id`                    |
| parent interval `start_date`                                            | `start_date`                    |
| parent interval `end_date`                                              | `end_date`                      |
| `content_type`                                                          | `content_type`                  |
| `traffic.impressions`                                                   | `traffic_impressions`           |
| `traffic.page_views`                                                    | `traffic_page_views`            |
| `traffic.avg_unique_page_views`                                         | `traffic_avg_unique_page_views` |
| `traffic.ctr`                                                           | `traffic_ctr`                   |
| `traffic.avg_conversion_rate`                                           | `traffic_avg_conversion_rate`   |
| MD5(shop\_id + product id + `start_date` + `end_date` + `content_type`) | `__sync_key`                    |
