> For the complete documentation index, see [llms.txt](https://docs.tip4serv.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tip4serv.com/webhooks-developers-only/webhook-data-structure.md).

# Webhook Data Structure

When your webhook receives a payment or subscription event, a JSON payload is sent.

## Payment success webhook payload

The `payment.success` webhook tells your integration that a customer has completed a purchase. This page explains the fields in its payload, including customer identifiers, purchased products, and commands configured for your integration.

### Example payload

```json
{
  "event": "payment.success",
  "created_at": "2026-09-29T13:00:54.000Z",
  "request_id": "e74d0cfe-acb0b0cb-224491e6-09c3b468",
  "webhook_id": 1,
  "integration_key": "partner-19560-f7e214b2dfb2a9n1", // For Partner integration only
  "store_id": 31,
  "mode": "test",
  "data": {
    "id": 1085674, // Tip4Serv payment or subscription record ID
    "type": 1, // 1 for a payment or 2 for a subscription.
    "gateway": "none",
    "amount": {
      "total_paid": 9.89,
      "currency": "EUR"
    },
    "user": {
      "email": "example@gmail.com",
      "username": "Murga",
      "steam_id": "76561198030562985",
      "steam_username": "Murg@ Tor",
      "minecraft_uuid": "87ac351717f74762bfcaeff0ddd1a9bd",
      "minecraft_username": "Murga",
      "eosid": "84535555555555555555555555555555",
      "discord_id": "376441921087995906",
      "discord_username": "Murga"
    },
    "basket": [
      {
        "id": "104",
        "sub_key": "31t9xjmv",
        "name": "Test Minecraft",
        "price": "8.99",
        "quantity": "1",
        "custom_fields": {
          "1": {
            "field_id": 1,
            "name": "My New Field",
            "value": {
              "option_id": "1",
              "name": "test1",
              "value": "test1",
              "price": 0.9
            },
            "total_price": 0.9,
            "type": "selection",
            "marker": "test",
            "if_not_filled": "do_not_execute"
          }
        }
      }
    ],
    "actions": [
      {
        "server_id": "29940",
        "commands": [
          {
            "str": "give {custom:test} {discord_id} ok",
            "event": "0", // 0 = Execute, 1 = Player must be online)
            "product_id": "104",
            "item_key": 0,
            "command_id": "0"
          }
        ]
      }
    ],
    "identifiers": [
      {
        "source": "seller",
        "field_id": 3481,
        "identifier_name": "purchase_code",
        "identifier_label": "Purchase Code",
        "identifier_value": "5456GF",
        "typed_value": "purchase_code:5456GF"
      }
    ]
  }
}
```

{% hint style="info" %}
The example shows a test payment. Values and available fields can vary between purchases. In particular, some IDs, prices, and quantities may arrive as strings.
{% endhint %}

### Main fields

| Field             | Meaning                                                                                                                                                                                                                                                                                                                                                                                                           |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `event`           | The webhook event. This example uses `payment.success`. Here is the events list: <https://docs.tip4serv.com/webhooks-developers-only/how-do-webhooks-work#example-events>                                                                                                                                                                                                                                         |
| `created_at`      | When the event was created, in ISO 8601 format.                                                                                                                                                                                                                                                                                                                                                                   |
| `request_id`      | Identifier for this webhook event. The `request_id` remains the same across all retry attempts for that event, so you can use it as an idempotency key to prevent processing the same delivery more than once. A new event for the same payment receives a different `request_id`. For example, a renewal, expiration, refund, or seller-initiated resend is treated as a new event and has its own `request_id`. |
| `webhook_id`      | ID of the webhook configuration that received the event.                                                                                                                                                                                                                                                                                                                                                          |
| `integration_key` | `integration_key` identifies the [partner integration](https://tip4serv.gitbook.io/tip4serv-api/partner-connect/configure-your-integration) associated with the webhook if applicable.                                                                                                                                                                                                                            |
| `store_id`        | ID of the store where the purchase was made.                                                                                                                                                                                                                                                                                                                                                                      |
| `mode`            | `live` for a real purchase or `test` for a test event.                                                                                                                                                                                                                                                                                                                                                            |
| `data`            | Details of the payment, customer, products, actions, and identifiers.                                                                                                                                                                                                                                                                                                                                             |

### `data` object

| Field               | Meaning                                                                                                  |
| ------------------- | -------------------------------------------------------------------------------------------------------- |
| `id`                | Tip4Serv payment or subscription record ID. Use together with data.type to uniquely identify the record. |
| `type`              | `1` for a payment or `2` for a subscription.                                                             |
| `transaction_id`    | It is the PayPal or Stripe transaction ID. Unavailable for bypass and test payment.                      |
| `gateway`           | Payment gateway used. Examples include `stripe`, `paypal`, `free`, and `none`.                           |
| `amount.total_paid` | Total amount paid in the indicated currency.                                                             |
| `amount.currency`   | Currency code, such as `EUR` or `USD`.                                                                   |
| `user`              | Customer details and standard account identifiers.                                                       |
| `basket`            | Products included in the purchase.                                                                       |
| `actions`           | Commands configured for Custom or Partner Integrations.                                                  |
| `identifiers`       | Additional custom identifiers collected for this purchase.                                               |

### `user` object

The `user` object contains the customer’s standard details and linked identities:

| Field                                  | Meaning                                   |
| -------------------------------------- | ----------------------------------------- |
| `email`                                | Customer email address.                   |
| `username`                             | Customer display name.                    |
| `steam_id`, `steam_username`           | Steam identity.                           |
| `minecraft_uuid`, `minecraft_username` | Minecraft identity.                       |
| `eosid`                                | ARK: Survival Ascended identifier.        |
| `fivem_citizen_id`                     | FiveM citizen identifier, when collected. |
| `discord_id`, `discord_username`       | Discord identity.                         |

Some fields may be absent if they were not collected or the customer did not link that service.

### `basket` array

Each entry in `basket` represents a purchased product.

| Field           | Meaning                                                                    |
| --------------- | -------------------------------------------------------------------------- |
| `id`            | Product ID.                                                                |
| `sub_key`       | Identifier for this basket entry.                                          |
| `name`          | Product name.                                                              |
| `price`         | Product price in the purchase currency.                                    |
| `quantity`      | Quantity purchased.                                                        |
| `custom_fields` | Customer selections or values collected for this product, when configured. |

A `custom_fields` entry can include the field’s name and ID, its selected `value`, any additional price, its `type`, and a `marker` used by configured commands. For example, a command containing `{custom:test}` refers to a custom field with the marker `test`.

### `actions` array

The `actions` array lists the commands configured for the current webhook event on servers associated with products in the customer’s basket. It includes servers with matching commands configured in the product editor for **Custom Integrations** or **Partner Integrations** added through **My Servers**.

Each action contains a `server_id` and a `commands` array. Each command includes a `command_id`, `str` (the command text), and `product_id`. Additional fields, such as `event` and `item_key`, may also be present.

The worker generates `command_id` as a string containing the command’s zero-based index in its configured list. Use that same value to identify the command when returning per-command results.

| Field       | Meaning                                       |
| ----------- | --------------------------------------------- |
| `server_id` | Server ID.                                    |
| `commands`  | Array of commands to process for this server. |

Each entry in `commands` represents a configured command.

| Field        | Meaning                                                                                                                                |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------- |
| `command_id` | Command’s zero-based index in its configured list, represented as a string. Return this same value when providing per-command results. |
| `str`        | Command text.                                                                                                                          |
| `product_id` | Product ID associated with the command.                                                                                                |
| `event`      | Execution mode, when present: `0` = Execute; `1` = Player must be online.                                                              |
| `item_key`   | Identifier of the associated basket entry, when present.                                                                               |

```json
"actions": [
  {
    "server_id": "29940",
    "commands": [
      {
        "command_id": "0",
        "str": "give {custom:test} {discord_id} ok",
        "event": "0", // 0 = Execute, 1 = Player must be online)
        "product_id": "104",
        "item_key": 0
      }
    ]
  }
]
```

{% hint style="info" %}
Commands for Tip4Serv’s built-in game integrations, such as Minecraft, Rust, and ARK, do not appear here. Tip4Serv handles those directly through RCON or the plugin installed on the game server.
{% endhint %}

### `identifiers` array

The `identifiers` array contains **additional custom identifiers** collected for the purchase. These identifiers were configured either by the seller from the [cart fields panel](https://tip4serv.com/dashboard/custom-fields) or by the integration partner. These are separate from the standard Steam, Minecraft, Discord, and other identities in `user`.

Each entry describes one identifier:

| Field              | Meaning                                                                                                                                                                                                                                                                                                             |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `source`           | Where the identifier came from. In the example, `seller` means it was configured by the seller from [cart fields](https://tip4serv.com/dashboard/custom-fields). `partner` means it was configured by a [partner integration](https://tip4serv.gitbook.io/tip4serv-api/partner-connect/configure-your-integration). |
| `field_id`         | ID of the field used to collect it.                                                                                                                                                                                                                                                                                 |
| `identifier_name`  | Machine-readable name, such as `purchase_code`.                                                                                                                                                                                                                                                                     |
| `identifier_label` | Label shown for the field, such as `Purchase Code`.                                                                                                                                                                                                                                                                 |
| `identifier_value` | The value provided for this purchase.                                                                                                                                                                                                                                                                               |
| `typed_value`      | The identifier name and value together, such as `purchase_code:5456GF`.                                                                                                                                                                                                                                             |
