Webhooks

Webhooks notify your integration when important reseller account events happen.

Setting Up Webhooks

Configure webhook endpoints in Settings > Webhooks. Use HTTPS, select the events to receive, and set a signing secret when possible.

Webhook Payload

{
  "id": "evt_abc123",
  "type": "company.created",
  "created_at": "2026-01-25T10:30:00Z",
  "data": {}
}

Verifying Webhooks

Each request includes an X-Webhook-Signature header. Compute an HMAC SHA-256 signature with your webhook secret and compare it with a timing-safe check.

$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'];
$secret = 'your_webhook_secret';

$expected = hash_hmac('sha256', $payload, $secret);

if (! hash_equals($expected, $signature)) {
    http_response_code(401);
    exit;
}

Available Events

EventDescription
company.createdA new company was created.
company.updatedCompany details changed.
company.suspendedA company was suspended.
company.deletedA company was deleted.
user.createdA new user was created.
user.updatedUser details changed.
user.deletedA user was deleted.
training.assignedTraining was assigned to users.
training.completedA user completed training.
training.overdueA training assignment became overdue.
seats.limit_reachedA company reached its hard seat limit.
seats.limit_exceededA company exceeded its soft seat limit.
seats.pool_lowThe reseller seat pool dropped below 20%.

Retry Policy

  • 1st retry: 1 minute after the initial attempt.
  • 2nd retry: 5 minutes after the 1st retry.
  • 3rd retry: 30 minutes after the 2nd retry.
  • 4th retry: 2 hours after the 3rd retry.
  • 5th retry: 24 hours after the 4th retry.

After five failed attempts, the webhook is marked as failed and no more automatic retries are attempted.

Best Practices

  • Return a 2xx response within 30 seconds.
  • Process heavy work asynchronously.
  • Use the event ID to prevent duplicate processing.
  • Always verify the webhook signature.
  • Use HTTPS for every endpoint.