---
url: 'https://dxpr.com/hc/documentation/learn-dxpr-builder/advanced/content-staging'
title: 'Content staging | DXPR'
author:
  name: docs-sync
  url: 'https://dxpr.com/users/docs-sync'
date: '2026-10-23T14:31:17+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: 'Move builder content between environments'
tags:
  - 'Run it in production'
image: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
published: true
og:
  site_name: DXPR
  updated_time: '2026-10-23T14:31:17+0000'
  'image:alt': 'DXPR, powered by Drupal: AI-powered Drupal for marketers.'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      mainEntity: {  }
    -
      '@type': TechArticle
      headline: 'Content staging'
      description: 'Move builder content between environments'
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-23T14:31:17+0000'
      dateModified: '2026-10-23T14:31:17+0000'
      author:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      mainEntityOfPage: 'https://dxpr.com/hc/documentation/learn-dxpr-builder/advanced/content-staging'
      articleSection: 'Run it in production'
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/hc/documentation/learn-dxpr-builder/advanced/content-staging'
      description: 'Move builder content between environments'
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Home
            item: 'https://dxpr.com/'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: en
---
[Help Center](/hc)/[Documentation](/hc/documentation) /[Learn DXPR Builder](/hc/documentation/learn-dxpr-builder) /[Manage the site](/hc/documentation/learn-dxpr-builder/manage) /[Run it in production](/hc/documentation/learn-dxpr-builder/manage/production) # Content staging.

Move builder content between environments

 Learn DXPR BuilderManage the siteRun it in production

   ## In this guide

 Related guides

- [Backup and restore](/hc/documentation/learn-dxpr-builder/advanced/backup-restore)
- [Version control](/hc/documentation/learn-dxpr-builder/advanced/version-control)

Content staging is building and reviewing DXPR Builder pages before visitors see them. There are two ways to do it: a separate staging site whose content you move to production, or Drupal's revisions and Content Moderation on one site. This page covers both, and states exactly what a builder save does to revisions and moderation states, because that decides which approach works for you.

## What a builder save does

Every save from the editor runs these steps:

1. It loads the page's **default revision**, in the language being edited.
2. It checks that the current user may update the page.
3. It writes the new HTML into the field.
4. If the entity type has revisions, it creates a new revision and makes it the default revision. The current user becomes its author, with the log message `Saved with DXPR builder` and the request time.
5. It removes the editing lock for that page and revision, then saves the page.

The request behind a save is described under [API endpoints](/hc/documentation/learn-dxpr-builder/reference/api-endpoints).

So every save on a node or a Drag and Drop Block creates a new revision, whether or not the content type has **Create new revision** ticked, and the **Revisions** tab lists each save with the builder's log message. Drush `dxb:page:update` also creates a revision, with the log message `Updated via dxb:page:update Drush command.`

The builder has no control for a moderation state and never sets `moderation_state`. When Content Moderation is enabled on the content type, the new revision keeps the state of the revision the builder loaded, and Content Moderation applies that state's rules on save:

- A published page stays published, and the new revision goes live at once.
- An unpublished page in Draft stays in Draft.
- A page with a published default revision and a newer pending draft is a problem: the builder loads the published revision, not the draft, so a save creates a new published revision from the published content and leaves the draft's changes aside.

Use the node edit form to change states. For a review process inside one site, keep pages unpublished (Draft) while editors work on them in the builder, and publish through the form when the review is done.

## Staging site workflow

A separate staging site avoids the moderation limits above and lets stakeholders review the real page.

1. Editors build and change pages on the staging site.
2. Reviewers approve them there.
3. Move the approved content to production with one of the methods below.
4. Check the page on production as an anonymous visitor.

### Database copy

Copy the whole database from staging to production:

```bash
drush sql:sync @staging @production

```

This replaces all production content, so back up production first and expect to lose changes made on production after the copy. Files are not included; sync them as described below.

### Selective content export

To move individual pages, export the node with a module such as Default Content, including the media and files the page references, and import it on production. The builder stores its HTML in the text field, so the field value travels with the node. Image paths in the HTML point into `sites/default/files/dxpr_builder_images`, so copy those files too.

### Configuration-only deployment

If what you built is a reusable layout rather than a specific page:

1. On staging, save the layout with **More** &gt; **Save as template**on the container bar. This creates a user template.
2. Go to **DXPR Studio** &gt; **DXPR Builder** &gt; **User Templates** and choose **Create page template** in that template's operations.
3. Export configuration:

    ```bash
    drush config:export

    ```
4. Deploy the `dxpr_builder.page_template.*.yml` file and import it on production:

    ```bash
    drush config:import

    ```
5. Editors start new pages from the template on production. Page templates appear in empty containers.

## File synchronisation

Uploads from the builder go to `dxpr_builder_images`, `dxpr_builder_videos` and `dxpr_builder_files` in the site's default files directory. Sync them with the content:

```bash
rsync -avz staging:/path/to/files/ production:/path/to/files/

```

A shared file store such as S3 mounted on both environments removes this step.

## Revisions and rollback

Because every save is a revision, rolling back is a Drupal operation:

1. Open the page's **Revisions** tab.
2. Find the revision before the unwanted save; each builder save shows `Saved with DXPR builder`.
3. Click **Revert**.

Reverting creates another revision, so the history stays intact.

## Editing locks

When an editor first clicks into a container, the editor sends a `dxpr_toggle_content_lock` request to `/dxpr_builder/ajax` and the `dxpr_lock` table records the entity, revision, language and user. When another editor opens the page, the editor queries `dxpr_content_lock_status`, hides the container controls and shows a **Locked** button with the name of the lock holder. The save deletes the row. Another editor can also click **Locked** and confirm to override the lock; from then on, the last save wins.

## What's next?

- [Backup and restore](/hc/documentation/learn-dxpr-builder/advanced/backup-restore) before running a database copy.
- [Version control](/hc/documentation/learn-dxpr-builder/advanced/version-control) for deploying configuration such as page templates.