# Content Updates

The Content Updates tab in Analytics gives you visibility into your content publishing activity. Every time a page is published or refreshed through AirOps, the content update is recorded and surfaced here, so you can measure output, correlate content changes with performance shifts, and find pages that need attention.

Content updates are captured automatically when you use native CMS integration steps in workflows or Grid exports. For custom integrations (Code steps, API calls), you can log content updates explicitly using the [Track Content Update](https://docs.airops.com/actions/workflow-concepts/workflow-steps/content-updates/track-content-update) workflow step, the [Content Updates API](https://docs.airops.com/api-reference/api-reference/brand-kits/content_updates), or the `track_aeo_page_content_update` MCP tool.

***

## How Content Updates Are Captured

| Source                         | How it works                                                                                          | Action required                   |
| ------------------------------ | ----------------------------------------------------------------------------------------------------- | --------------------------------- |
| **Native CMS step (workflow)** | Automatically detected when a supported CMS step creates or updates content                           | None                              |
| **Grid export**                | Automatically detected when exporting rows to a supported CMS via Grid                                | None                              |
| **Track Content Update step**  | Manually added to a workflow to record a content update                                               | Add step and configure URL + type |
| **MCP**                        | The `track_aeo_page_content_update` tool records content updates from any MCP client                  | Call the tool with URL and type   |
| **Public API**                 | `POST /public_api/brand_kits/{brand_kit_id}/content_updates` creates content updates programmatically | Send API request                  |

***

## Automatic Detection from CMS Integrations

When a workflow uses a native CMS step to create or update content, AirOps captures the content update automatically. The system resolves the page URL from the CMS API response and determines whether the action was a publish or refresh.

### Supported integrations in workflows

| Integration   | Publish (new page)                | Refresh (update)                  |
| ------------- | --------------------------------- | --------------------------------- |
| **Webflow**   | Create collection item            | Update collection item            |
| **WordPress** | Create post                       | Update post                       |
| **Shopify**   | Create article, Create collection | Update product, Update collection |
| **Ghost**     | Create post, Publish post         | Update post                       |

### Supported integrations in Grid exports

| Integration   | Publish        | Refresh             |
| ------------- | -------------- | ------------------- |
| **Webflow**   | New row export | Existing row update |
| **WordPress** | New row export | Existing row update |

{% hint style="warning" %}
Only the integrations listed above support automatic detection. Other CMS integrations (Builder.io, ContentStack, Contentful, Craft CMS, Framer, HubSpot CMS, Sanity, Strapi, Storyblok) do not track content updates automatically. For workflows that publish content through these or any unsupported integration, add a [Track Content Update](https://docs.airops.com/actions/workflow-concepts/workflow-steps/content-updates/track-content-update) step after the CMS step to record the content update manually.
{% endhint %}

***

## Types

| Type               | Meaning                                  |
| ------------------ | ---------------------------------------- |
| **Page Published** | A new page was created and published     |
| **Page Refreshed** | An existing page had its content updated |

***

## Brand Kit Association

Every content update requires the page URL to match a domain configured in your workspace's Brand Kit. AirOps checks the URL domain against all Brand Kit domains and brand URLs automatically. No manual Brand Kit selection is needed.

If no match is found, automatic detection silently skips the content update. Manual sources (Track Content Update step, API, MCP) return an error so you can correct the URL.

***

## Content Updates Dashboard

The Content Updates tab in Analytics shows two main views:

### Updates Over Time

A line chart with daily counts of publish and refresh content updates over the selected date range. Each type has its own line, so you can see publishing velocity and refresh cadence at a glance.

### Content Updates History

A sortable, filterable table with the following columns:

| Column       | Description                                                    |
| ------------ | -------------------------------------------------------------- |
| **Type**     | Page Published or Page Refreshed                               |
| **Source**   | Where the content update originated (workflow, grid, api, mcp) |
| **URL**      | The page URL associated with the content update                |
| **Date**     | When the content update was recorded                           |
| **Metadata** | Key-value pairs with additional context                        |

Bulk selection and deletion are supported for cleanup.

***

## Content Updates in the Page Detail View

When viewing a page's detail view, a **Related Content Updates** card appears at the bottom showing all content updates whose URL matches that page. This gives you a timeline of every publish and refresh for that specific page, with columns for type, source, date, and metadata.

***

## Last Refreshed and Stale Pages

The [Pages](https://docs.airops.com/insights/pages) table includes a **Last Refreshed** column showing how long ago the most recent content update was recorded for each page (for example, "6 months ago"). This column is only visible while a stale pages filter is active.

Use the **Stale Pages** smart filter to surface pages whose most recent content update is older than 6 months. Additional filter presets are available: over 1 month, 3 months, 6 months, and 1 year. Pages with no content update record are not included in the filtered results.

***

## Content Update Metadata

Each content update can carry metadata, which are key-value pairs providing additional context about the content update.

### System metadata

Automatically attached to every content update:

| Key                              | Description                                                      |
| -------------------------------- | ---------------------------------------------------------------- |
| `airops_app_id`                  | The workflow ID that generated the content update                |
| `airops_app_type`                | The type of AirOps app (e.g., workflow)                          |
| `airops_execution_id`            | The workflow execution ID                                        |
| `airops_integration_page_status` | The page status reported by the CMS (e.g., `published`, `draft`) |
| `airops_grid_table_id`           | The Grid table ID (for Grid export content updates)              |

### Custom attributes

You can add your own key-value pairs (up to 20 per content update) when using the Track Content Update step, API, or MCP. In the Track Content Update step, both keys and values support [Liquid templating](https://docs.airops.com/actions/workflow-concepts/liquid-template).

***

## Programmatic Access

Create, list, and retrieve content updates programmatically using the [Content Updates API](https://docs.airops.com/api-reference/api-reference/brand-kits/content_updates). Content updates created via the API have source `api`. The URL must match a Brand Kit domain in your workspace.

The `track_aeo_page_content_update` and `list_aeo_page_content_updates` MCP tools provide the same capabilities from any MCP-compatible client.
