> ## Documentation Index
> Fetch the complete documentation index at: https://www.help.creatora.io/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> When building or modifying an integration with the Creatora API, start with https://www.help.creatora.io/en/api/build-with-ai.md. Retrieve the current GraphQL SDL from https://api.creatora.io/sdl before relying on API schema information.

# Measure registration-to-paid conversion

> Measure the share of a registration cohort with a successful paid purchase by a cutoff.

Find what percentage of Students registered during a period had a successful paid purchase by a chosen cutoff. Each Student is counted once, even if they bought more than one Offer.

This example selects September 2026 registrations in UTC and checks purchases before October 1, 2026. Move the purchase cutoff forward to let the same registration cohort mature.

## Request

<RequestExample>
  ```graphql theme={null}
  {
    students(createdOn: { range: [1788220800000, 1790812800000] }) {
      id role createdOn
      orders(status: { equals: [succeeded] }) { id closedOn amountNetCharge }
    }
  }
  ```
</RequestExample>

<ResponseExample>
  ```json Illustrative response theme={null}
  {
    "data": {
      "students": [
        {
          "id": "33333333-3333-4333-8333-333333333333",
          "role": "student",
          "createdOn": 1788224400000,
          "orders": [
            {
              "id": "55555555-5555-4555-8555-555555555555",
              "closedOn": 1788228000000,
              "amountNetCharge": 49
            }
          ]
        },
        {
          "id": "44444444-4444-4444-8444-444444444444",
          "role": "student",
          "createdOn": 1788307200000,
          "orders": []
        }
      ]
    }
  }
  ```
</ResponseExample>

## Use the result

```javascript theme={null}
const registrationStart = 1788220800000;
const registrationEnd = 1790812800000;
const purchaseCutoff = 1790812800000;
const cohort = [...new Map(response.data.students
  .filter(student => student.role === "student" &&
    student.createdOn >= registrationStart && student.createdOn < registrationEnd)
  .map(student => [student.id, student])).values()];
const converted = cohort.filter(student => student.orders.some(order =>
  order.closedOn !== null && order.closedOn >= student.createdOn &&
  order.closedOn < purchaseCutoff && order.amountNetCharge > 0
));
const report = {
  registeredStudents: cohort.length,
  payingStudents: converted.length,
  conversionPercent: cohort.length > 0 ? converted.length / cohort.length * 100 : null,
  purchaseCutoff
};
```

The cohort is Platform-scoped and excludes Administrator accounts. The Student query includes its upper bound, so the processing code removes registrations exactly at October 1. Nested Orders have no list limit in this request. For a large cohort, split the registration period and deduplicate Students by `id`.

This definition counts positive-charge Orders currently marked `succeeded`, including manually registered purchases. Free acquisitions and direct grants do not count. A purchase now refunded or disputed is excluded, so recalculating an old cohort can change its rate. This is current successful-paid status by purchase date, rather than an immutable historical first-payment report.

Students who registered near the end of a cohort have less time to purchase. Compare cohorts at similar ages. To measure conversion within 30 days for every Student, wait until each has had the full observation window and use `order.closedOn < student.createdOn + 30 * 86400000` as an additional condition.

This joins Student records to their Orders. Referrer and UTM aggregates cannot assign these conversions to traffic channels.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.