> ## 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.

# Mautic as a data source

> Bring data from Mautic to Nekt.

Mautic is an open-source marketing automation and CRM platform. It manages contacts and companies, sends email and SMS campaigns, hosts landing pages and forms, and scores contacts through points and lifecycle stages. Mautic is self-hosted, so each organization runs its own instance and this connector reads from that instance directly.

## Before you start

Mautic ships with its API switched **off**. An administrator of your instance has to turn it on before Nekt can read anything.

<Steps>
  <Step title="Turn on the API">
    In Mautic, go to **Settings → Configuration → API Settings** and set **API enabled** to *Yes*. Save and close.
  </Step>

  <Step title="Create the credentials">
    Choose one of the two methods below. OAuth 2 is the one Mautic recommends.

    **OAuth 2 (recommended).** Sign in as a user with an **administrator** role, go to **Settings → API Credentials**, and add a new credential. Mautic asks for a name and a Redirect URI; the Redirect URI is never used by this connection, so any valid URL will do. Save, then copy the **Client ID** and **Client Secret**.

    **Basic authentication.** Back in **Settings → Configuration → API Settings**, also set **Enable HTTP basic auth** to *Yes*. Then use the username and password of an existing Mautic user.
  </Step>
</Steps>

<Warning>
  The API credential must be created while signed in as an **administrator**. Mautic only enables the machine-to-machine sign-in this connector uses when an administrator creates the credential, and it only does so at the moment of creation — editing the credential afterwards does not add it. A credential created by any other role is refused at sign-in with no explanation of why. If that happens, delete it and create a new one as an administrator.
</Warning>

<Note>
  What the connection can read is governed by the role of the user behind it. With OAuth 2 that is the role of the administrator who created the credential; with basic authentication it is the role of the user whose password you supplied. A role without permission on part of Mautic makes the matching streams come back empty, and the run log says which ones.
</Note>

## Configuring Mautic 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 Mautic option from the list of connectors.

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

### 1. Add account access

The following configurations are available:

* **Mautic URL**: The address of your Mautic installation, with no trailing slash — for example `https://mautic.example.com`. This is your own server, not a shared Mautic address.

* **Authentication Method**: `oauth2` to sign in with an API credential, or `basic` to sign in as a Mautic user. Fill in only the fields for the method you chose.

* **Client ID** and **Client Secret**: The two keys from **Settings → API Credentials**, for the `oauth2` method.

* **Username** and **Password**: The credentials of a Mautic user, for the `basic` method.

* **Start Date**: The earliest change to read on the first sync. Later runs continue from where the previous one stopped. Leave it empty to read your full history.

* **Page Size**: (Default: 100) Records requested per API call. Mautic's own default is 30. A larger page means fewer calls but a heavier response for your server to build — lower it if your instance times out or runs out of memory on large tables.

* **Requests Per Minute**: (Default: 120) The pace this connection holds itself to, so a full sync does not overwhelm your Mautic server. Set it to 0 to remove the limit.

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.

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**: you can choose between INCREMENTAL and FULL\_TABLE.
  * Incremental: every time the extraction happens, we'll get only the new data - which is good if, for example, you want to keep every record ever fetched.
  * Full table: every time the extraction happens, we'll get the current state of the data - which is good if, for example, you don't want to have deleted data in your catalog.

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/runs/scheduling-and-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>

# Streams and Fields

Mautic exposes two different families of data, and this connector reads both.

**Records** are the things people create and edit in the Mautic interface: contacts, companies, campaigns, emails, forms, segments. **Activity tables** are the event log behind those records: every send, open, page hit, form submission, campaign step, point change and segment membership. Most analysis needs both — the records give you the *what*, the activity tables give you the *when* and *how often*.

## How syncing works

Records sync **incrementally** on a column named `last_changed_at`. Mautic leaves its own `date_modified` empty until a record is edited for the first time, so this connector derives `last_changed_at` from the modification date and falls back to the creation date. The original `date_modified` is still available as its own column.

Activity tables sync **incrementally on `id`** where they have one, which reads each new row exactly once. Tables whose rows are updated after they are written — an email's open counters, a push notification's clicks — say so on their `id` field: choose a full sync for those streams if you need the counters to keep up. Association tables such as `segment_memberships` have no row id at all and always sync in full.

<Note>
  All timestamps are stored by Mautic in UTC. Activity tables return them without a timezone and this connector reads them as UTC; record endpoints return them with the offset your instance is configured for, and that offset is preserved.
</Note>

## Custom fields

Mautic lets you add your own fields to contacts and companies. The `contacts` and `companies` streams have real columns for every field Mautic installs by default (`email`, `firstname`, `city`, `companyname`, and so on), and a `fields` column holding the complete set as JSON — including anything your instance added. Use the `contact_fields` stream to see what each key in that JSON means and what type it holds.

## Record streams

| Stream             | Slug             | Sync        | Description                                                                 |
| ------------------ | ---------------- | ----------- | --------------------------------------------------------------------------- |
| Contacts           | `contacts`       | Incremental | People known to Mautic, with their built-in and custom fields.              |
| Companies          | `companies`      | Incremental | Organizations known to Mautic, with their built-in and custom fields.       |
| Campaigns          | `campaigns`      | Incremental | Automation campaigns and the event tree that drives each one.               |
| Emails             | `emails`         | Incremental | Email templates and campaign emails, with their aggregate send counters.    |
| Forms              | `forms`          | Incremental | Forms, with their field definitions and submit actions.                     |
| Segments           | `segments`       | Incremental | Contact segments and the filters that define their membership.              |
| Assets             | `assets`         | Incremental | Downloadable files hosted or linked by Mautic.                              |
| Notes              | `notes`          | Incremental | Notes people write on a contact's timeline.                                 |
| Stages             | `stages`         | Incremental | Lifecycle stages a contact can be moved through.                            |
| Tags               | `tags`           | Full table  | Tags available to label contacts.                                           |
| Categories         | `categories`     | Incremental | Categories used to file emails, forms, campaigns, and other records.        |
| Contact Fields     | `contact_fields` | Incremental | Definitions of the contact fields this instance has, including custom ones. |
| Point Groups       | `point_groups`   | Incremental | Point groups, which let a contact hold separate scores side by side.        |
| Push Notifications | `notifications`  | Incremental | Web push notifications defined on the instance.                             |
| Text Messages      | `text_messages`  | Incremental | SMS messages defined on the instance.                                       |
| Users              | `users`          | Incremental | Mautic's own staff accounts, and the role each one holds.                   |
| Webhooks           | `webhooks`       | Incremental | Outgoing webhooks configured on the instance.                               |

## Activity streams

These read Mautic's own database tables through its stats endpoint. The **Mautic table** column is the name Mautic uses for it, in case you need to cross-reference its documentation.

| Stream                    | Mautic table                | Sync        | Description                                                                                                                                                                                                    |
| ------------------------- | --------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `email_stats`             | `email_stats`               | Incremental | One row per email sent to a contact, with its delivery and open state.                                                                                                                                         |
| `email_replies`           | `email_stat_replies`        | Incremental | Replies Mautic matched back to an email it sent.                                                                                                                                                               |
| `email_open_devices`      | `email_stats_devices`       | Incremental | Which device each email open came from.                                                                                                                                                                        |
| `page_hits`               | `page_hits`                 | Incremental | Every tracked page view, on a Mautic landing page or a site carrying the tracking script.                                                                                                                      |
| `form_submissions`        | `form_submissions`          | Incremental | One row per form submission. The submitted values themselves stay in Mautic's form results tables and are not exposed by the API.                                                                              |
| `asset_downloads`         | `asset_downloads`           | Incremental | Every download of a file hosted as a Mautic asset.                                                                                                                                                             |
| `campaign_event_log`      | `campaign_lead_event_log`   | Incremental | Every campaign step taken for a contact, including steps still scheduled.                                                                                                                                      |
| `campaign_memberships`    | `campaign_leads`            | Full table  | Which contacts are in which campaign. Keyed by the campaign and contact pair rather than by a row id, and edited in place when someone leaves, so it always syncs in full.                                     |
| `segment_memberships`     | `lead_lists_leads`          | Full table  | Which contacts are in which segment. Keyed by the segment and contact pair rather than by a row id, and edited in place on removal, so it always syncs in full.                                                |
| `company_contacts`        | `companies_leads`           | Full table  | Which contacts belong to which company. Keyed by the company and contact pair, so it always syncs in full.                                                                                                     |
| `contact_categories`      | `lead_categories`           | Incremental | Category subscriptions a contact holds, as used by preference centres.                                                                                                                                         |
| `contact_event_log`       | `lead_event_log`            | Incremental | Audit trail of what changed on each contact and who changed it.                                                                                                                                                |
| `contact_point_changes`   | `lead_points_change_log`    | Incremental | Every point award or deduction, with what caused it.                                                                                                                                                           |
| `contact_stage_changes`   | `lead_stages_change_log`    | Incremental | Every move of a contact from one lifecycle stage to another.                                                                                                                                                   |
| `contact_company_changes` | `lead_companies_change_log` | Incremental | History of contacts being linked to and unlinked from companies.                                                                                                                                               |
| `do_not_contact`          | `lead_donotcontact`         | Incremental | Contacts that must not be contacted on a given channel, and why.                                                                                                                                               |
| `contact_devices`         | `lead_devices`              | Incremental | Devices seen for each contact, as detected from their browser.                                                                                                                                                 |
| `contact_utm_tags`        | `lead_utmtags`              | Incremental | UTM parameters recorded the times a contact arrived from a tagged link.                                                                                                                                        |
| `contact_frequency_rules` | `lead_frequencyrules`       | Incremental | Per-contact limits on how often each channel may be used.                                                                                                                                                      |
| `point_action_log`        | `point_lead_action_log`     | Full table  | Which point actions have already fired for which contact, so they do not fire twice. Keyed by the point and contact pair, so it syncs in full.                                                                 |
| `point_event_log`         | `point_lead_event_log`      | Full table  | Which point-group events have fired for which contact. Keyed by the event and contact pair, so it syncs in full.                                                                                               |
| `stage_action_log`        | `stage_lead_action_log`     | Full table  | Which stage actions have fired for which contact. Keyed by the stage and contact pair, so it syncs in full.                                                                                                    |
| `tracked_links`           | `channel_url_trackables`    | Full table  | Click totals per tracked link and channel. Holds running counters rather than individual clicks, and has no row id, so it syncs in full.                                                                       |
| `link_redirects`          | `page_redirects`            | Incremental | The tracked links themselves, with their click counters.                                                                                                                                                       |
| `text_message_stats`      | `sms_message_stats`         | Incremental | One row per text message sent to a contact.                                                                                                                                                                    |
| `push_notification_stats` | `push_notification_stats`   | Incremental | One row per web push notification sent to a contact, with its click state.                                                                                                                                     |
| `dynamic_content_stats`   | `dynamic_content_stats`     | Incremental | How often each dynamic content variant was shown to a contact.                                                                                                                                                 |
| `dynamic_content_slots`   | `dynamic_content_lead_data` | Incremental | Which dynamic content slot a contact last saw.                                                                                                                                                                 |
| `video_hits`              | `video_hits`                | Incremental | Views of videos embedded with Mautic's video tracking.                                                                                                                                                         |
| `ip_addresses`            | `ip_addresses`              | Incremental | The IP addresses every other table refers to by ip\_id, with whatever geolocation Mautic resolved for them.                                                                                                    |
| `audit_log`               | `audit_log`                 | Incremental | Mautic's own audit trail of who changed what across the instance.                                                                                                                                              |
| `focus_stats`             | `focus_stats`               | Incremental | Views and interactions with Focus items — the pop-ups, notices and banners Mautic injects into a page. Present on Mautic 5 and removed in later versions, where this stream simply reports itself unavailable. |
| `tweet_stats`             | `tweet_stats`               | Incremental | Tweets Mautic sent on a contact's behalf. Present on Mautic 5 and removed in later versions, where this stream simply reports itself unavailable.                                                              |
| `webhook_logs`            | `webhook_logs`              | Incremental | Delivery attempts of the instance's outgoing webhooks.                                                                                                                                                         |

<Note>
  A stream can come back empty because the table does not exist on your version of Mautic, or because the role behind this connection may not read it. Either way the run log names the stream and says which of the two it was, so nothing fails silently. `focus_stats` and `tweet_stats` are the common case: they exist on Mautic 5 and were removed in later versions.
</Note>

## Fields by stream

<AccordionGroup>
  <Accordion title="Contacts">
    People known to Mautic, with their built-in and custom fields.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the contact
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `points` - Current point score of the contact, as awarded by point actions and triggers
    * `last_active` - Date and time the contact was last seen doing anything Mautic tracks
    * `date_identified` - Date and time an anonymous visitor became an identified contact. Empty while the contact is still anonymous
    * `color` - Hex colour a point trigger assigned to the contact, used to highlight it in the Mautic interface
    * `owner_id` - Identifier of the Mautic user who owns the contact
    * `owner_username` - Login name of the Mautic user who owns the contact
    * `owner_first_name` - Given name of the Mautic user who owns the contact
    * `owner_last_name` - Family name of the Mautic user who owns the contact
    * `title` - Honorific or salutation, such as Mr or Dr
    * `firstname` - Given name of the contact
    * `lastname` - Family name of the contact
    * `company` - Free-text company name on the contact itself, which is separate from the company records the contact is linked to
    * `position` - Job title of the contact
    * `email` - Primary email address of the contact
    * `mobile` - Mobile phone number of the contact
    * `phone` - Landline phone number of the contact
    * `fax` - Fax number of the contact
    * `address1` - First line of the contact's address
    * `address2` - Second line of the contact's address
    * `city` - City of the contact's address
    * `state` - State, province or region of the contact's address
    * `zipcode` - Postal code of the contact's address
    * `country` - Country of the contact's address
    * `preferred_locale` - Locale the contact prefers to be contacted in
    * `timezone` - Timezone recorded for the contact
    * `attribution` - Monetary value attributed to the contact by the campaigns and points configuration
    * `attribution_date` - Date the attribution value was assigned
    * `website` - Website of the contact
    * `facebook` - Facebook handle of the contact
    * `foursquare` - Foursquare handle of the contact
    * `instagram` - Instagram handle of the contact
    * `linkedin` - LinkedIn handle of the contact
    * `skype` - Skype handle of the contact
    * `twitter` - Twitter handle of the contact
    * `fields` - Every contact field and its value, as a JSON object keyed by field alias. This is the complete set for this instance, so it also carries any custom field added locally that has no column of its own
    * `tags` - Tags applied to the contact (JSON array)
    * `utmtags` - UTM parameters recorded for the contact (JSON array of objects)
    * `do_not_contact` - Channels the contact must not be contacted on, with the reason for each (JSON array of objects)
    * `ip_addresses` - IP addresses seen for the contact, with any geolocation details Mautic resolved (JSON object keyed by address)
  </Accordion>

  <Accordion title="Companies">
    Organizations known to Mautic, with their built-in and custom fields.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the company
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `score` - Score assigned to the company by Mautic's company scoring
    * `owner_id` - Identifier of the Mautic user who owns the company
    * `owner_username` - Login name of the Mautic user who owns the company
    * `owner_first_name` - Given name of the Mautic user who owns the company
    * `owner_last_name` - Family name of the Mautic user who owns the company
    * `companyname` - Name of the company
    * `companyemail` - Email address of the company
    * `companyphone` - Phone number of the company
    * `companywebsite` - Website of the company
    * `companyaddress1` - First line of the company's address
    * `companyaddress2` - Second line of the company's address
    * `companycity` - City of the company's address
    * `companystate` - State, province or region of the company's address
    * `companyzipcode` - Postal code of the company's address
    * `companycountry` - Country of the company's address
    * `companyindustry` - Business sector the company operates in
    * `companydescription` - Free-text description of the company
    * `companynumber_of_employees` - Headcount recorded for the company
    * `companyannual_revenue` - Annual revenue recorded for the company
    * `companyfax` - Fax number of the company
    * `fields` - Every company field and its value, as a JSON object keyed by field alias, including any custom field added on this instance
  </Accordion>

  <Accordion title="Campaigns">
    Automation campaigns and the event tree that drives each one.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the campaign
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `publish_up` - Date and time from which the record becomes active
    * `publish_down` - Date and time from which the record stops being active
    * `category_id` - Identifier of the category the record is filed under
    * `category_title` - Name of the category the record is filed under
    * `category_alias` - URL-safe alias of the category the record is filed under
    * `name` - Name of the campaign
    * `description` - Free-text description of the campaign
    * `alias` - URL-safe alias generated from the campaign name
    * `events` - The campaign's decisions and actions with their triggers and ordering (JSON array of objects)
  </Accordion>

  <Accordion title="Emails">
    Email templates and campaign emails, with their aggregate send counters.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the email
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `publish_up` - Date and time from which the record becomes active
    * `publish_down` - Date and time from which the record stops being active
    * `category_id` - Identifier of the category the record is filed under
    * `category_title` - Name of the category the record is filed under
    * `category_alias` - URL-safe alias of the category the record is filed under
    * `name` - Internal name of the email
    * `subject` - Subject line sent to recipients
    * `language` - Language code of the email
    * `from_address` - Address the email is sent from
    * `from_name` - Display name the email is sent from
    * `reply_to_address` - Address replies are sent to
    * `bcc_address` - Address blind-copied on every send
    * `use_owner_as_mailer` - Whether the email is sent from the contact's owner instead of the configured sender
    * `preheader_text` - Preview text shown after the subject line in most inboxes
    * `custom_html` - Rendered HTML body of the email
    * `plain_text` - Plain-text body of the email
    * `template` - Theme used to style the email
    * `email_type` - Whether the email is sent to a segment (list) or used by a campaign action (template)
    * `public_preview` - Whether the email can be viewed at a public URL
    * `read_count` - Number of times the email has been opened, counted by Mautic
    * `sent_count` - Number of times the email has been sent, counted by Mautic
    * `revision` - Revision number of the email
    * `variant_start_date` - Date the A/B test on this email started
    * `variant_sent_count` - Number of sends attributed to variants of this email
    * `variant_read_count` - Number of opens attributed to variants of this email
    * `variant_parent` - Identifier of the email this one is an A/B variant of
    * `translation_parent` - Identifier of the email this one is a translation of
    * `send_to_dnc` - Whether the email is sent to contacts marked do-not-contact
    * `utm_tags` - UTM parameters appended to links (JSON object)
    * `asset_attachments` - Assets attached to the email (JSON array)
    * `variant_children` - Identifiers of the A/B variants of this email (JSON array)
    * `translation_children` - Identifiers of the translations of this email (JSON array)
    * `dynamic_content` - Dynamic content blocks and their filters (JSON array of objects)
    * `lists` - Segments this email is sent to (JSON array of objects)
    * `headers` - Custom email headers (JSON object)
    * `settings` - Per-email settings (JSON object)
    * `grapesjsbuilder` - Configuration saved by the drag-and-drop email builder (JSON object)
    * `unsubscribe_form` - Form used as the unsubscribe page for this email (JSON object)
  </Accordion>

  <Accordion title="Forms">
    Forms, with their field definitions and submit actions.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the form
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `publish_up` - Date and time from which the record becomes active
    * `publish_down` - Date and time from which the record stops being active
    * `category_id` - Identifier of the category the record is filed under
    * `category_title` - Name of the category the record is filed under
    * `category_alias` - URL-safe alias of the category the record is filed under
    * `name` - Name of the form
    * `alias` - URL-safe alias of the form
    * `description` - Description of the form
    * `form_type` - Whether the form stands alone or belongs to a campaign
    * `template` - Theme used to style the form
    * `language` - Language code of the form
    * `in_kiosk_mode` - Whether submissions are recorded without cookie tracking or IP association, as on a shared device at an event
    * `render_style` - Whether Mautic includes its own CSS when rendering the form
    * `post_action` - What happens after a submission: nothing, a redirect, or a message
    * `post_action_property` - The redirect URL or the success message that goes with the post action
    * `no_index` - Whether the form page asks search engines not to index it
    * `form_attributes` - Custom HTML attributes added to the form tag
    * `submission_limit` - Maximum number of submissions the form accepts. Empty means unlimited
    * `submission_limit_message` - Message shown once the submission limit is reached
    * `submission_count` - Number of submissions recorded for the form
    * `cached_html` - The HTML and CSS Mautic generated for the form
    * `fields` - Field definitions of the form, including type, validation and the contact field each one maps to (JSON object keyed by field alias)
    * `actions` - Actions run when the form is submitted (JSON object keyed by action alias)
  </Accordion>

  <Accordion title="Segments">
    Contact segments and the filters that define their membership.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the segment
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `category_id` - Identifier of the category the record is filed under
    * `category_title` - Name of the category the record is filed under
    * `category_alias` - URL-safe alias of the category the record is filed under
    * `name` - Internal name of the segment
    * `public_name` - Name shown to contacts where the segment is public
    * `alias` - URL-safe alias of the segment
    * `description` - Description of the segment
    * `is_global` - Whether every Mautic user can use the segment, rather than only the user who created it
    * `is_preference_center` - Whether contacts can subscribe to the segment themselves from a preference centre
    * `filters` - Rules that decide which contacts belong to the segment (JSON array of objects). Membership itself is in the segment\_memberships stream
  </Accordion>

  <Accordion title="Assets">
    Downloadable files hosted or linked by Mautic.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the asset
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `publish_up` - Date and time from which the record becomes active
    * `publish_down` - Date and time from which the record stops being active
    * `category_id` - Identifier of the category the record is filed under
    * `category_title` - Name of the category the record is filed under
    * `category_alias` - URL-safe alias of the category the record is filed under
    * `title` - Title of the asset
    * `description` - Description of the asset
    * `alias` - URL-safe alias of the asset
    * `language` - Language code of the asset
    * `download_count` - Total number of downloads, counting repeat downloads by the same contact
    * `unique_download_count` - Number of distinct contacts who downloaded the asset
    * `revision` - Revision number of the asset
    * `extension` - File extension of the asset
    * `mime` - MIME type of the asset
    * `size` - File size of the asset in bytes
    * `download_url` - Public URL the asset is served at
  </Accordion>

  <Accordion title="Notes">
    Notes people write on a contact's timeline.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the note
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `contact_id` - Identifier of the contact the note is attached to
    * `text` - Body of the note, which may contain HTML
    * `type` - Kind of note: general, email, call or meeting
    * `date_time` - Date and time the note refers to, which the author sets and which can differ from when the note was written
  </Accordion>

  <Accordion title="Stages">
    Lifecycle stages a contact can be moved through.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the stage
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `publish_up` - Date and time from which the record becomes active
    * `publish_down` - Date and time from which the record stops being active
    * `category_id` - Identifier of the category the record is filed under
    * `category_title` - Name of the category the record is filed under
    * `category_alias` - URL-safe alias of the category the record is filed under
    * `name` - Name of the stage
    * `description` - Description of the stage
    * `weight` - Position of the stage in the lifecycle. Mautic requires it to be unique across stages, so it orders them
  </Accordion>

  <Accordion title="Tags">
    Tags available to label contacts.

    **Key:** `id` — **Sync:** full table

    **Fields:**

    * `id` - Unique identifier of the tag
    * `tag` - Text of the tag
    * `description` - Description of the tag
  </Accordion>

  <Accordion title="Categories">
    Categories used to file emails, forms, campaigns, and other records.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the category
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `title` - Name of the category
    * `alias` - URL-safe alias of the category
    * `description` - Description of the category
    * `color` - Hex colour assigned to the category
    * `bundle` - Part of Mautic the category applies to, such as email, form or campaign
  </Accordion>

  <Accordion title="Contact Fields">
    Definitions of the contact fields this instance has, including custom ones.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the field
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `publish_up` - Date and time from which the record becomes active
    * `publish_down` - Date and time from which the record stops being active
    * `label` - Name of the field as people see it
    * `alias` - Key the field's value appears under in the contacts stream's fields column
    * `description` - Description of the field
    * `type` - Kind of field, such as text, number, date, select or country
    * `group` - Group the field is shown under
    * `order` - Position of the field within its group
    * `object` - Whether the field belongs to contacts or to companies
    * `default_value` - Value used when none is given
    * `is_required` - Whether a value must be supplied
    * `is_publicly_updatable` - Whether a public request, such as the tracking pixel, may set this field
    * `is_unique_identifier` - Whether two contacts sharing this value are merged into one
    * `properties` - Type-specific configuration, such as the options of a select field (JSON object)
  </Accordion>

  <Accordion title="Point Groups">
    Point groups, which let a contact hold separate scores side by side.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the point group
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `name` - Name of the point group
    * `description` - Description of the point group
  </Accordion>

  <Accordion title="Push Notifications">
    Web push notifications defined on the instance.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the notification
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `publish_up` - Date and time from which the record becomes active
    * `publish_down` - Date and time from which the record stops being active
    * `category_id` - Identifier of the category the record is filed under
    * `category_title` - Name of the category the record is filed under
    * `category_alias` - URL-safe alias of the category the record is filed under
    * `name` - Internal name of the notification
    * `heading` - Heading shown to the recipient
    * `message` - Body shown to the recipient
    * `url` - Address opened when the notification is clicked
    * `language` - Language code of the notification
    * `read_count` - Number of times the notification was read
    * `sent_count` - Number of times the notification was sent
  </Accordion>

  <Accordion title="Text Messages">
    SMS messages defined on the instance.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the text message
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `publish_up` - Date and time from which the record becomes active
    * `publish_down` - Date and time from which the record stops being active
    * `category_id` - Identifier of the category the record is filed under
    * `category_title` - Name of the category the record is filed under
    * `category_alias` - URL-safe alias of the category the record is filed under
    * `name` - Internal name of the text message
    * `message` - Body of the text message
    * `language` - Language code of the text message
    * `sent_count` - Number of times the message was sent
  </Accordion>

  <Accordion title="Users">
    Mautic's own staff accounts, and the role each one holds.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the user
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `username` - Login name of the user
    * `first_name` - Given name of the user
    * `last_name` - Family name of the user
    * `email` - Email address of the user
    * `position` - Job title of the user
    * `timezone` - Timezone the user works in
    * `locale` - Language the interface is shown in
    * `last_login` - Date and time the user last signed in
    * `last_active` - Date and time the user was last active
    * `signature` - Email signature of the user
    * `role_id` - Identifier of the role assigned to the user
    * `role_name` - Name of the role assigned to the user
    * `role_is_admin` - Whether the role grants full access to the instance. Only an administrator can create the API credential this connector uses
  </Accordion>

  <Accordion title="Webhooks">
    Outgoing webhooks configured on the instance.

    **Key:** `id` — **Sync:** incremental on `last_changed_at`

    **Fields:**

    * `id` - Unique identifier of the webhook
    * `is_published` - Whether the record is currently published and in use
    * `date_added` - Date and time the record was created
    * `created_by` - Identifier of the Mautic user who created the record
    * `created_by_user` - Name of the Mautic user who created the record
    * `date_modified` - Date and time the record was last edited. Empty on a record that has never been edited since it was created
    * `modified_by` - Identifier of the Mautic user who last edited the record
    * `modified_by_user` - Name of the Mautic user who last edited the record
    * `last_changed_at` - Date and time the record last changed, falling back to the creation date for a record that was never edited. Derived by this connector and used as the incremental replication key
    * `category_id` - Identifier of the category the record is filed under
    * `category_title` - Name of the category the record is filed under
    * `category_alias` - URL-safe alias of the category the record is filed under
    * `name` - Name of the webhook
    * `description` - Description of the webhook
    * `webhook_url` - URL Mautic posts the payload to
    * `events_orderby_dir` - Order the batched events are sent in
    * `triggers` - Event types that make the webhook fire (JSON array)
  </Accordion>

  <Accordion title="email_stats">
    One row per email sent to a contact, with its delivery and open state. Reads Mautic's `email_stats` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the send. Rows in this table keep changing after they are created, so an incremental sync keyed on this column records each row as it was when first read. Choose a full sync for this stream if those later changes have to stay current.
    * `email_id` - Identifier of the email involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `list_id` - Identifier of the segment the send was addressed to, when it came from a segment rather than a campaign
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `email_address` - Address the email was actually sent to
    * `date_sent` - Date and time the email was sent
    * `is_read` - Whether the recipient has opened the email at least once
    * `date_read` - Date and time of the first open
    * `open_count` - Number of times the email has been opened
    * `last_opened` - Date and time of the most recent open
    * `open_details` - Details of each open, such as when and from where (JSON)
    * `is_failed` - Whether delivery failed
    * `retry_count` - Number of delivery attempts made
    * `viewed_in_browser` - Whether the recipient opened the web version instead of the email itself
    * `tracking_hash` - Unique hash identifying this send in tracking links
    * `source` - What caused this row, such as email, campaign or form — Mautic's internal source name
    * `source_id` - Identifier of the record named by source
    * `tokens` - Personalisation tokens resolved for this send (JSON object)
    * `copy_id` - Identifier of the stored copy of the message body, shared by every send of the same content
  </Accordion>

  <Accordion title="email_replies">
    Replies Mautic matched back to an email it sent. Reads Mautic's `email_stat_replies` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `stat_id` - Identifier of the send record this row refers to
    * `date_replied` - Date and time the reply arrived
    * `message_id` - Message-ID header of the reply
  </Accordion>

  <Accordion title="email_open_devices">
    Which device each email open came from. Reads Mautic's `email_stats_devices` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `stat_id` - Identifier of the send record this row refers to
    * `device_id` - Identifier of the device record involved
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `date_opened` - Date and time the email was opened
  </Accordion>

  <Accordion title="page_hits">
    Every tracked page view, on a Mautic landing page or a site carrying the tracking script. Reads Mautic's `page_hits` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the page view. Rows in this table keep changing after they are created, so an incremental sync keyed on this column records each row as it was when first read. Choose a full sync for this stream if those later changes have to stay current.
    * `page_id` - Identifier of the landing page involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `email_id` - Identifier of the email involved
    * `redirect_id` - Identifier of the tracked link involved
    * `device_id` - Identifier of the device record involved
    * `date_hit` - Date and time the page was opened
    * `date_left` - Date and time the visitor left the page. Written after the row is created, and empty when the visitor never triggered the tracking script again
    * `url` - Address involved
    * `url_title` - Title of the page that was viewed
    * `referer` - Address the visitor arrived from
    * `query` - Query string of the address (JSON object)
    * `source` - What caused this row, such as email, campaign or form — Mautic's internal source name
    * `source_id` - Identifier of the record named by source
    * `tracking_id` - Anonymous tracking cookie value of the visitor
    * `user_agent` - Browser user agent string reported by the visitor
    * `browser_languages` - Languages the visitor's browser asked for (JSON array)
    * `page_language` - Language of the page that was viewed
    * `remote_host` - Hostname resolved for the visitor's IP address
    * `city` - City resolved from the visitor's IP address
    * `region` - Region resolved from the visitor's IP address
    * `country` - Country resolved from the visitor's IP address
    * `isp` - Internet provider resolved from the visitor's IP address
    * `organization` - Organisation resolved from the visitor's IP address
    * `code` - HTTP status code returned to the visitor
  </Accordion>

  <Accordion title="form_submissions">
    One row per form submission. The submitted values themselves stay in Mautic's form results tables and are not exposed by the API. Reads Mautic's `form_submissions` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `form_id` - Identifier of the form involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `page_id` - Identifier of the landing page the form was submitted from
    * `date_submitted` - Date and time the form was submitted
    * `referer` - Address the visitor arrived from
    * `tracking_id` - Anonymous tracking cookie value of the visitor
  </Accordion>

  <Accordion title="asset_downloads">
    Every download of a file hosted as a Mautic asset. Reads Mautic's `asset_downloads` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `asset_id` - Identifier of the asset involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `email_id` - Identifier of the email involved
    * `date_download` - Date and time the file was downloaded
    * `code` - HTTP status code returned to the visitor
    * `referer` - Address the visitor arrived from
    * `source` - What caused this row, such as email, campaign or form — Mautic's internal source name
    * `source_id` - Identifier of the record named by source
    * `tracking_id` - Anonymous tracking cookie value of the visitor
    * `utm_source` - Value of the utm\_source column in asset\_downloads
    * `utm_medium` - Value of the utm\_medium column in asset\_downloads
    * `utm_campaign` - Value of the utm\_campaign column in asset\_downloads
    * `utm_content` - Value of the utm\_content column in asset\_downloads
    * `utm_term` - Value of the utm\_term column in asset\_downloads
  </Accordion>

  <Accordion title="campaign_event_log">
    Every campaign step taken for a contact, including steps still scheduled. Reads Mautic's `campaign_lead_event_log` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `campaign_id` - Identifier of the campaign involved
    * `event_id` - Identifier of the event involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `channel` - Channel involved, such as email, sms or notification
    * `channel_id` - Identifier of the record within that channel
    * `date_triggered` - Date and time the step actually ran. Empty while it is still scheduled
    * `trigger_date` - Date and time the step is due to run
    * `is_scheduled` - Whether the step is still waiting to run
    * `system_triggered` - Whether Mautic ran the step by itself rather than a person forcing it
    * `non_action_path_taken` - Whether the contact followed the negative branch of a decision
    * `rotation` - Which pass through the campaign this row belongs to, for campaigns a contact can re-enter
    * `metadata` - Details of the step's outcome (JSON object)
  </Accordion>

  <Accordion title="campaign_memberships">
    Which contacts are in which campaign. Keyed by the campaign and contact pair rather than by a row id, and edited in place when someone leaves, so it always syncs in full. Reads Mautic's `campaign_leads` table.

    **Key:** `campaign_id`, `lead_id` — **Sync:** full table

    **Fields:**

    * `campaign_id` - Identifier of the campaign involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `date_added` - Date and time the contact entered the campaign
    * `date_last_exited` - Date and time the contact last left the campaign
    * `manually_added` - Whether someone added this link by hand rather than it being applied by a filter
    * `manually_removed` - Whether someone removed this link by hand even though a filter still matches
    * `rotation` - Number of times the contact has gone through the campaign
  </Accordion>

  <Accordion title="segment_memberships">
    Which contacts are in which segment. Keyed by the segment and contact pair rather than by a row id, and edited in place on removal, so it always syncs in full. Reads Mautic's `lead_lists_leads` table.

    **Key:** `leadlist_id`, `lead_id` — **Sync:** full table

    **Fields:**

    * `leadlist_id` - Identifier of the segment
    * `lead_id` - Identifier of the contact the row belongs to
    * `date_added` - Date and time the contact joined the segment
    * `manually_added` - Whether someone added this link by hand rather than it being applied by a filter
    * `manually_removed` - Whether someone removed this link by hand even though a filter still matches
  </Accordion>

  <Accordion title="company_contacts">
    Which contacts belong to which company. Keyed by the company and contact pair, so it always syncs in full. Reads Mautic's `companies_leads` table.

    **Key:** `company_id`, `lead_id` — **Sync:** full table

    **Fields:**

    * `company_id` - Identifier of the company involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `date_added` - Date and time the contact was linked to the company
    * `is_primary` - Whether this is the contact's main company
    * `manually_added` - Whether someone added this link by hand rather than it being applied by a filter
    * `manually_removed` - Whether someone removed this link by hand even though a filter still matches
  </Accordion>

  <Accordion title="contact_categories">
    Category subscriptions a contact holds, as used by preference centres. Reads Mautic's `lead_categories` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `lead_id` - Identifier of the contact the row belongs to
    * `category_id` - Identifier of the category involved
    * `date_added` - Date and time the row was recorded
    * `manually_added` - Whether someone added this link by hand rather than it being applied by a filter
    * `manually_removed` - Whether someone removed this link by hand even though a filter still matches
  </Accordion>

  <Accordion title="contact_event_log">
    Audit trail of what changed on each contact and who changed it. Reads Mautic's `lead_event_log` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `lead_id` - Identifier of the contact the row belongs to
    * `action` - Action performed, such as create, update or delete
    * `bundle` - Part of Mautic the action happened in
    * `object` - Kind of record the action applied to
    * `object_id` - Identifier of the record the action applied to
    * `properties` - What the change was, before and after (JSON object)
    * `user_id` - Identifier of the Mautic user who performed the action
    * `user_name` - Name of the Mautic user who performed the action
    * `date_added` - Date and time the row was recorded
  </Accordion>

  <Accordion title="contact_point_changes">
    Every point award or deduction, with what caused it. Reads Mautic's `lead_points_change_log` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `lead_id` - Identifier of the contact the row belongs to
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `type` - Internal type of the change
    * `event_name` - Human-readable name of the event that caused the change
    * `action_name` - Human-readable name of the action that caused the change
    * `delta` - Points added, or removed when negative
    * `group_id` - Identifier of the point group the change belongs to, when the instance keeps separate scores side by side
    * `date_added` - Date and time the points changed
  </Accordion>

  <Accordion title="contact_stage_changes">
    Every move of a contact from one lifecycle stage to another. Reads Mautic's `lead_stages_change_log` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `lead_id` - Identifier of the contact the row belongs to
    * `stage_id` - Identifier of the stage involved
    * `event_name` - Human-readable name of the event that caused the change
    * `action_name` - Human-readable name of the action that caused the change
    * `date_added` - Date and time the stage changed
  </Accordion>

  <Accordion title="contact_company_changes">
    History of contacts being linked to and unlinked from companies. Reads Mautic's `lead_companies_change_log` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `lead_id` - Identifier of the contact the row belongs to
    * `company_id` - Identifier of the company involved
    * `type` - Internal type of the change
    * `event_name` - Human-readable name of the event that caused the change
    * `action_name` - Human-readable name of the action that caused the change
    * `date_added` - Date and time the row was recorded
  </Accordion>

  <Accordion title="do_not_contact">
    Contacts that must not be contacted on a given channel, and why. Reads Mautic's `lead_donotcontact` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `lead_id` - Identifier of the contact the row belongs to
    * `channel` - Channel involved, such as email, sms or notification
    * `channel_id` - Identifier of the record within that channel
    * `reason` - Why contact is blocked, as Mautic's own code: 1 unsubscribed, 2 bounced, 3 marked as spam
    * `comments` - Free-text note recorded with the block
    * `date_added` - Date and time the block was recorded
  </Accordion>

  <Accordion title="contact_devices">
    Devices seen for each contact, as detected from their browser. Reads Mautic's `lead_devices` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `lead_id` - Identifier of the contact the row belongs to
    * `client_info` - Everything detected about the browser (JSON object)
    * `device` - Kind of device, such as desktop, smartphone or tablet
    * `device_brand` - Manufacturer of the device
    * `device_model` - Model of the device
    * `device_os_name` - Operating system of the device
    * `device_os_platform` - Platform of the operating system
    * `device_os_shortname` - Short code of the operating system
    * `device_os_version` - Version of the operating system
    * `device_fingerprint` - Fingerprint used to recognise the device again
    * `tracking_id` - Anonymous tracking cookie value of the visitor
    * `date_added` - Date and time the row was recorded
  </Accordion>

  <Accordion title="contact_utm_tags">
    UTM parameters recorded the times a contact arrived from a tagged link. Reads Mautic's `lead_utmtags` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `lead_id` - Identifier of the contact the row belongs to
    * `utm_source` - Value of the utm\_source parameter
    * `utm_medium` - Value of the utm\_medium parameter
    * `utm_campaign` - Value of the utm\_campaign parameter
    * `utm_content` - Value of the utm\_content parameter
    * `utm_term` - Value of the utm\_term parameter
    * `url` - Address involved
    * `referer` - Address the visitor arrived from
    * `query` - Query string of the address (JSON object)
    * `remote_host` - Hostname resolved for the visitor's IP address
    * `user_agent` - Browser user agent string reported by the visitor
    * `date_added` - Date and time the row was recorded
  </Accordion>

  <Accordion title="contact_frequency_rules">
    Per-contact limits on how often each channel may be used. Reads Mautic's `lead_frequencyrules` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `lead_id` - Identifier of the contact the row belongs to
    * `channel` - Channel involved, such as email, sms or notification
    * `frequency_number` - How many messages are allowed in the period
    * `frequency_time` - Length of the period, such as DAY, WEEK or MONTH
    * `preferred_channel` - Whether this is the contact's preferred channel
    * `pause_from_date` - Start of a period the contact asked not to be contacted in
    * `pause_to_date` - End of that period
    * `date_added` - Date and time the row was recorded
  </Accordion>

  <Accordion title="point_action_log">
    Which point actions have already fired for which contact, so they do not fire twice. Keyed by the point and contact pair, so it syncs in full. Reads Mautic's `point_lead_action_log` table.

    **Key:** `point_id`, `lead_id` — **Sync:** full table

    **Fields:**

    * `point_id` - Identifier of the point action
    * `lead_id` - Identifier of the contact the row belongs to
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `date_fired` - Date and time the rule fired for this contact
  </Accordion>

  <Accordion title="point_event_log">
    Which point-group events have fired for which contact. Keyed by the event and contact pair, so it syncs in full. Reads Mautic's `point_lead_event_log` table.

    **Key:** `event_id`, `lead_id` — **Sync:** full table

    **Fields:**

    * `event_id` - Identifier of the event involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `date_fired` - Date and time the rule fired for this contact
  </Accordion>

  <Accordion title="stage_action_log">
    Which stage actions have fired for which contact. Keyed by the stage and contact pair, so it syncs in full. Reads Mautic's `stage_lead_action_log` table.

    **Key:** `stage_id`, `lead_id` — **Sync:** full table

    **Fields:**

    * `stage_id` - Identifier of the stage involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `date_fired` - Date and time the rule fired for this contact
  </Accordion>

  <Accordion title="tracked_links">
    Click totals per tracked link and channel. Holds running counters rather than individual clicks, and has no row id, so it syncs in full. Reads Mautic's `channel_url_trackables` table.

    **Key:** `channel`, `channel_id`, `redirect_id` — **Sync:** full table

    **Fields:**

    * `channel` - Channel involved, such as email, sms or notification
    * `channel_id` - Identifier of the record within that channel
    * `redirect_id` - Identifier of the tracked link involved
    * `hits` - Total clicks on the link, counting repeats
    * `unique_hits` - Number of distinct contacts who clicked the link
  </Accordion>

  <Accordion title="link_redirects">
    The tracked links themselves, with their click counters. Reads Mautic's `page_redirects` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the link. Rows in this table keep changing after they are created, so an incremental sync keyed on this column records each row as it was when first read. Choose a full sync for this stream if those later changes have to stay current.
    * `redirect_id` - Public token the redirect URL is built from
    * `url` - Address the link sends the visitor to
    * `hits` - Total clicks on the link, counting repeats
    * `unique_hits` - Number of distinct contacts who clicked the link
    * `is_published` - Whether the link is active
    * `date_added` - Date and time the row was recorded
    * `date_modified` - Date and time the link was last edited
    * `created_by` - Identifier of the Mautic user who created the link
    * `created_by_user` - Name of the Mautic user who created the link
    * `modified_by` - Identifier of the Mautic user who last edited the link
    * `modified_by_user` - Name of the Mautic user who last edited the link
    * `checked_out` - Date and time the link was locked for editing
    * `checked_out_by` - Identifier of the Mautic user editing the link
    * `checked_out_by_user` - Name of the Mautic user editing the link
  </Accordion>

  <Accordion title="text_message_stats">
    One row per text message sent to a contact. Reads Mautic's `sms_message_stats` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `sms_id` - Identifier of the text message involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `list_id` - Identifier of the segment the send was addressed to, when it came from a segment rather than a campaign
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `date_sent` - Date and time the message was sent
    * `source` - What caused this row, such as email, campaign or form — Mautic's internal source name
    * `source_id` - Identifier of the record named by source
    * `tokens` - Personalisation tokens resolved for this send (JSON object)
    * `tracking_hash` - Unique hash identifying this send in tracking links
    * `is_failed` - Value of the is\_failed column in sms\_message\_stats
    * `details` - Value of the details column in sms\_message\_stats
  </Accordion>

  <Accordion title="push_notification_stats">
    One row per web push notification sent to a contact, with its click state. Reads Mautic's `push_notification_stats` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the send. Rows in this table keep changing after they are created, so an incremental sync keyed on this column records each row as it was when first read. Choose a full sync for this stream if those later changes have to stay current.
    * `notification_id` - Identifier of the push notification involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `list_id` - Identifier of the segment the send was addressed to, when it came from a segment rather than a campaign
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `date_sent` - Date and time the notification was sent
    * `date_read` - Date and time the notification was displayed
    * `is_clicked` - Whether the recipient clicked the notification
    * `date_clicked` - Date and time of the first click
    * `click_count` - Number of times the notification was clicked
    * `last_clicked` - Date and time of the most recent click
    * `click_details` - Details of each click (JSON)
    * `retry_count` - Number of delivery attempts made
    * `source` - What caused this row, such as email, campaign or form — Mautic's internal source name
    * `source_id` - Identifier of the record named by source
    * `tokens` - Personalisation tokens resolved for this send (JSON object)
    * `tracking_hash` - Unique hash identifying this send in tracking links
  </Accordion>

  <Accordion title="dynamic_content_stats">
    How often each dynamic content variant was shown to a contact. Reads Mautic's `dynamic_content_stats` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row. Rows in this table keep changing after they are created, so an incremental sync keyed on this column records each row as it was when first read. Choose a full sync for this stream if those later changes have to stay current.
    * `dynamic_content_id` - Identifier of the dynamic content block involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `date_sent` - Date and time the variant was first shown
    * `last_sent` - Date and time the variant was most recently shown
    * `sent_count` - Number of times the variant was shown
    * `sent_details` - Details of each display (JSON)
    * `source` - What caused this row, such as email, campaign or form — Mautic's internal source name
    * `source_id` - Identifier of the record named by source
    * `tokens` - Personalisation tokens resolved for this send (JSON object)
  </Accordion>

  <Accordion title="dynamic_content_slots">
    Which dynamic content slot a contact last saw. Reads Mautic's `dynamic_content_lead_data` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `dynamic_content_id` - Identifier of the dynamic content block involved
    * `lead_id` - Identifier of the contact the row belongs to
    * `slot` - Name of the slot on the page or email
    * `date_added` - Date and time the row was recorded
  </Accordion>

  <Accordion title="video_hits">
    Views of videos embedded with Mautic's video tracking. Reads Mautic's `video_hits` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `lead_id` - Identifier of the contact the row belongs to
    * `ip_id` - Identifier of the IP address record involved, which resolves against the ip\_addresses stream
    * `channel` - Channel involved, such as email, sms or notification
    * `channel_id` - Identifier of the record within that channel
    * `guid` - Identifier of the viewing session
    * `url` - Address involved
    * `date_hit` - Date and time the video started playing
    * `date_left` - Date and time the viewer left
    * `duration` - Total length of the video in seconds
    * `time_watched` - Seconds of the video actually watched
    * `referer` - Address the visitor arrived from
    * `query` - Query string of the address (JSON object)
    * `user_agent` - Browser user agent string reported by the visitor
    * `browser_languages` - Languages the visitor's browser asked for (JSON array)
    * `page_language` - Language of the page that was viewed
    * `remote_host` - Hostname resolved for the visitor's IP address
    * `city` - City resolved from the visitor's IP address
    * `region` - Region resolved from the visitor's IP address
    * `country` - Country resolved from the visitor's IP address
    * `isp` - Internet provider resolved from the visitor's IP address
    * `organization` - Organisation resolved from the visitor's IP address
    * `code` - HTTP status code returned to the visitor
  </Accordion>

  <Accordion title="ip_addresses">
    The IP addresses every other table refers to by ip\_id, with whatever geolocation Mautic resolved for them. Reads Mautic's `ip_addresses` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `ip_address` - The IP address itself
    * `ip_details` - Geolocation resolved for the address: city, region, country, provider and coordinates (JSON object)
  </Accordion>

  <Accordion title="audit_log">
    Mautic's own audit trail of who changed what across the instance. Reads Mautic's `audit_log` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `bundle` - Part of Mautic the action happened in
    * `object` - Kind of record the action applied to
    * `object_id` - Identifier of the record the action applied to
    * `action` - Action performed, such as create, update or delete
    * `details` - What changed, before and after (JSON object)
    * `user_id` - Identifier of the Mautic user who performed the action
    * `user_name` - Name of the Mautic user who performed the action
    * `ip_address` - IP address the change was made from
    * `date_added` - Date and time the row was recorded
  </Accordion>

  <Accordion title="focus_stats">
    Views and interactions with Focus items — the pop-ups, notices and banners Mautic injects into a page. Present on Mautic 5 and removed in later versions, where this stream simply reports itself unavailable. Reads Mautic's `focus_stats` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `focus_id` - Identifier of the Focus item
    * `lead_id` - Identifier of the contact the row belongs to
    * `type` - What the contact did, such as view or click
    * `type_id` - Identifier of the record that interaction refers to
    * `date_added` - Date and time the row was recorded
  </Accordion>

  <Accordion title="tweet_stats">
    Tweets Mautic sent on a contact's behalf. Present on Mautic 5 and removed in later versions, where this stream simply reports itself unavailable. Reads Mautic's `tweet_stats` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `tweet_id` - Identifier of the tweet template in Mautic
    * `lead_id` - Identifier of the contact the row belongs to
    * `twitter_tweet_id` - Identifier the network gave the posted tweet
    * `handle` - Account the tweet was addressed to
    * `date_sent` - Date and time the tweet was sent
    * `is_failed` - Whether sending failed
    * `retry_count` - Number of delivery attempts made
    * `favorite_count` - Number of favourites the tweet received
    * `retweet_count` - Number of retweets the tweet received
    * `response_details` - What the network answered (JSON)
    * `source` - What caused this row, such as email, campaign or form — Mautic's internal source name
    * `source_id` - Identifier of the record named by source
  </Accordion>

  <Accordion title="webhook_logs">
    Delivery attempts of the instance's outgoing webhooks. Reads Mautic's `webhook_logs` table.

    **Key:** `id` — **Sync:** incremental on `id`

    **Fields:**

    * `id` - Unique identifier of the row
    * `webhook_id` - Identifier of the webhook involved
    * `status_code` - HTTP status the receiving endpoint returned
    * `runtime` - How long the delivery took, in seconds
    * `note` - Error text recorded when the delivery failed
    * `date_added` - Date and time the row was recorded
  </Accordion>
</AccordionGroup>
