Billing/Webhooks

Webhook Security, Event Types, & Best Practices

Webhook Signature Verification

To ensure authenticity, Acta signs every webhook request using HMAC-SHA256. You must verify this signature to confirm that the payload came from Acta and wasn't tampered with.

Headers in Every Webhook Request:

HeaderDescription
x-actalink-signatureFinal HMAC-SHA256 signature of the timestamp and payload
x-actalink-timestampUnix timestamp (in milliseconds) used in the signature

How to Verify the Webhook Signature:

Extract the following from the request

  • x-actalink-signature header (Acta's signature)
  • x-actalink-timestamp header (timestamp used during signing)
  • Raw JSON request body (exactly as received, not parsed)

Recompute the signature

  • Wrap the raw payload in an object.
  • Serialize it with JSON.stringify() (no added whitespace).
  • Compute HMAC-SHA256 of the stringified wrapper using your webhook secret.
  • Concatenate the timestamp + "." + that hash.
  • Compute HMAC-SHA256 of that final string.

Compare your computed signature with the one from x-actalink-signature.

Optionally, reject the webhook if the timestamp is too old (e.g. older than 5 minutes) to prevent replay attacks.

Node.js Example

const crypto = require("crypto");
 
function verifyWebhookSignature({
  rawBody,
  timestamp,
  receivedSignature,
  secret,
}) {
  const payload = JSON.parse(rawBody);
 
  const wrapped = JSON.stringify({ payload });
 
  const intermediateSig = crypto
    .createHmac("sha256", secret)
    .update(wrapped)
    .digest("hex");
 
  const finalSig = crypto
    .createHmac("sha256", secret)
    .update(`${timestamp}.${intermediateSig}`)
    .digest("hex");
 
  return crypto.timingSafeEqual(
    Buffer.from(finalSig),
    Buffer.from(receivedSignature)
  );
}
 
const rawBody = JSON.stringify({
  id: "58448504-b758-4586-a6da-d8f1cb3eef99",
  eventType: "subscription.billing.scheduled",
  eventData: {
    data: {
      id: "sub_7M9lH66tShtMfLtDyz38WCuoWCuJnBt7",
      token: {
        name: "USD Coin",
        amount: "0x249f0",
        symbol: "USDC",
        address: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        chainId: 137,
        fiatISO: "USD",
        logoURI: "https://api.acta.link/deposit/v1/logos/usdc.png",
        decimals: 6,
        logoSourceURI: "https://api.acta.link/deposit/v1/logos/usdc.png",
      },
      status: "ONGOING",
      chainId: 137,
      network: {
        name: "Polygon",
        chainId: 137,
      },
      currency: "USDC",
      startedAt: "2025-08-29T15:15:22.000Z",
      transaction: null,
      feeInclusive: false,
      intervalUnit: "5mins",
      tokenAddress: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      intervalCount: 2,
      senderAddress: "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      nextExecutionAt: "2025-08-29T15:15:22.000Z",
      receiverAddress: "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
      latestIntervalCount: 0,
    },
    plan: {
      id: "prod_jy7Z3JdTuTf1uBqhFFl7x23AdoPJjIRX",
      name: "Hooi Nucleus",
      price: {
        id: "price_kBN95XmlS6kUCNJu98ZpAoc4WT6UX3A2",
        price: "0.15",
        currency: "USDC",
        currencyType: "crypto",
        intervalUnit: "5mins",
        intervalCount: 2,
      },
      status: "ACTIVE",
      imageUrl: "",
      description: "Monthly subscription for Hooli Nucleus",
      paymentType: "recurring",
    },
    type: "subscription",
    orderId: "ord_7NcE60Ug3muZXHkVkaOefvf4pRYO1I3i",
    paylink: {
      id: "paylink_xsOVX8sNubCCpPSsmMlmy7llRAkhHyvM",
      name: "Hooli Nucleus Subscription",
      status: "active",
      paylinkType: "subscription",
    },
    metadata: null,
    orderStatus: "ONGOING",
    organisationId: "SwHuo5b9UCc43wFCphlC0uQCkQQVvcga",
  },
  createdAt: "2025-08-29T15:15:35.830Z",
});
 
const timestamp = 1755354122183; // x-actalink-timestamp
const receivedSignature =
  "e5d8cf0d6cd3294adec97c1eaa2cfa42a5d3e6a9f421530d231bdf57a56222af"; // x-actalink-signature
const secret = "..."; // from Acta HUB dashboard
 
const result = verifyWebhookSignature({
  rawBody,
  timestamp,
  receivedSignature,
  secret,
});
 
if (result) {
  console.log("✅  Signature is valid");
} else {
  console.log("❌ Signature is invalid");
}

Webhook Event Types

Acta Deposit supports the following webhook event types:

single.billing.executed

{
  "id": "451551f7-ce83-4be7-a604-d707e16d087b",
  "eventType": "single.billing.executed",
  "eventData": {
    "data": {
      "id": "txn_usCdyV5ULMZWkM02xOLlyFo2pG2ULYor",
      "token": {
        "name": "USD Coin",
        "amount": "0x1fbd0",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "status": "EXECUTED",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "currency": "USDC",
      "transaction": {
        "id": "txn_usCdyV5ULMZWkM02xOLlyFo2pG2ULYor",
        "fee": "0x2f6f9",
        "hash": "0x08d3fb1658a0bda3258d46435f8591b5e87d53e852f9e56ace7285bac8a6121f",
        "amount": "0x1fbd0",
        "status": "EXECUTED",
        "chainId": 137,
        "paylinkId": "paylink_eU6U4oJKxe5Xp3d2HgUpusQKB8S3W1gF",
        "executedAt": "2025-08-29T15:13:42.331Z",
        "executedBy": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
        "paymentType": "one-time",
        "feeInclusive": false,
        "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
        "organizationId": "SwHuo5b9UCc43wFCphlC0uQCkQQVvcga",
        "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB"
      },
      "feeInclusive": false,
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB"
    },
    "plan": {
      "id": "prod_wRhzJIwWHF48JOYF3sz4Thkw9e1EPGaF",
      "name": "Hooli Books",
      "price": {
        "id": "price_aLEXPNevr1F9jUpSPOC4GLp8IEk5QfAf",
        "price": "0.13",
        "currency": "USDC",
        "currencyType": "crypto"
      },
      "status": "ACTIVE",
      "imageUrl": "",
      "description": "E-Book service from Hooli",
      "paymentType": "one-time"
    },
    "type": "one-time",
    "orderId": "ord_zDGaEVSvOi2YXCH9iV6fBL3TBjDnTW4g",
    "paylink": {
      "id": "paylink_eU6U4oJKxe5Xp3d2HgUpusQKB8S3W1gF",
      "name": "Hooli E-book",
      "status": "active",
      "paylinkType": "one-time"
    },
    "metadata": null,
    "orderStatus": "PAID",
    "organisationId": "SwHuo5b9UCc43wFCphlC0uQCkQQVvcga"
  },
  "createdAt": "2025-08-29T15:13:42.292Z"
}

subscription.billing.executed

{
  "id": "eb64ad42-4441-480e-8b43-9728ea4ea0ac",
  "eventType": "subscription.billing.executed",
  "eventData": {
    "data": {
      "id": "sub_HtWZZszBtfCAjm0xuXYdpQu75tBHCLfA",
      "token": {
        "name": "USD Coin",
        "amount": "0x27100",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "status": "ONGOING",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "currency": "USDC",
      "startedAt": "2025-08-29T15:31:55.000Z",
      "transaction": {
        "id": "txn_vfeqOrURQWS7Gz0d0H0OnTk5W7WrWDSf",
        "fee": "0xe1069",
        "hash": "0xf84e499b6041ab5a95dee8716d2acade87692b88837133e9245697ad4d8f1ac4",
        "amount": "0x27100",
        "status": "EXECUTED",
        "chainId": 137,
        "paylinkId": "paylink_6LDiorrwRDii8aU2B7ueSRPGIFEby6cr",
        "executedAt": "2025-08-29T15:33:06.011Z",
        "executedBy": "0xFF01d8625923C382c4e6fb1307749f10c48908AF",
        "paymentType": "subscription",
        "feeInclusive": false,
        "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
        "organizationId": "SwHuo5b9UCc43wFCphlC0uQCkQQVvcga",
        "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB"
      },
      "feeInclusive": false,
      "intervalUnit": "5mins",
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "intervalCount": 3,
      "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      "nextExecutionAt": "2025-08-29T15:38:06.005Z",
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
      "effectedInterval": 1,
      "latestIntervalCount": 1
    },
    "plan": {
      "id": "prod_LEYeql9qO7yAAxXJSUynmzL1QXWuo2or",
      "name": "Recipe Pro",
      "price": {
        "id": "price_hi6umEpSzoaR8Qgn8ykcbUKD9zB2D8zN",
        "price": "0.16",
        "currency": "USDC",
        "currencyType": "crypto",
        "intervalUnit": "5mins",
        "intervalCount": 3
      },
      "status": "ACTIVE",
      "imageUrl": "",
      "description": "Pro plan for Recipe",
      "paymentType": "recurring"
    },
    "type": "subscription",
    "orderId": "ord_qtXiN0d4NGp5FGz8IdcFCrpqPPcriB8E",
    "paylink": {
      "id": "paylink_6LDiorrwRDii8aU2B7ueSRPGIFEby6cr",
      "name": "Recipe Pro",
      "status": "active",
      "paylinkType": "subscription"
    },
    "orderStatus": "ONGOING",
    "organisationId": "SwHuo5b9UCc43wFCphlC0uQCkQQVvcga"
  },
  "createdAt": "2025-08-29T15:33:17.090Z"
}

subscription.billing.failed

{
  "id": "e91848ca-cb47-46f3-86f1-86b47010d5e0",
  "eventType": "subscription.billing.failed",
  "eventData": {
    "toJSON": {
      "data": {
        "id": "sub_jeRBLFCOuK2jE8Q1209xnPh5g3ELmfnP",
        "token": {
          "name": "USD Coin",
          "amount": "3000000",
          "symbol": "USDC",
          "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
          "chainId": 137,
          "fiatISO": "USD",
          "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
          "decimals": 6,
          "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
        },
        "reason": "BALANCE",
        "status": "FAILED",
        "chainId": 137,
        "network": {
          "name": "Polygon",
          "chainId": 137
        },
        "attempts": 3,
        "currency": "USDC",
        "startedAt": "2025-07-27T15:46:00.000Z",
        "feeInclusive": true,
        "intervalUnit": "5mins",
        "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "intervalCount": 3,
        "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
        "nextExecutionAt": "2025-07-27T16:05:01.240Z",
        "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
        "effectedInterval": 3,
        "latestIntervalCount": 3
      },
      "type": "subscription",
      "orderId": "ord_qtXiN0d4NGp5FGz8IdcFCrpqPPcriB8E",
      "paylink": {
        "id": "paylink_6LDiorrwRDii8aU2B7ueSRPGIFEby6cr",
        "name": "Recipe Pro",
        "status": "active",
        "paylinkType": "subscription"
      },
      "orderStatus": "ONGOING",
      "plan": {
        "id": "prod_jy7Z3JdTuTf1uBqhFFl7x23AdoPJjIRX",
        "name": "Hooi Nucleus",
        "price": {
          "id": "price_kBN95XmlS6kUCNJu98ZpAoc4WT6UX3A2",
          "price": "0.15",
          "currency": "USDC",
          "currencyType": "crypto",
          "intervalUnit": "5mins",
          "intervalCount": 2
        }
      },
      "organisationId": "f6df600c-eb64-428c-bf58-4b969522572b"
    }
  },
  "createdAt": "2025-07-27T16:24:01.467Z"
}

subscription.billing.scheduled

{
  "id": "58448504-b758-4586-a6da-d8f1cb3eef99",
  "eventType": "subscription.billing.scheduled",
  "eventData": {
    "data": {
      "id": "sub_7M9lH66tShtMfLtDyz38WCuoWCuJnBt7",
      "token": {
        "name": "USD Coin",
        "amount": "0x249f0",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "status": "ONGOING",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "currency": "USDC",
      "startedAt": "2025-08-29T15:15:22.000Z",
      "transaction": null,
      "feeInclusive": false,
      "intervalUnit": "5mins",
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "intervalCount": 2,
      "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      "nextExecutionAt": "2025-08-29T15:15:22.000Z",
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
      "latestIntervalCount": 0
    },
    "plan": {
      "id": "prod_jy7Z3JdTuTf1uBqhFFl7x23AdoPJjIRX",
      "name": "Hooi Nucleus",
      "price": {
        "id": "price_kBN95XmlS6kUCNJu98ZpAoc4WT6UX3A2",
        "price": "0.15",
        "currency": "USDC",
        "currencyType": "crypto",
        "intervalUnit": "5mins",
        "intervalCount": 2
      },
      "status": "ACTIVE",
      "imageUrl": "",
      "description": "Monthly subscription for Hooli Nucleus",
      "paymentType": "recurring"
    },
    "type": "subscription",
    "orderId": "ord_7NcE60Ug3muZXHkVkaOefvf4pRYO1I3i",
    "paylink": {
      "id": "paylink_xsOVX8sNubCCpPSsmMlmy7llRAkhHyvM",
      "name": "Hooli Nucleus Subscription",
      "status": "active",
      "paylinkType": "subscription"
    },
    "metadata": null,
    "orderStatus": "ONGOING",
    "organisationId": "SwHuo5b9UCc43wFCphlC0uQCkQQVvcga"
  },
  "createdAt": "2025-08-29T15:15:35.830Z"
}

subscription.billing.completed

{
  "id": "cf8b4861-4411-4f54-89e8-c31447ceb7a9",
  "eventType": "subscription.billing.completed",
  "eventData": {
    "data": {
      "id": "sub_7M9lH66tShtMfLtDyz38WCuoWCuJnBt7",
      "token": {
        "name": "USD Coin",
        "amount": "0x249f0",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "status": "COMPLETED",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "currency": "USDC",
      "startedAt": "2025-08-29T15:15:22.000Z",
      "transaction": {
        "id": "txn_vAVKHctT5NWRgrhOI8yv8KdSbonsaAI2",
        "fee": "0x4aaa8",
        "hash": "0x56485d8331f8a6041e17eb6a0a52a3aac38b6d6ca5f916cecc9028eba43c6b77",
        "amount": "0x249f0",
        "status": "EXECUTED",
        "chainId": 137,
        "paylinkId": "paylink_xsOVX8sNubCCpPSsmMlmy7llRAkhHyvM",
        "executedAt": "2025-08-29T15:22:03.507Z",
        "executedBy": "0xFF01d8625923C382c4e6fb1307749f10c48908AF",
        "paymentType": "subscription",
        "feeInclusive": false,
        "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
        "organizationId": "SwHuo5b9UCc43wFCphlC0uQCkQQVvcga",
        "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB"
      },
      "feeInclusive": false,
      "intervalUnit": "5mins",
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "intervalCount": 2,
      "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      "nextExecutionAt": "2025-08-29T15:27:03.500Z",
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
      "effectedInterval": 2,
      "latestIntervalCount": 2
    },
    "plan": {
      "id": "prod_jy7Z3JdTuTf1uBqhFFl7x23AdoPJjIRX",
      "name": "Hooi Nucleus",
      "price": {
        "id": "price_kBN95XmlS6kUCNJu98ZpAoc4WT6UX3A2",
        "price": "0.15",
        "currency": "USDC",
        "currencyType": "crypto",
        "intervalUnit": "5mins",
        "intervalCount": 2
      },
      "status": "ACTIVE",
      "imageUrl": "",
      "description": "Monthly subscription for Hooli Nucleus",
      "paymentType": "recurring"
    },
    "type": "subscription",
    "orderId": "ord_7NcE60Ug3muZXHkVkaOefvf4pRYO1I3i",
    "paylink": {
      "id": "paylink_xsOVX8sNubCCpPSsmMlmy7llRAkhHyvM",
      "name": "Hooli Nucleus Subscription",
      "status": "active",
      "paylinkType": "subscription"
    },
    "orderStatus": "PAID",
    "organisationId": "SwHuo5b9UCc43wFCphlC0uQCkQQVvcga"
  },
  "createdAt": "2025-08-29T15:22:09.237Z"
}

subscription.billing.due

{
  "id": "c837a151-a962-44e0-b3e3-b4f61743d7bb",
  "eventType": "subscription.billing.due",
  "eventData": {
    "data": {
      "id": "sub_jeRBLFCOuK2jE8Q1209xnPh5g3ELmfnP",
      "token": {
        "name": "USD Coin",
        "amount": "0x249f0",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "reason": "BALANCE",
      "status": "DUE",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "attempts": 0,
      "currency": "USDC",
      "transaction": null,
      "feeInclusive": false,
      "intervalUnit": "5mins",
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "intervalCount": 2,
      "senderAddress": "0x061BA68bc8208F4AddBeE86F74F17D77129cCF70",
      "nextExecutionAt": "2025-08-16T14:27:02.098Z",
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
      "effectedInterval": 1,
      "expectedExecutionAt": "2025-08-16T14:20:55.000Z",
      "latestIntervalCount": 1
    },
    "type": "subscription",
    "orderId": "ord_7NcE60Ug3muZXHkVkaOefvf4pRYO1I3i",
    "paylink": {
      "id": "paylink_xsOVX8sNubCCpPSsmMlmy7llRAkhHyvM",
      "name": "Hooli Nucleus Subscription",
      "status": "active",
      "paylinkType": "subscription"
    },
    "orderStatus": "PAID",
    "plan": {
      "id": "prod_jy7Z3JdTuTf1uBqhFFl7x23AdoPJjIRX",
      "name": "Hooi Nucleus",
      "price": {
        "id": "price_kBN95XmlS6kUCNJu98ZpAoc4WT6UX3A2",
        "price": "0.15",
        "currency": "USDC",
        "currencyType": "crypto",
        "intervalUnit": "5mins",
        "intervalCount": 2
      }
    },
    "organisationId": "SwHuo5b9UCc43wFCphlC0uQCkQQVvcga"
  },
  "createdAt": "2025-08-16T14:22:02.125Z"
}

subscription.billing.cancelled

{
  "id": "d6fde329-a92a-46b4-8cf8-f795af3af7a3",
  "eventType": "subscription.billing.cancelled",
  "eventData": {
    "data": {
      "id": "sub_raaNHLEqQrxKqQpdhzrR6C4loVJbkEf8",
      "token": {
        "name": "USD Coin",
        "amount": "0x249f0",
        "symbol": "USDC",
        "address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
        "chainId": 137,
        "fiatISO": "USD",
        "logoURI": "https://api.acta.link/deposit/v1/logos/usdc.png",
        "decimals": 6,
        "logoSourceURI": "https://api.acta.link/deposit/v1/logos/usdc.png"
      },
      "status": "CANCELLED",
      "chainId": 137,
      "network": {
        "name": "Polygon",
        "chainId": 137
      },
      "currency": "USDC",
      "startedAt": "2025-09-09T19:33:57.000Z",
      "transaction": null,
      "feeInclusive": false,
      "intervalUnit": "5mins",
      "tokenAddress": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
      "intervalCount": 3,
      "senderAddress": "0x21DeFD66c4bf4e6639682BE9F5506a08bb204F27",
      "nextExecutionAt": null,
      "receiverAddress": "0xEBFa37194fA74bA3e8195446948FC3B9c72E08AB",
      "latestIntervalCount": 0
    },
    "plan": {
      "id": "prod_OWp0t5DubYF5be8h1IOXkqX4UxEBsZEn",
      "name": "Recipe Basic",
      "price": {
        "id": "price_cXAgf6A6zpkpVoIyoYGdtLfFZA6FRcaz",
        "price": "0.15",
        "currency": "USDC",
        "currencyType": "crypto",
        "intervalUnit": "5mins",
        "intervalCount": 3
      },
      "status": "ACTIVE",
      "imageUrl": "",
      "description": "Basic plan for Recipe",
      "paymentType": "recurring"
    },
    "type": "subscription",
    "orderId": "ord_13o6YnKPvZlWyNPTQ42OkmS89IduNn6k",
    "paylink": {
      "id": "paylink_0eBaSSNK7j3lEIUeZ16OPuB7v7KZee22",
      "name": "Recipe Basic",
      "status": "active",
      "paylinkType": "subscription"
    },
    "orderStatus": "CANCELLED",
    "organisationId": "SwHuo5b9UCc43wFCphlC0uQCkQQVvcga"
  },
  "createdAt": "2025-09-09T19:36:30.635Z"
}

Best Practices for Webhooks

Always verify the webhook signature to avoid spoofed requests.

Respond quickly with a 200 OK — don’t wait for downstream logic to finish.

Handle retries properly. If Acta doesn't receive a 2xx status, we retry using exponential backoff.

Retry Strategy

  • Max Attempts: 10
  • Initial Delay: 30 seconds
  • Backoff Strategy: Exponential (doubles every attempt)
  • No Delay Cap: Keeps doubling until final attempt
  • Total Retry Window: ~4h 16m

Retry schedule

AttemptDelay (s)Delay (min)Cumulative Time
1st300.50:00:30
2nd6010:01:30
3rd12020:03:30
4th24040:07:30
5th48080:15:30
6th960160:31:30
7th1920321:03:30
8th3840642:07:30
9th76801284:15:30
10th153602568:31:30

🔁 If all retries fail, the webhook is marked as unsuccessful.