> ## Documentation Index
> Fetch the complete documentation index at: https://docs.nekt.com/llms.txt
> Use this file to discover all available pages before exploring further.

# LaunchLMS as a data source

> Bring data from LaunchLMS to your Lakehouse.

LaunchLMS is a white-label learning platform used to run corporate universities and online course catalogues. The connector extracts your product catalogue and its contents, the participants enrolled in each product and how far along they are, their assessment and quiz results, and the commercial side of the operation — orders, transactions, coupons, affiliates and subscription plans — so you can analyse training engagement and revenue in your Lakehouse.

Because LaunchLMS is white-labelled, every organization answers on its own domain, so you inform your own platform address when configuring the source.

## Configuring LaunchLMS as a Source

In the [Sources](https://app.nekt.ai/sources) tab, click on the "Add source" button located on the top right of your screen. Then, select the LaunchLMS option from the list of connectors.

Click **Next** and you'll be prompted to add your access.

### 1. Add account access

LaunchLMS authenticates with a static **integration token**, sent in the `Authorization` header. In your LaunchLMS platform, go to **Settings > Integrations** and open the **API** tab to generate and copy the token.

<Warning>The integration token has super administrator privileges over your organization. Keep it private and rotate it periodically — you can generate a new one in the same screen at any time, and then update it here.</Warning>

The following configurations are available:

* **Platform address**: the address of your LaunchLMS platform, including `https://` — the same address you use to sign in, for example `https://cursos.yourcompany.com.br`. Required.

* **Organization ID**: the identifier of the organization you want to sync. Open your organization's settings in LaunchLMS and copy the code shown in the browser address bar. Required.

* **Integration token**: the token copied from **Settings > Integrations > API**. Required.

* **Initial sync date**: the earliest date from which records will be synced. It applies to the Transactions stream, the only endpoint LaunchLMS lets the connector filter by date; every other stream is always read in full.

* **Form IDs** (advanced): the identifiers of the forms whose submissions you want to sync. LaunchLMS has no endpoint that lists an organization's forms, so each one has to be informed here — open the form in the platform and copy the code shown in the browser address bar. Leave it empty to skip the Form responses stream.

* **Profiles to sync** (advanced): leave it empty to sync every profile of the organization, or choose `user` to sync only the learners and leave administrator accounts out of the Users stream.

* **Page size** (advanced): the number of records requested per page on the paginated endpoints. The default of 100 works for most platforms; lower it if your platform times out on large listings.

Once you're done, click **Next**.

### 2. Select streams

Choose which data streams you want to sync. For faster extractions, select only the streams that are relevant to your analysis. You can select entire groups of streams or pick specific ones.

> Tip: The stream can be found more easily by typing its name.

<Note>Most streams are read per product: the connector lists your products and then reads the contents, plans, coupons, affiliates, bonuses, reviews, orders and participants of each one. Extraction time therefore grows with the size of your catalogue.</Note>

<Warning>The **Participant grades** stream is read one enrolment at a time — one request per participant per product — so it is by far the slowest stream of the connector. Select it only when you actually need the assessment and quiz results.</Warning>

<Info>Only read operations are covered. LaunchLMS also exposes routes that create users, enrolments and subscriptions; those are write operations and are not part of this connector.</Info>

Select the streams and click **Next**.

### 3. Configure data streams

Customize how you want your data to appear in your catalog. Select the desired layer where the data will be placed, a folder to organize it inside the layer, a name for each table (which will effectively contain the fetched data) and the type of sync.

* **Layer**: choose between the existing layers on your catalog. This is where you will find your new extracted tables as the extraction runs successfully.
* **Folder**: a folder can be created inside the selected layer to group all tables being created from this new data source.
* **Table name**: we suggest a name, but feel free to customize it. You have the option to add a **prefix** to all tables at once and make this process faster!
* **Sync Type**: Transactions supports INCREMENTAL; every other stream is full table, since LaunchLMS exposes no "modified since" filter on the remaining endpoints. Read more about Sync Types [here](https://docs.nekt.com/get-started/core-concepts/types-of-sync).

Once you are done configuring, click **Next**.

### 4. Configure data source

Describe your data source for easy identification within your organization, not exceeding 140 characters.

To define your [Trigger](https://docs.nekt.com/get-started/core-concepts/triggers), consider how often you want data to be extracted from this source. This decision usually depends on how frequently you need the new table data updated (every day, once a week, or only at specific times).

Optionally, you can define some additional settings:

* Configure Delta Log Retention and determine for how long we should store old states of this table as it gets updated. Read more about this resource [here](https://docs.nekt.com/get-started/core-concepts/resource-control).
* Determine when to execute an **Additional [Full Sync](https://docs.nekt.com/get-started/core-concepts/types-of-sync#additional-full-sync)**. This will complement the incremental data extractions, ensuring that your data is completely synchronized with your source every once in a while.

Once you are ready, click **Next** to finalize the setup.

### 5. Check your new source

You can view your new source on the [Sources](https://app.nekt.ai/sources) page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.

<Warning>For you to be able to see it on your [Catalog](https://app.nekt.ai/catalog), you need at least one successful source run.</Warning>

## How the data is modelled

A few conventions are worth knowing before you query these tables:

* Nested payloads — the plans of a product, the resources of a content, the participants of an order, the grades of an enrolment — are stored as **JSON text columns** rather than nested structures, so the table shape never changes when LaunchLMS adds a field. Read them with `JSON_VALUE(column, '$.field')`.
* The currency of every monetary value is unpacked into `currency_code`, `currency_symbol` and `currency_minor_unit`. Use `currency_minor_unit` to know how many decimal places the amounts carry.
* Products and subscription plans carry further configuration whose presence depends on your platform settings; those extra fields are kept together in an `additional_fields` JSON column.
* Form submissions return one key per question, named after the question text, so the answers are kept in an `answers` JSON object keyed by the original question titles. Submissions have no identifier of their own in LaunchLMS, so the connector derives a stable one from the content of the submission.

# Streams and Fields

Below you'll find all available data streams from LaunchLMS and their corresponding fields.

<AccordionGroup>
  <Accordion title="Spaces">
    Spaces of the organization — the branded areas products are published in (`GET /api/organizations/{idOrganization}/spaces`). Every participant belongs to one, so it is the dimension used to split reporting by brand or business unit.

    Primary key: `id_space`

    | Field             | Type    | Description                                                                                     |
    | :---------------- | :------ | :---------------------------------------------------------------------------------------------- |
    | `id_space`        | String  | Identifier of the space. Used as the primary key.                                               |
    | `id_organization` | String  | Identifier of the LaunchLMS organization the record belongs to, as configured on the source.    |
    | `code`            | String  | Short code of the space, used in the platform address and to look the space up through the API. |
    | `name`            | String  | Display name of the space.                                                                      |
    | `icon`            | String  | Address of the icon shown for the space.                                                        |
    | `logo`            | String  | Address of the logo shown for the space in the light theme.                                     |
    | `logo_dark_theme` | String  | Address of the logo shown for the space in the dark theme.                                      |
    | `banner`          | String  | Address of the banner image displayed on the space home.                                        |
    | `banner_link`     | String  | Address the space banner links to when clicked.                                                 |
    | `zendesk_enabled` | Boolean | Whether the Zendesk help widget is enabled in the space.                                        |
  </Accordion>

  <Accordion title="Users">
    Every user registered in the organization, learners and staff alike (`GET /api/organizations/{idOrganization}/users`). This is the people dimension the enrolments join back to.

    Primary key: `id_user`

    | Field               | Type     | Description                                                                                                                                                   |
    | :------------------ | :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------ |
    | `id_user`           | String   | Identifier of the user. Used as the primary key.                                                                                                              |
    | `id_organization`   | String   | Identifier of the LaunchLMS organization the record belongs to, as configured on the source.                                                                  |
    | `name`              | String   | Name of the user.                                                                                                                                             |
    | `email`             | String   | Email address of the user.                                                                                                                                    |
    | `username`          | String   | Name the user signs in with.                                                                                                                                  |
    | `phone`             | String   | Phone number of the user.                                                                                                                                     |
    | `country_dial_code` | String   | International dialling code of the user's phone number.                                                                                                       |
    | `photo`             | String   | Address of the user's profile picture.                                                                                                                        |
    | `admin`             | Boolean  | Whether the user administers the organization.                                                                                                                |
    | `superadmin`        | Boolean  | Whether the user has full super administrator access.                                                                                                         |
    | `blocked`           | Boolean  | Whether the user is blocked from signing in.                                                                                                                  |
    | `id_space`          | String   | Identifier of the space the user belongs to.                                                                                                                  |
    | `space_name`        | String   | Name of the space the user belongs to.                                                                                                                        |
    | `id_group`          | String   | Identifier of the group the user belongs to.                                                                                                                  |
    | `group_name`        | String   | Name of the group the user belongs to.                                                                                                                        |
    | `language`          | String   | Language the platform is shown to the user in.                                                                                                                |
    | `theme`             | String   | Interface theme chosen by the user: 'light' or 'dark'.                                                                                                        |
    | `notifications`     | String   | Notification preferences of the user, as a JSON object.                                                                                                       |
    | `additional_data`   | String   | Extra profile data LaunchLMS returns for the user in its 'data' field, as a JSON value. Its shape depends on the fields the organization collects at sign-up. |
    | `issue_date`        | Datetime | Date the user was registered.                                                                                                                                 |
    | `last_access_date`  | Datetime | Date the user last signed in.                                                                                                                                 |
  </Accordion>

  <Accordion title="Products">
    The catalogue: courses, trainings, events, communities, ebooks and learning paths (`GET /api/organizations/{idOrganization}/products`). Every product-scoped stream below expands from this one.

    Primary key: `id_product`

    | Field                 | Type     | Description                                                                                                                                                                         |
    | :-------------------- | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `id_product`          | String   | Identifier of the product. Used as the primary key.                                                                                                                                 |
    | `id_organization`     | String   | Identifier of the LaunchLMS organization the record belongs to, as configured on the source.                                                                                        |
    | `code`                | String   | Short code of the product, used in the platform address.                                                                                                                            |
    | `name`                | String   | Name of the product.                                                                                                                                                                |
    | `type`                | String   | Kind of product: 'course', 'training', 'community', 'ebook', 'event', 'webinar', 'mentoring', 'lecture', 'template', 'report', 'spreadsheet', 'enterprise' or 'learningPath'.       |
    | `status`              | String   | Whether the product is 'active' or 'archived'.                                                                                                                                      |
    | `visibility`          | String   | Whether the product is listed publicly ('public') or only reachable by direct enrolment ('private').                                                                                |
    | `description`         | String   | Description of the product shown on its sales page.                                                                                                                                 |
    | `amount`              | Number   | Price of the product, in the currency below. Check 'currency\_minor\_unit' for how many decimal places the value carries.                                                           |
    | `amount_description`  | String   | Price as displayed to the buyer, for example '12x R\$ 99,00'.                                                                                                                       |
    | `is_free`             | Boolean  | Whether the product is offered free of charge.                                                                                                                                      |
    | `currency_code`       | String   | ISO code of the currency of the amounts, for example 'BRL'.                                                                                                                         |
    | `currency_symbol`     | String   | Symbol used to display the currency, for example 'R\$'.                                                                                                                             |
    | `currency_minor_unit` | Integer  | Number of decimal places the currency uses, so the monetary amounts can be scaled correctly.                                                                                        |
    | `language`            | String   | Language the product is delivered in.                                                                                                                                               |
    | `workload`            | Number   | Estimated workload of the product, in hours.                                                                                                                                        |
    | `custom_url`          | String   | Custom address configured for the product's sales page.                                                                                                                             |
    | `category_name`       | String   | Name of the category the product is filed under.                                                                                                                                    |
    | `subcategory_name`    | String   | Name of the subcategory the product is filed under.                                                                                                                                 |
    | `content_count`       | Integer  | Number of public contents the product holds.                                                                                                                                        |
    | `plans`               | String   | Enrolment plans offered for the product, as a JSON array. The 'product\_plans' stream carries the same plans as rows.                                                               |
    | `issue_date`          | Datetime | Date the product was created.                                                                                                                                                       |
    | `additional_fields`   | String   | Remaining product configuration returned by LaunchLMS but not modelled as its own column, as a JSON object. Which keys appear depends on the settings enabled for the organization. |
  </Accordion>

  <Accordion title="Subscription plans">
    Recurring plans sold by the organization (`GET /api/organizations/{idOrganization}/subscriptionPlans`), as opposed to the one-off enrolment plans attached to a single product.

    Primary key: `id_subscription_plan`

    | Field                  | Type     | Description                                                                                                     |
    | :--------------------- | :------- | :-------------------------------------------------------------------------------------------------------------- |
    | `id_subscription_plan` | String   | Identifier of the subscription plan. Used as the primary key.                                                   |
    | `id_organization`      | String   | Identifier of the LaunchLMS organization the record belongs to, as configured on the source.                    |
    | `code`                 | String   | Short code of the subscription plan.                                                                            |
    | `name`                 | String   | Name of the subscription plan.                                                                                  |
    | `slogan`               | String   | Tagline displayed with the plan on the checkout page.                                                           |
    | `description`          | String   | Description of what the subscription plan grants access to.                                                     |
    | `status`               | String   | Whether the plan is 'active' or 'inactive'.                                                                     |
    | `visibility`           | String   | Whether the plan is 'public' or 'private'.                                                                      |
    | `amount`               | Number   | Price charged on each billing cycle of the subscription.                                                        |
    | `signup_fee`           | Number   | One-off fee charged when the subscription starts.                                                               |
    | `interval`             | String   | Billing interval of the subscription: 'month' or 'year'.                                                        |
    | `duration`             | Integer  | Length of the access the subscription grants.                                                                   |
    | `trial_days`           | Integer  | Number of free trial days offered before the first charge.                                                      |
    | `number_of_invoices`   | Integer  | Number of invoices the subscription issues before it finishes. Empty when the subscription renews indefinitely. |
    | `max_installments`     | Integer  | Maximum number of credit card instalments accepted.                                                             |
    | `payment_methods`      | String   | Payment methods accepted by the plan, as a JSON array.                                                          |
    | `id_currency`          | String   | Identifier of the currency the plan is charged in.                                                              |
    | `language`             | String   | Language the subscription plan is presented in.                                                                 |
    | `custom_url`           | String   | Custom address configured for the plan's checkout page.                                                         |
    | `issue_date`           | Datetime | Date the subscription plan was created.                                                                         |
    | `additional_fields`    | String   | Remaining plan configuration returned by LaunchLMS but not modelled as its own column, as a JSON object.        |
  </Accordion>

  <Accordion title="Transactions">
    Every payment movement of the organization, for both orders and subscriptions (`GET /api/organizations/{idOrganization}/transactions`). This is the only stream replicated incrementally.

    Primary key: `id_transaction`

    Replication key: `issue_date` (incremental sync)

    | Field                 | Type     | Description                                                                                                  |
    | :-------------------- | :------- | :----------------------------------------------------------------------------------------------------------- |
    | `id_transaction`      | String   | Identifier of the transaction. Used as the primary key.                                                      |
    | `id_organization`     | String   | Identifier of the LaunchLMS organization the record belongs to, as configured on the source.                 |
    | `status`              | String   | State of the payment: 'waiting', 'paid', 'cancelled', 'refunded' or 'error'.                                 |
    | `amount`              | Number   | Amount the transaction was issued for.                                                                       |
    | `paid_amount`         | Number   | Amount actually settled by the payer.                                                                        |
    | `fee_amount`          | Number   | Fee charged by the payment provider on the transaction.                                                      |
    | `currency_code`       | String   | ISO code of the currency of the amounts, for example 'BRL'.                                                  |
    | `currency_symbol`     | String   | Symbol used to display the currency, for example 'R\$'.                                                      |
    | `currency_minor_unit` | Integer  | Number of decimal places the currency uses, so the monetary amounts can be scaled correctly.                 |
    | `payment_method`      | String   | Means of payment used, for example credit card, pix or boleto.                                               |
    | `installments`        | Integer  | Number of credit card instalments the payment was split into.                                                |
    | `track_number`        | String   | Identifier of the transaction inside the payment provider.                                                   |
    | `id_order`            | String   | Identifier of the enrolment order being paid. Empty when the transaction belongs to a subscription instead.  |
    | `id_subscription`     | String   | Identifier of the subscription being charged. Empty when the transaction belongs to a one-off order instead. |
    | `responsible_name`    | String   | Name of the person responsible for the order or subscription.                                                |
    | `responsible_email`   | String   | Email address of the person responsible for the order or subscription.                                       |
    | `issue_date`          | Datetime | Date the transaction was issued, used as the incremental replication key.                                    |
    | `payment_date`        | Datetime | Date the transaction was settled.                                                                            |
    | `refund_date`         | Datetime | Date the transaction was refunded, when it was.                                                              |
  </Accordion>

  <Accordion title="Product contents">
    The lessons, files, quizzes and forms that make up each product (`GET /api/organizations/{idOrganization}/products/{idProduct}/contents`).

    Primary key: `id_product`, `id_content`

    | Field                      | Type     | Description                                                                                    |
    | :------------------------- | :------- | :--------------------------------------------------------------------------------------------- |
    | `id_content`               | String   | Identifier of the content. Part of the primary key together with the product.                  |
    | `id_product`               | String   | Identifier of the product the record belongs to.                                               |
    | `id_organization`          | String   | Identifier of the LaunchLMS organization the record belongs to, as configured on the source.   |
    | `title`                    | String   | Title of the content.                                                                          |
    | `type`                     | String   | Kind of content, for example a video, a file or a quiz.                                        |
    | `id_module`                | String   | Identifier of the module the content belongs to.                                               |
    | `module_name`              | String   | Name of the module the content belongs to.                                                     |
    | `level`                    | Integer  | Depth of the content in the product's hierarchy.                                               |
    | `position`                 | Integer  | Order of the content inside its module.                                                        |
    | `duration`                 | Integer  | Estimated time to consume the content, in minutes.                                             |
    | `min_duration`             | Integer  | Minimum consumption time, in minutes, before the content counts as completed.                  |
    | `visibility`               | String   | Who can see the content: 'public' for every participant, or 'instructors'.                     |
    | `preview_enabled`          | Boolean  | Whether the content is open as a free preview.                                                 |
    | `forum_enabled`            | Boolean  | Whether the discussion forum is enabled on the content.                                        |
    | `review_enabled`           | Boolean  | Whether participants can rate the content.                                                     |
    | `available_in_days`        | Integer  | Number of days after enrolment before the content is released to the participant.              |
    | `id_pre_requisite_content` | String   | Identifier of the content that must be completed before this one opens.                        |
    | `start_date`               | Datetime | Date the content is released.                                                                  |
    | `end_date`                 | Datetime | Date the content expires.                                                                      |
    | `resources`                | String   | Resources attached to the content — videos, files, forms and questionnaires — as a JSON array. |
    | `tags`                     | String   | Tags applied to the content, as a JSON value.                                                  |
  </Accordion>

  <Accordion title="Product plans">
    Enrolment plans offered for each product — price, instalments and how long access lasts (`GET /api/organizations/{idOrganization}/products/{idProduct}/plans`).

    Primary key: `id_plan`

    | Field                | Type     | Description                                                                                                            |
    | :------------------- | :------- | :--------------------------------------------------------------------------------------------------------------------- |
    | `id_plan`            | String   | Identifier of the plan. Used as the primary key.                                                                       |
    | `id_product`         | String   | Identifier of the product the record belongs to.                                                                       |
    | `id_organization`    | String   | Identifier of the LaunchLMS organization the record belongs to, as configured on the source.                           |
    | `description`        | String   | Name of the plan as shown on the product's checkout page.                                                              |
    | `notice`             | String   | Notice displayed alongside the plan at checkout.                                                                       |
    | `amount`             | Number   | Price charged for the plan.                                                                                            |
    | `original_amount`    | Number   | Price of the plan before any discount.                                                                                 |
    | `amount_description` | String   | Price as displayed to the buyer, for example '12x R\$ 99,00'.                                                          |
    | `installments`       | Integer  | Maximum number of credit card instalments accepted.                                                                    |
    | `duration`           | Integer  | Length of the access the plan grants, in 'duration\_type' units.                                                       |
    | `duration_type`      | String   | Unit of the access length: 'days', 'months' or 'years'.                                                                |
    | `quantity`           | Integer  | Maximum number of seats the plan offers.                                                                               |
    | `available`          | Boolean  | Whether the plan can currently be bought, considering its period, remaining seats and the product's participant limit. |
    | `start_date`         | Datetime | Date the plan becomes available for purchase.                                                                          |
    | `end_date`           | Datetime | Date the plan stops being available for purchase.                                                                      |
  </Accordion>

  <Accordion title="Product coupons">
    Discount coupons created for each product, with how many confirmed orders redeemed them (`GET /api/organizations/{idOrganization}/products/{idProduct}/coupons`).

    Primary key: `id_coupon`

    | Field             | Type     | Description                                                                                  |
    | :---------------- | :------- | :------------------------------------------------------------------------------------------- |
    | `id_coupon`       | String   | Identifier of the coupon. Used as the primary key.                                           |
    | `id_product`      | String   | Identifier of the product the record belongs to.                                             |
    | `id_organization` | String   | Identifier of the LaunchLMS organization the record belongs to, as configured on the source. |
    | `code`            | String   | Code the buyer types at checkout to claim the discount.                                      |
    | `description`     | String   | Description of the coupon.                                                                   |
    | `category`        | String   | Category the coupon is filed under.                                                          |
    | `type`            | String   | How the discount is calculated: 'percentage' or 'amount' (a fixed sum).                      |
    | `amount`          | Number   | Fixed discount granted, when the coupon type is 'amount'.                                    |
    | `percentage`      | Number   | Percentage discount granted, when the coupon type is 'percentage'.                           |
    | `status`          | String   | Whether the coupon is 'active' or 'inactive'.                                                |
    | `quantity`        | Integer  | Maximum number of times the coupon can be redeemed in total.                                 |
    | `number_of_uses`  | Integer  | How many times a single participant may redeem the coupon.                                   |
    | `used`            | Integer  | Number of confirmed orders that redeemed the coupon.                                         |
    | `issue_date`      | Datetime | Date the coupon was created.                                                                 |
    | `end_date`        | Datetime | Date the coupon stops being valid.                                                           |
  </Accordion>

  <Accordion title="Product affiliates">
    Affiliates promoting each product, with their coupon, sales volume and commission (`GET /api/organizations/{idOrganization}/products/{idProduct}/affiliates`).

    Primary key: `id_affiliate`

    | Field                     | Type    | Description                                                                                  |
    | :------------------------ | :------ | :------------------------------------------------------------------------------------------- |
    | `id_affiliate`            | String  | Identifier of the affiliation. Used as the primary key.                                      |
    | `id_product`              | String  | Identifier of the product the record belongs to.                                             |
    | `id_organization`         | String  | Identifier of the LaunchLMS organization the record belongs to, as configured on the source. |
    | `id_user`                 | String  | Identifier of the user who acts as the affiliate.                                            |
    | `name`                    | String  | Name of the affiliate.                                                                       |
    | `email`                   | String  | Email address of the affiliate.                                                              |
    | `active`                  | Boolean | Whether the affiliation is currently active.                                                 |
    | `product_name`            | String  | Name of the product the affiliation applies to.                                              |
    | `id_coupon`               | String  | Identifier of the coupon that credits sales to the affiliate.                                |
    | `coupon_code`             | String  | Code of the affiliate's coupon.                                                              |
    | `coupon_description`      | String  | Description of the affiliate's coupon.                                                       |
    | `coupon_amount`           | Number  | Fixed discount the affiliate's coupon grants.                                                |
    | `coupon_percentage`       | Number  | Percentage discount the affiliate's coupon grants.                                           |
    | `commission_type`         | String  | How the commission is calculated: 'percentage' or 'amount' (a fixed sum).                    |
    | `commission_amount`       | Number  | Fixed commission paid per sale.                                                              |
    | `commission_percentage`   | Number  | Percentage commission paid per sale.                                                         |
    | `orders`                  | Integer | Number of confirmed orders credited to the affiliate.                                        |
    | `order_total_amount`      | Number  | Total value of the confirmed orders credited to the affiliate.                               |
    | `order_commission_amount` | Number  | Total commission earned on those confirmed orders.                                           |
  </Accordion>

  <Accordion title="Product bonuses">
    Products handed over as a bonus when someone enrols in another product (`GET /api/organizations/{idOrganization}/products/{idProduct}/bonuses`).

    Primary key: `id_bonus`

    | Field                | Type     | Description                                                                                                      |
    | :------------------- | :------- | :--------------------------------------------------------------------------------------------------------------- |
    | `id_bonus`           | String   | Identifier of the bonus. Used as the primary key.                                                                |
    | `id_product`         | String   | Identifier of the product the record belongs to.                                                                 |
    | `id_organization`    | String   | Identifier of the LaunchLMS organization the record belongs to, as configured on the source.                     |
    | `id_bonus_product`   | String   | Identifier of the product handed over as the bonus.                                                              |
    | `bonus_product_name` | String   | Name of the product handed over as the bonus.                                                                    |
    | `product_status`     | String   | Status of the product handed over as the bonus.                                                                  |
    | `quantity`           | Integer  | Maximum number of bonuses available.                                                                             |
    | `available`          | Boolean  | Whether the bonus can currently be granted, considering its period, remaining quantity and the product's status. |
    | `start_date`         | Datetime | Date the bonus starts being offered.                                                                             |
    | `end_date`           | Datetime | Date the bonus stops being offered.                                                                              |
  </Accordion>

  <Accordion title="Product reviews">
    Ratings and written reviews participants left on each product (`GET /api/organizations/{idOrganization}/products/{idProduct}/reviews`).

    Primary key: `id_review`

    | Field             | Type     | Description                                                                                  |
    | :---------------- | :------- | :------------------------------------------------------------------------------------------- |
    | `id_review`       | String   | Identifier of the review. Used as the primary key.                                           |
    | `id_product`      | String   | Identifier of the product the record belongs to.                                             |
    | `id_organization` | String   | Identifier of the LaunchLMS organization the record belongs to, as configured on the source. |
    | `id_user`         | String   | Identifier of the participant who wrote the review.                                          |
    | `user_name`       | String   | Name of the participant who wrote the review.                                                |
    | `user_email`      | String   | Email address of the participant who wrote the review.                                       |
    | `rating`          | Number   | Score the participant gave the product.                                                      |
    | `headline`        | String   | Title the participant gave the review.                                                       |
    | `review_text`     | String   | Body of the review.                                                                          |
    | `review_favorite` | Boolean  | Whether the review is highlighted on the product page.                                       |
    | `review_date`     | Datetime | Date the review was written.                                                                 |
  </Accordion>

  <Accordion title="Product orders">
    Enrolment orders placed for each product, whatever their payment state (`GET /api/organizations/{idOrganization}/products/{idProduct}/orders`). Join to Transactions on `id_order` for the money movements.

    Primary key: `id_order`

    | Field                  | Type     | Description                                                                                                                        |
    | :--------------------- | :------- | :--------------------------------------------------------------------------------------------------------------------------------- |
    | `id_order`             | String   | Identifier of the order. Used as the primary key.                                                                                  |
    | `id_product`           | String   | Identifier of the product the record belongs to.                                                                                   |
    | `id_organization`      | String   | Identifier of the LaunchLMS organization the record belongs to, as configured on the source.                                       |
    | `status`               | String   | State of the order: 'open', 'confirmed' or 'cancelled'.                                                                            |
    | `name`                 | String   | Name of the first participant enrolled by the order.                                                                               |
    | `email`                | String   | Email address of the first participant enrolled by the order.                                                                      |
    | `total_amount`         | Number   | Total amount of the order, after discounts.                                                                                        |
    | `currency_code`        | String   | ISO code of the currency of the amounts, for example 'BRL'.                                                                        |
    | `currency_symbol`      | String   | Symbol used to display the currency, for example 'R\$'.                                                                            |
    | `currency_minor_unit`  | Integer  | Number of decimal places the currency uses, so the monetary amounts can be scaled correctly.                                       |
    | `payment_method`       | String   | Means of payment chosen for the order.                                                                                             |
    | `installments`         | Integer  | Number of credit card instalments the order was split into.                                                                        |
    | `affiliate_name`       | String   | Name of the affiliate credited with the order.                                                                                     |
    | `coupon_description`   | String   | Description of the discount coupon applied to the order.                                                                           |
    | `fiscal_invoice_error` | String   | Error reported while issuing the invoice for the order, when one occurred.                                                         |
    | `participants`         | String   | Participants enrolled by the order, as a JSON array.                                                                               |
    | `transaction_logs`     | String   | Errors recorded by the payment provider for this order, as a JSON array. Useful to explain why an order never reached 'confirmed'. |
    | `issue_date`           | Datetime | Date the order was placed.                                                                                                         |
  </Accordion>

  <Accordion title="Product participants">
    Enrolments: who is taking each product and how far along they are (`GET /api/organizations/{idOrganization}/products/{idProduct}/users`). This is the core stream for learning reporting — progress, status and last access date.

    Primary key: `id_product`, `id_user`

    | Field               | Type     | Description                                                                                  |
    | :------------------ | :------- | :------------------------------------------------------------------------------------------- |
    | `id_user`           | String   | Identifier of the participant. Part of the primary key together with the product.            |
    | `id_product`        | String   | Identifier of the product the record belongs to.                                             |
    | `id_organization`   | String   | Identifier of the LaunchLMS organization the record belongs to, as configured on the source. |
    | `name`              | String   | Name of the participant.                                                                     |
    | `email`             | String   | Email address of the participant.                                                            |
    | `phone`             | String   | Phone number of the participant.                                                             |
    | `country_dial_code` | String   | International dialling code of the participant's phone number.                               |
    | `photo`             | String   | Address of the participant's profile picture.                                                |
    | `status`            | String   | State of the enrolment: 'active' or 'closed'.                                                |
    | `progress`          | Number   | Share of the product the participant has completed, in percent.                              |
    | `blocked`           | Boolean  | Whether the participant is blocked from this product.                                        |
    | `present`           | Boolean  | Whether attendance was recorded for the participant.                                         |
    | `id_space`          | String   | Identifier of the space the participant belongs to.                                          |
    | `space_name`        | String   | Name of the space the participant belongs to.                                                |
    | `issue_date`        | Datetime | Date the participant was enrolled in the product.                                            |
    | `due_date`          | Datetime | Date the participant's access to the product expires.                                        |
    | `last_access_date`  | Datetime | Date the participant last opened a content of the product.                                   |
  </Accordion>

  <Accordion title="Participant grades">
    Assessment and quiz results of one participant in one product (`GET /api/organizations/{idOrganization}/products/{idProduct}/users/{idUser}/grades`). LaunchLMS exposes grades one enrolment at a time, so this stream issues one request per participant per product.

    Primary key: `id_product`, `id_user`

    | Field             | Type   | Description                                                                                                                                                |
    | :---------------- | :----- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `id_product`      | String | Identifier of the product the grades belong to. Part of the primary key together with the participant.                                                     |
    | `id_user`         | String | Identifier of the participant the grades belong to. Part of the primary key together with the product.                                                     |
    | `id_organization` | String | Identifier of the LaunchLMS organization the record belongs to, as configured on the source.                                                               |
    | `evaluations`     | String | Assessments of the product and the participant's mark on each, as a JSON array of objects with 'idEvaluation', 'name', 'grade', 'comment' and 'available'. |
    | `quizzes_results` | String | Results of the quizzes the participant finished, as a JSON array of objects with 'quiz', 'content', 'grade', 'percentage', 'approved' and 'responseDate'.  |
  </Accordion>

  <Accordion title="Form responses">
    Submissions of the forms listed in the Form IDs setting (`GET /api/organizations/{idOrganization}/forms/{idForm}/formResponses`).

    Primary key: `id_form`, `id_form_response`

    | Field              | Type     | Description                                                                                                                                                                                                                              |
    | :----------------- | :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | `id_form`          | String   | Identifier of the form the submission belongs to, as configured on the source. Part of the primary key.                                                                                                                                  |
    | `id_form_response` | String   | Fingerprint of the submission, derived from its content because LaunchLMS does not give a submission its own identifier. Stable across runs, so re-reading a form updates the rows instead of duplicating them. Part of the primary key. |
    | `id_organization`  | String   | Identifier of the LaunchLMS organization the record belongs to, as configured on the source.                                                                                                                                             |
    | `date`             | Datetime | Date the form was submitted.                                                                                                                                                                                                             |
    | `name`             | String   | Name of the participant who submitted the form. Only returned when the form is attached to a content.                                                                                                                                    |
    | `email`            | String   | Email address of the participant who submitted the form. Only returned when the form is attached to a content.                                                                                                                           |
    | `content`          | String   | Title of the content the form is attached to, when it is attached to one.                                                                                                                                                                |
    | `product`          | String   | Name of the product the form was submitted from, when the form is attached to a content.                                                                                                                                                 |
    | `answers`          | String   | Answers given in the submission, as a JSON object keyed by the question titles exactly as they are written in the form.                                                                                                                  |
  </Accordion>
</AccordionGroup>
