safely managing multiple scheduled updates at once
As soon as multiple campaigns with overlapping time windows are being prepared at once, a single scheduled update in Content Staging stops being enough. With a clear structure for parallel staging updates, conflict detection and an approval process, campaign planning stays manageable even with several running actions at the same time.
Table of contents
- 1. Why a single scheduled update often is not enough
- 2. How Content Staging represents updates technically
- 3. Creating multiple parallel updates on the same entity
- 4. Detecting conflicts: overlapping windows and target entities
- 5. Preview mode: testing campaigns before they go live
- 6. Cron processing: how updates are applied automatically
- 7. Rollout strategy for multi-stage campaigns
- 8. Monitoring and alerting on failed updates
- 9. Planning approaches compared
- 10. Summary
- 11. FAQ
1. Why a single scheduled update often is not enough
Magento Commerce lets you create a category or product change as a scheduled update in Content Staging, with a defined start and end time. For a single, isolated action this works reliably. But once marketing has a summer campaign, a parallel newsletter action and an already-prepared autumn campaign in the system at the same time, partially overlapping in schedule, managing multiple Content Staging updates on the same entities quickly becomes confusing.
The core problem is not the technology of Magento itself, which does manage multiple updates in parallel just fine, but the lack of overview and conflict detection in the standard backend. Without additional tooling, an editor often only notices at go-live time that two scheduled updates on the same category collide and overwrite each other. A well thought out structure for Content Staging with several simultaneous campaigns prevents exactly these surprises.
2. How Content Staging represents updates technically
Technically, Magento creates a row in the staging_update table for every scheduled update, with a start and end time and a name. Every affected entity, for example a category or a product, gets an additional row for this update with the same entity ID but a different created_in and updated_in column that points to the respective staging update ID. This principle of time-scoped valid records is known as a version-based entity model and forms the foundation that multiple parallel Content Staging updates also build on.
It matters to understand that an entity can be part of multiple not-yet-applied updates at any point in time. Only once an update is actually processed via cron does its state become the entity's current state. When two updates with overlapping time windows exist on the same entity, in practice the update processed last wins, which can lead to unexpected results without deliberate order planning.
# List all scheduled staging updates with their time range
bin/magento staging:update:list 2>/dev/null || \
bin/mysql -e "SELECT update_id, name, start_time, end_time FROM staging_update ORDER BY start_time"
# Find entities that are part of more than one active or future update
bin/mysql -e "
SELECT entity_id, COUNT(DISTINCT created_in) AS update_count
FROM catalog_category_entity_varchar
WHERE created_in > 1
GROUP BY entity_id
HAVING update_count > 1"
3. Creating multiple parallel updates on the same entity
For the practical implementation of multiple parallel campaigns, a clear naming convention for staging updates is worthwhile, for example W28-summer-sale-category-42, which makes the campaign, time window and affected entity recognizable at a glance. Without this convention, editors quickly lose track of which update belongs to which campaign once ten or more updates are scheduled at the same time.
Technically, creating multiple updates can be automated through the StagingInterface, for example when a campaign coming from an external planning tool needs to apply the same time window to several product categories at once. A custom CLI command that takes a list of entity IDs and a time window and automatically generates named staging updates from them saves considerable manual effort in the backend for large campaigns.
<?php
declare(strict_types=1);
namespace Mironsoft\ContentStagingCampaigns\Console\Command;
use Magento\Staging\Api\Data\UpdateInterfaceFactory;
use Magento\Staging\Api\UpdateRepositoryInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
/**
* Creates a named staging update for a campaign with a given time window.
*/
class CreateCampaignUpdateCommand extends Command
{
/**
* @param UpdateInterfaceFactory $updateFactory Factory for staging update entities
* @param UpdateRepositoryInterface $updateRepository Persists staging updates
*/
public function __construct(
private readonly UpdateInterfaceFactory $updateFactory,
private readonly UpdateRepositoryInterface $updateRepository,
) {
parent::__construct();
}
/**
* Configures command name and arguments.
*
* @return void
*/
protected function configure(): void
{
$this->setName('mironsoft:campaign:staging:create')
->setDescription('Creates a named staging update window for a campaign')
->addArgument('name', InputArgument::REQUIRED, 'Campaign identifier, e.g. W28-summer-sale')
->addArgument('start', InputArgument::REQUIRED, 'Start time, e.g. 2026-08-01 06:00:00')
->addArgument('end', InputArgument::REQUIRED, 'End time, e.g. 2026-08-14 23:59:00');
parent::configure();
}
/**
* Creates the staging update record with the given campaign window.
*
* @param InputInterface $input Command input
* @param OutputInterface $output Command output
* @return int Exit code
*/
protected function execute(InputInterface $input, OutputInterface $output): int
{
$update = $this->updateFactory->create();
$update->setName((string) $input->getArgument('name'));
$update->setStartTime((string) $input->getArgument('start'));
$update->setEndTime((string) $input->getArgument('end'));
$this->updateRepository->save($update);
$output->writeln(sprintf('Created staging update "%s"', $update->getName()));
return Command::SUCCESS;
}
}
4. Detecting conflicts: overlapping windows and target entities
A conflict in Content Staging occurs when two active updates change the same entity within an overlapping time window. Magento's standard admin does not proactively surface these conflicts, which is a real risk with more complex campaign setups. A custom conflict detection tool that checks, before saving a new update, whether another update with an overlapping time window already references the same entity ID closes this gap.
The check itself is a simple SQL query on the staging tables, combined with a time window overlap logic similar to what calendar booking systems use: two windows overlap exactly when the start of one is before the end of the other and vice versa. When a conflict is detected, the backend should display a clear warning with the names of the affected updates, instead of letting the editor discover the collision only at go-live time.
5. Preview mode: testing campaigns before they go live
Magento Commerce's native preview mode lets you simulate a scheduled update before it actually goes live, through a special preview link with a timestamp parameter. With multiple parallel campaigns, every preview should explicitly state which of the active updates is currently being simulated, because otherwise it is easy to get the impression that a preview shows the combined effect of all scheduled changes, when in fact only a single update is being viewed in isolation.
For a more realistic preview with overlapping campaigns, a combined preview mode that simulates several updates at once, in the order they would actually be processed, is worthwhile. This surfaces conflicts that an isolated single preview would not show, for example when a second update overwrites a price field that was also changed in the first update.
6. Cron processing: how updates are applied automatically
The actual application of a staging update is handled by the staging_updates_and_campaigns_cron cron job, which regularly checks whether the start time of a scheduled update has been reached and then applies the corresponding record as the current state. If this cron job runs late for some reason or stops running for a while, the campaign's go-live is delayed accordingly, without any error message becoming visible in the frontend.
For time-critical campaigns, for example a flash sale meant to start exactly at midnight, separate monitoring of cron execution timing is essential. A deviation of a few minutes can already mean a noticeable revenue loss in flash sale campaigns, because visitors still see the old price at the expected start time.
# Verify the staging cron job ran recently and did not fail
bin/mysql -e "SELECT job_code, status, scheduled_at, executed_at
FROM cron_schedule
WHERE job_code = 'staging_updates_and_campaigns_cron'
ORDER BY scheduled_at DESC LIMIT 5"
7. Rollout strategy for multi-stage campaigns
Some campaigns do not consist of a single jump from old to new content, but of several consecutive phases, for example a teaser phase, the actual promotion and a subsequent clearance phase. For this pattern, a chain of three consecutive Content Staging updates with directly adjacent time windows is worthwhile, instead of a single update with complex conditional logic in the template.
This chain structure has the advantage that every phase can be prepared, reviewed and shifted independently if needed, without affecting the other phases. A naming convention with a phase number, for example summer-sale-phase1-teaser, summer-sale-phase2-promotion, summer-sale-phase3-clearance, makes the relationship recognizable at a glance and considerably eases later troubleshooting.
8. Monitoring and alerting on failed updates
A staging update can fail for various reasons, for example a database deadlock during cron processing or a reindex running in parallel. Without active monitoring, nobody notices that a campaign did not go live as planned until a customer or colleague reports the error. An admin notification that checks after every cron run whether an update with a past start time is still marked as not applied closes this gap reliably.
For teams with several campaigns running at the same time, a daily dashboard listing all updates starting or ending within the next seven days, including the entities they affect, is also worthwhile. This foresight surfaces conflicts and deadlines before they become an acute problem, and replaces manually checking through several individual update forms.
9. Planning approaches compared
Depending on the number of campaigns running at the same time, different planning approaches for Content Staging fit better.
| Approach | Number of campaigns | Conflict detection | Effort |
|---|---|---|---|
| Single update, planned manually | 1 to 2 | None, purely manual | Very low |
| Naming convention + manual check | 3 to 6 | Partial, depends on discipline | Low |
| Custom conflict tool + combined preview | 7 and more | Automatic, before saving | Medium to high |
| Phase chains for multi-stage campaigns | Any, per campaign | Clear through time window separation | Medium |
For teams with occasional, isolated actions, manual planning is entirely sufficient. Once several campaigns are regularly being prepared in parallel, investing in a custom conflict detection tool and a combined preview pays off quickly, because a single overlooked conflict at go-live time is considerably more expensive than building the tool.
Mironsoft
Magento 2 & Hyvä: campaign planning and Content Staging tooling
Keeping multiple campaigns under control?
We build conflict detection, combined preview and monitoring for Content Staging, so your campaign planning stays reliable even with many parallel updates.
Conflict detection
Automatic check for overlapping updates before saving
Combined preview
Simulate several active updates at once instead of isolated single views
Monitoring
Alerts on failed or delayed updates
10. Summary
Content Staging already technically covers the foundation for multiple campaigns planned in parallel, because the underlying version-based entity model can process any number of simultaneous updates. The actual risk lies not in the technology but in the lack of overview and conflict detection in the standard backend, when multiple campaigns with overlapping time windows and overlapping target entities are prepared at the same time.
A clear naming convention, a custom conflict detection tool, a combined preview of multiple updates and active monitoring of cron processing turn this potential source of errors into a manageable tool. Teams that regularly plan several campaigns at once benefit considerably from building this structure once, instead of manually checking for collisions again for every new campaign.
Content Staging for campaigns — the essentials at a glance
Data model
Version-based entity model allows any number of parallel staging updates on the same entity.
Conflict detection
Time window overlap logic before saving checks for colliding updates on the same entity ID.
Preview
Combined preview of multiple active updates surfaces conflicts a single view would not show.
Monitoring
Admin alerts on overdue, not-yet-applied updates prevent silent campaign failures.