Progress reached

Sent every time the student progress in a product reaches the percentage set in the webhook. Carries progress_percentage. The event is user.progress (usuario.progresso in payload version 1).

Example body

{
  "version": "2",
  "event": "user.progress",
  "event_id": "01K5QW7M2Z3Y4X5W6V7U8T9S0R",
  "payload": {
    "product": {
      "id": 311,
      "group": {
        "id": 0,
        "name": "string",
        "order": 0
      },
      "name": "Curso de Fotografia",
      "offer_url": "string",
      "order": 0
    },
    "progress_percentage": 62.5,
    "user": {
      "id": 1042,
      "access": {
        "first_at": {
          "iso": "2025-09-23T12:00:00-03:00",
          "unix": "1758639600"
        },
        "last_at": {
          "iso": "2025-09-23T12:00:00-03:00",
          "unix": "1758639600"
        }
      },
      "created": {
        "at": {
          "iso": "2025-09-23T12:00:00-03:00",
          "unix": "1758639600"
        },
        "by": 0,
        "by_key": 0,
        "method": "string",
        "on": "string"
      },
      "document": "string",
      "email": "[email protected]",
      "magic_login_url": "https://example.com",
      "name": "Maria Souza",
      "phone": "string"
    }
  }
}

Fields

FieldTypeRequiredDescription
versionstringyesAlways 2.
eventstringyesAlways user.progress.
event_idstringyesUnique id of the delivery (ULID). Retries of the same delivery keep it, so use it to ignore duplicates.
payloadobjectyes
payload.productobjectyesThe product (course) the event is about, with its group.
payload.product.idintegeryes
payload.product.groupobjectyesThe group (showcase) the product belongs to.
payload.product.group.idinteger | nullyes
payload.product.group.namestring | nullyes
payload.product.group.orderinteger | nullyes
payload.product.namestringyes
payload.product.offer_urlstring | nullyesSales page shown to students without access.
payload.product.orderinteger | nullyes
payload.progress_percentagenumbernoPresent only in user.progress: the student progress in the product, from 0 to 100.
payload.userobjectyesThe student the event is about.
payload.user.idintegeryes
payload.user.accessobjectyes
payload.user.access.first_atobject | nullyesFirst access; null before it happens.
payload.user.access.first_at.isostring | nullyes
payload.user.access.first_at.unixstring | nullyes
payload.user.access.last_atobject | nullyesLast access; null before the first one.
payload.user.access.last_at.isostring | nullyes
payload.user.access.last_at.unixstring | nullyes
payload.user.createdobjectyesHow the student was created. on is the origin (manual, transaction, import, free, redirect, google, api); the other keys depend on it and may be absent.
payload.user.created.atobject | nullyesA point in time, as Unix seconds (a string) and ISO 8601 with the offset. Both are null when there is no date.
payload.user.created.at.isostring | nullyes
payload.user.created.at.unixstring | nullyes
payload.user.created.byintegernoThe administrator who created the student.
payload.user.created.by_keyintegernoThe API key that created the student.
payload.user.created.methodstringno
payload.user.created.onstringno
payload.user.documentstring | nullyesDocument (CPF).
payload.user.emailstring | nullyes
payload.user.magic_login_urlstringyesLink that signs the student in when opened. Treat it as a password.
payload.user.namestring | nullyes
payload.user.phonestring | nullyesMobile phone.

Your endpoint answers with any 2xx status to confirm the delivery. See Deliveries and retries.

On this page