Artisan Commands
Mumara Campaigns+ includes 130+ custom artisan commands for campaign management, subscriber processing, statistics, maintenance, and system administration. This document provides a complete reference for every command.
Running Commands
# Basic usage
php artisan <command-name>
# With arguments
php artisan <command-name> <argument>
# With options
php artisan <command-name> --option-name
# See help for any command
php artisan help <command-name>
Table of Contents
| Category | Description |
|---|---|
| Campaign Sending & Scheduling | Core email sending pipeline |
| Campaign Management | Pause, resume, delete campaigns |
| Broadcast & Template Management | Templates, broadcasts, designs |
| Subscriber Import | Importing contacts into lists |
| Subscriber Management | Clean, recount, deduplicate contacts |
| List & Segment Management | Segments, exports, list copy |
| Suppression Management | Suppressed emails, domains, IPs |
| Bounce & FBL Processing | Bounce handling, feedback loops |
| Tracking & Statistics | Click, open, stats processing |
| Trigger & Automation | Triggers, drips, event queues |
| Domain & DKIM Management | Sending domains, DKIM, verification |
| SMTP Management | Auto-inactive, limit recovery |
| Export Commands | Data export (stats, lists, suppression) |
| User Management | User administration, sessions, assignment |
| Resource Cleanup (Delete) | Delete operations for various resources |
| System Maintenance | Maintenance, cleanup, optimization |
| Database Operations | Sync, alter, upgrade, optimize |
| Configuration & Setup | Settings sync, initial setup, menus |
| License Management | License insert, cloud licensing |
| Addons & Updates | Addon management, update checks |
| Storage Management | Storage restructure migration |
| Dynamic Content | Dynamic tags, RSS feeds |
| Integration & ESP | ESP modules, Zapier hooks |
Campaign Sending & Scheduling
send:campaigns
php artisan send:campaigns {schedule_campaign_id?} {thread_no?}
The core email sending command. Once a campaign is prepared, this command starts sending emails to subscribers in batches. It handles the log table, rate limiting, multi-threading, and delivery across SMTP nodes.
| Parameter | Required | Description |
|---|---|---|
schedule_campaign_id | No | Specific scheduled campaign ID to send |
thread_no | No | Thread number for multi-threaded sending |
Cron scheduled: Yes (configurable interval via email_send_cron, default: every minute)
prepare:broadcast
php artisan prepare:broadcast {schedule_campaign_id?}
Prepares a campaign before it runs. It enters all subscriber records into the log table when the campaign is scheduled and ready to proceed. This step must complete before send:campaigns can begin.
| Parameter | Required | Description |
|---|---|---|
schedule_campaign_id | No | Specific campaign schedule ID to prepare |
prepare:campaign
php artisan prepare:campaign {campaign_id}
Alternative campaign preparation command (in Sending/ namespace).
| Parameter | Required | Description |
|---|---|---|
campaign_id | Yes | Campaign ID to prepare |
schedule:evergreen
php artisan schedule:evergreen
Schedules evergreen (recurring) campaigns. Checks running campaign schedule times; if the schedule matches the current time, the campaign is queued to run in the next minute.
Cron scheduled: Yes (configurable, default: every 5 minutes)
resume:stucked-campaigns
php artisan resume:stucked-campaigns
When a campaign gets stuck due to server issues, this command checks the status and updates stuck campaigns to resume sending. Controlled by the restart_stucked_campaign_after_hours application setting.
Cron scheduled: Yes (only if restart_stucked_campaign_yes is enabled)
resume-limits:auto-inactive-campaign
php artisan resume-limits:auto-inactive-campaign
Checks campaigns that were system-paused due to sending limits (daily, monthly, or credits). If the limit quota is available again, it resumes those campaigns automatically.
Campaign Management
campaign:pause
php artisan campaign:pause {id?}
Forcefully changes a campaign's status to paused.
| Parameter | Required | Description |
|---|---|---|
id | No | Specific campaign schedule ID. If omitted, pauses all running campaigns |
campaign:resume
php artisan campaign:resume {id?}
Forcefully resumes a paused campaign.
| Parameter | Required | Description |
|---|---|---|
id | No | Specific campaign schedule ID. If omitted, resumes all paused campaigns |
campaign:delete
php artisan campaign:delete {id?}
Deletes scheduled campaigns and their associated data.
| Parameter | Required | Description |
|---|---|---|
id | No | Campaign schedule ID to delete |
Broadcast & Template Management
delete:broadcasts
php artisan delete:broadcasts {user_id?} {campaign_id?}
Deletes broadcast campaigns based on user ID or campaign ID.
| Parameter | Required | Description |
|---|---|---|
user_id | No | Filter by user |
campaign_id | No | Specific campaign to delete |
delete:scheduledbroadcasts
php artisan delete:scheduledbroadcasts {scheduled_id?} {user_id?}
Deletes all scheduled campaign data from related tables (logs, stats, etc.).
| Parameter | Required | Description |
|---|---|---|
scheduled_id | No | Specific schedule ID |
user_id | No | Filter by user |
broadcast:refreshblade
php artisan broadcast:refreshblade {id?}
Creates or refreshes Blade template files for saved broadcasts. Useful after template migration or when Blade files are out of sync.
| Parameter | Required | Description |
|---|---|---|
id | No | Specific broadcast ID. If omitted, refreshes all |
resync:templates
php artisan resync:templates
Deletes old templates and installs fresh templates for all users. Used after upgrades that include new template sets.
revert:defaultDesigns
php artisan revert:defaultDesigns
Resets webform default designs back to the factory defaults.
Subscriber Import
import:subscribers
php artisan import:subscribers
Master import command that checks for pending subscriber import jobs and executes them. This is the scheduled entry point for the import pipeline.
Cron scheduled: Yes (triggered via task queue)
start:import
php artisan start:import {file_no} {import_id}
Starts a specific subscriber import job using threaded processing.
| Parameter | Required | Description |
|---|---|---|
file_no | Yes | File slice number |
import_id | Yes | Import job ID |
rocket:import
php artisan rocket:import {import_id} {table_prefix} {file_format} {format} {is_active} {is_confirmed} {user_id} {file_field_id} {duplicates} {slices}
High-speed subscriber import using MySQL LOAD DATA INFILE for bulk inserts.
| Parameter | Required | Description |
|---|---|---|
import_id | Yes | Import job ID |
table_prefix | Yes | Database table prefix |
file_format | Yes | File format (CSV, TXT, etc.) |
format | Yes | Column format mapping |
is_active | Yes | Set subscribers as active |
is_confirmed | Yes | Set subscribers as confirmed |
user_id | Yes | Owning user ID |
file_field_id | Yes | Field mapping ID |
duplicates | Yes | Duplicate handling strategy |
slices | Yes | Number of file slices for parallel processing |
Subscriber Management
clean:subscribers
php artisan clean:subscribers {list_id?} {duplicates?}
Cleans a subscriber list by removing duplicates and invalid email addresses.
| Parameter | Required | Description |
|---|---|---|
list_id | No | Specific list to clean |
duplicates | No | Duplicate detection mode |
recount:contacts
php artisan recount:contacts {user_id?}
Recounts the total contacts for each user's lists, correcting any count mismatches in the database.
| Parameter | Required | Description |
|---|---|---|
user_id | No | Specific user to recount. If omitted, recounts all |
Cron scheduled: Yes (hourly)
list:dedupe
php artisan list:dedupe {list_id} {user_id} {duplicate_type}
Removes duplicate subscribers from a specific list.
| Parameter | Required | Description |
|---|---|---|
list_id | Yes | Target list ID |
user_id | Yes | Owning user ID |
duplicate_type | Yes | Type of deduplication logic |
delete:duplicate
php artisan delete:duplicate {list_id} {import_id} {user_id} {duplicates} {file_format}
Deletes duplicate subscriber additional data during import processing.
| Parameter | Required | Description |
|---|---|---|
list_id | Yes | List ID |
import_id | Yes | Import job ID |
user_id | Yes | User ID |
duplicates | Yes | Duplicate handling mode |
file_format | Yes | Import file format |
update:contacts
php artisan update:contacts {id}
Bulk-updates contacts for a specific import/update job.
| Parameter | Required | Description |
|---|---|---|
id | Yes | Update job ID |
verify:emails
php artisan verify:emails
Validates subscriber email addresses in lists that have verification in progress. Checks for valid MX records and SMTP responses.
Cron scheduled: Yes (triggered via task queue)
List & Segment Management
copy:list
php artisan copy:list {copy_contacts} {orig_list_id} {copy_list_ids}
Copies a list to one or more destination lists, optionally including all subscribers.
| Parameter | Required | Description |
|---|---|---|
copy_contacts | Yes | Whether to copy subscribers (1/0) |
orig_list_id | Yes | Source list ID |
copy_list_ids | Yes | Comma-separated destination list IDs |
segment:processing
php artisan segment:processing
Processes segment-related tasks including count, export, move, and recount operations from the task queue.
Cron scheduled: Yes (every 5 minutes)
segments:count
php artisan segments:count {id?} {recount?} {--prepare-multi-process} {--max-execution=} {--chunk-size=} {--force}
Recounts subscribers matching segment criteria. Can run in multi-process mode for large segments.
| Parameter | Required | Description |
|---|---|---|
id | No | Specific segment ID |
recount | No | Force recount flag |
| Option | Description |
|---|---|
--prepare-multi-process | Split work for parallel processing |
--max-execution= | Max execution time |
--chunk-size= | Records per chunk |
--force | Ignore cron timing checks |
Cron scheduled: Yes (configurable, default: daily)
segment:migrate
php artisan segment:migrate
One-time migration command to convert old segment storage format to the new format. Run after upgrading from older Mumara versions.
Delete:SegmentExportedFiles
php artisan Delete:SegmentExportedFiles {id?} {--days=2}
Deletes segment exported files older than the specified number of days.
| Parameter | Required | Description |
|---|---|---|
id | No | Specific export ID |
| Option | Default | Description |
|---|---|---|
--days | 2 | Delete files older than N days |
Suppression Management
suppress:subscribers
php artisan suppress:subscribers {--resync} {--force}
Suppresses subscribers based on suppressed email addresses and domain lists. Marks matching subscribers as suppressed across all lists.
| Option | Description |
|---|---|
--resync | Resynchronize all suppression rules |
--force | Bypass cron timing checks |
Cron scheduled: Yes (configurable, default: every 5 minutes)
suppression:import
php artisan suppression:import {import_id} {slices}
Rocket-speed suppression email import using bulk insertion.
| Parameter | Required | Description |
|---|---|---|
import_id | Yes | Suppression import job ID |
slices | Yes | Number of file slices |
normalSuppression:import
php artisan normalSuppression:import {import_id}
Standard suppression list import (non-rocket mode).
| Parameter | Required | Description |
|---|---|---|
import_id | Yes | Import job ID |
supression:emails
php artisan supression:emails {user_id?} {subscriber_id?}
Processes suppressed emails for specific users/subscribers.
| Parameter | Required | Description |
|---|---|---|
user_id | No | Filter by user |
subscriber_id | No | Specific subscriber |
delete:suppressedemails
php artisan delete:suppressedemails {user_id?} {id?}
Deletes suppressed email entries.
delete:suppresseddomains
php artisan delete:suppresseddomains {user_id?} {id?}
Deletes suppressed domain entries.
delete:suppressedips
php artisan delete:suppressedips {user_id?} {id?}
Deletes suppressed IP entries.
Bounce & FBL Processing
bounce:processing
php artisan bounce:processing {--force}
Processes bounce emails by checking all active PMTAs and mailboxes. Reads bounce messages, matches them against bounce rules, and updates subscriber statuses.
| Option | Description |
|---|---|
--force | Run immediately, ignoring the cron timing check |
Cron scheduled: Yes (configurable, default: every 6 hours)
fbl:processing
php artisan fbl:processing {--force}
Processes all feedback loop (complaint) emails. Checks FBL mailboxes, parses complaint messages, and marks subscribers accordingly.
| Option | Description |
|---|---|
--force | Run immediately, ignoring the cron timing check |
Cron scheduled: Yes (configurable, default: every 2 hours)
Tracking & Statistics
email:clicked
php artisan email:clicked {path?}
Processes JSON files stored in the private clicked/ directory. Each file represents a click event. The command reads the file, updates the database with click data, and deletes the processed file.
| Parameter | Required | Description |
|---|---|---|
path | No | Custom directory path. Defaults to the application setting or storage/app/private/clicked/ |
Cron scheduled: Yes (configurable, default: every minute)
email:opened
php artisan email:opened {path?}
Processes JSON files stored in the private opened/ directory. Each file represents an open event. The command reads the file, updates the database, and deletes the processed file.
| Parameter | Required | Description |
|---|---|---|
path | No | Custom directory path. Defaults to the application setting or storage/app/private/opened/ |
Cron scheduled: Yes (configurable, default: every minute)
track:processing
php artisan track:processing
After email:clicked and email:opened insert raw data into the track-processing table, this command processes those records — updating stats tables, incrementing counters, and recording subscriber-level events.
Cron scheduled: Yes (configurable, default: every minute)
track:processingold
php artisan track:processingold
Legacy version of track processing. Kept for backward compatibility.
stats:update
php artisan stats:update
Updates user dashboard statistics charts (opens, clicks, bounces, etc.) by aggregating data from campaign logs.
Cron scheduled: Yes (hourly, except in demo mode)
stats:broadcast
php artisan stats:broadcast
Updates per-broadcast sending stats displayed on user dashboards.
stats:dashboard
php artisan stats:dashboard
Updates the overall sending stats displayed on user dashboards.
stats:pending
php artisan stats:pending
Processes pending statistics (clicks, opens, unsubscribes, etc.) that haven't been aggregated yet.
Cron scheduled: Yes (configurable, default: every 30 minutes)
stats:deviceoverall
php artisan stats:deviceoverall
Records device usage statistics - how many people opened emails on mobile vs. desktop.
stats:device_old
php artisan stats:device_old
Legacy device stats command. Updates sending stats for the user dashboard device chart.
stats:topdomain
php artisan stats:topdomain
Updates the top email domains chart data on an hourly basis.
stats:top-domain
php artisan stats:top-domain
Alternative top domains stats processing command.
dashboard-stats:optimize
php artisan dashboard-stats:optimize
Aggregates dashboard statistics from granular timeframes (hours to days, days to weeks, weeks to months, months to years) to optimize query performance.
change:stats
php artisan change:stats {time?}
Updates dashboard stats for the demo version of the application.
| Parameter | Required | Description |
|---|---|---|
time | No | Time parameter for stat generation |
delete:dashboardstats
php artisan delete:dashboardstats {user_id}
Deletes all dashboard statistics for a specific user.
| Parameter | Required | Description |
|---|---|---|
user_id | Yes | User ID |
delete:previousStats
php artisan delete:previousStats
Clears historical statistics data.
update:clickedBrowser
php artisan update:clickedBrowser
Updates the user agent / browser detail field in the clicked records table.
Trigger & Automation
triggers:run
php artisan triggers:run {--trigger-type=} {--trigger-action=}
The main trigger processing engine. Processes active triggers based on type and action.
| Option | Description |
|---|---|
--trigger-type= | Filter by trigger type (add_sub_list, add_sub_segment) |
--trigger-action= | Filter by action (start_autoresponder, etc.) |
Cron scheduled: Yes (configurable, default: every minute, runs 4 parallel instances for different type+action combinations)
triggers:auto-active
php artisan triggers:auto-active
Re-enables triggers that were disabled due to sending limits. If credits become available, this command automatically re-activates those triggers.
triggers:checkup
php artisan triggers:checkup
Checks for trigger tasks stuck in the queue and resets their status so they can be processed again.
Cron scheduled: Yes (configurable, default: daily at 01:00)
delete:triggers
php artisan delete:triggers {user_id?} {id?} {--force}
Deletes triggers and their associated data.
| Option | Description |
|---|---|
--force | Forcibly delete triggers and all related data |
delete:dripgroups
php artisan delete:dripgroups {user_id?} {group_id?} {--force}
Deletes drip campaign groups.
| Option | Description |
|---|---|
--force | Forcibly delete group and all child drips |
delete:drips
php artisan delete:drips {user_id?} {drip_id?}
Deletes individual drip campaigns.
event-process-queue:run
php artisan event-process-queue:run {--action-type=} {--max-execution=} {--event-type=} {--event-action=} {--campaign-id=} {--query-limit=}
Processes tasks that triggers added to the event queue. This is the worker for the trigger pipeline.
| Option | Description |
|---|---|
--action-type= | Filter by action type (e.g., instant) |
--max-execution= | Maximum number of executions per run (-1 = unlimited) |
--event-type= | Filter by event type |
--event-action= | Filter by event action (e.g., start_autoresponder) |
--campaign-id= | Filter by campaign ID |
--query-limit= | Max records per query batch |
Cron scheduled: Yes (every minute, 2 parallel instances)
liveevents:delete
php artisan liveevents:delete {records?}
Deletes old live event records, keeping only the most recent entries.
| Parameter | Required | Description |
|---|---|---|
records | No | Number of latest records to keep |
delete:evergreen
php artisan delete:evergreen {id?}
Deletes evergreen campaigns along with their associated statistics.
Domain & DKIM Management
update:domain_status
php artisan update:domain_status
Checks and updates the status of all sending domains (DKIM, tracking, bounce verification).
sending-domain:verify
php artisan sending-domain:verify
Verifies all DKIM records and domain redirections every 24 hours and updates their status.
generate:dkim
php artisan generate:dkim {domain_id?}
Generates DKIM key pairs for sending domains.
| Parameter | Required | Description |
|---|---|---|
domain_id | No | Specific domain ID. If omitted, generates for all domains without keys |
user-domain:restrictions
php artisan user-domain:restrictions {user_id?} {domain_id?}
Updates domain DKIM, tracking, and bounce statuses. Blocks related lists if domain verification fails.
| Parameter | Required | Description |
|---|---|---|
user_id | No | Filter by user |
domain_id | No | Specific domain ID |
delete:domains
php artisan delete:domains {user_id} {domain_id?} {--force}
Deletes user sending domains.
| Option | Description |
|---|---|
--force | Force delete even if domain is in use |
SMTP Management
auto:inactive
php artisan auto:inactive {smtp_id?}
Checks auto-inactive SMTPs. If they are found to be working again, their status is changed to active and related paused campaigns are resumed.
| Parameter | Required | Description |
|---|---|---|
smtp_id | No | Specific SMTP ID to check |
Cron scheduled: Yes (configurable, default: every 5 minutes)
Export Commands
export:all-stats
php artisan export:all-stats {id} {user_id} {customeFieldCheck} {is_bots} {type} {exportType}
Exports all statistics for a campaign including opens, clicks, bounces, unsubscribes, etc.
| Parameter | Required | Description |
|---|---|---|
id | Yes | Campaign schedule ID |
user_id | Yes | User ID |
customeFieldCheck | Yes | Include custom field data (1/0) |
is_bots | Yes | Include bot data |
type | Yes | Stats type filter |
exportType | Yes | Export file format |
export:list
php artisan export:list {list_id} {user_id}
Exports a contact list with all subscribers and related data to a downloadable file.
| Parameter | Required | Description |
|---|---|---|
list_id | Yes | List to export |
user_id | Yes | Owning user ID |
export:suppression
php artisan export:suppression {user_id?} {export_id?}
Exports the suppression email list to a downloadable file.
export:suppressDomains
php artisan export:suppressDomains {user_id?} {export_id?}
Exports suppressed domains to a downloadable file.
delete:exportedFiles
php artisan delete:exportedFiles
Deletes exported files stored in the storage folder after the number of days defined in application settings.
Cron scheduled: Yes (configurable, default: every 5 minutes)
User Management
assign:user
php artisan assign:user {assignee} {user_id}
Transfers the complete data of one user to another user. This includes lists, campaigns, templates, domains, SMTPs, and all other user-owned resources.
| Parameter | Required | Description |
|---|---|---|
assignee | Yes | Target user ID (receives the data) |
user_id | Yes | Source user ID (data is transferred from) |
delete:user
php artisan delete:user {user_id}
Permanently deletes a user and all associated data from every table in the database. This is irreversible.
| Parameter | Required | Description |
|---|---|---|
user_id | Yes | User ID to delete |
kill:session
php artisan kill:session {user_id?}
Deletes session data, logging out users from all devices.
| Parameter | Required | Description |
|---|---|---|
user_id | No | Specific user. If omitted, logs out all users |
store:geo_info
php artisan store:geo_info {user_id} {session_file} {ip} {agent} {remember}
Triggered when a user authenticates. Stores the login geographic information, IP, browser agent, and session data.
| Parameter | Required | Description |
|---|---|---|
user_id | Yes | Authenticated user ID |
session_file | Yes | Session file identifier |
ip | Yes | Login IP address |
agent | Yes | Browser user agent |
remember | Yes | Remember-me token flag |
allowedips:convert2json
php artisan allowedips:convert2json
Converts IP restriction entries to JSON format. Used when users have configured IP-based login restrictions.
delete:activitylog
php artisan delete:activitylog {user_id?} {id?}
Deletes activity log entries.
delete:apikeys
php artisan delete:apikeys {user_id?} {role_id?} {id?}
Deletes API keys based on user, role, or specific key ID.
delete:notifications
php artisan delete:notifications {user_id?} {notification_id?}
Deletes user notifications.
delete:roles
php artisan delete:roles {user_id?} {role_id?}
Deletes user roles and associated permissions.
delete:contacts
php artisan delete:contacts {user_id?} {list_id?} {--force}
Deletes subscribers from a specific user or list.
| Option | Description |
|---|---|
--force | Force delete without confirmation checks |
Resource Cleanup (Delete Commands)
These commands handle deletion of various application resources. All follow a similar pattern with optional user_id and resource id parameters.
Bounce & FBL
| Command | Signature | Description |
|---|---|---|
delete:bounceaddresses | {user_id?} {id?} {--force} {--skip} | Delete bounce addresses. --force deletes associated data |
delete:bouncerules | {user_id?} {id?} | Delete bounce rules |
delete:fbls | {user_id?} {id?} | Delete feedback loop configurations |
Content & Tags
| Command | Signature | Description |
|---|---|---|
delete:dynamictags | {user_id?} {id?} | Delete dynamic content tags |
app:delete-dynamic-tags | {id?} {deleter?} | Delete dynamic tags (scheduled daily) |
delete:spintags | {user_id?} {id?} | Delete spintax tags |
delete:splittests | {user_id?} {id?} | Delete split test configurations |
Forms & Fields
| Command | Signature | Description |
|---|---|---|
delete:forms | {user_id?} {id?} | Delete web forms |
delete:fields | {user_id?} {id?} | Delete custom fields and list custom fields |
delete:custom_field_data | {ids?} | Delete custom field data where custom_field = 1 |
Infrastructure
| Command | Signature | Description |
|---|---|---|
delete:nodes | {user_id?} {node_id?} {--force} | Delete sending nodes |
delete:segments | {user_id?} {segment_id?} {--force} | Delete segments |
System Maintenance
run:maintenance
php artisan run:maintenance {--force}
The master maintenance command. Runs multiple cleanup and optimization tasks including: cleaning stuck segment tasks, updating roles, purging old data, and other housekeeping operations.
| Option | Description |
|---|---|
--force | Run immediately, bypass cron timing |
Cron scheduled: Yes (configurable, default: daily)
auto:backup
php artisan auto:backup
Creates a full database backup and saves it to private storage. The backup file is stored at storage/app/private/backup.zip.
Cron scheduled: Configurable via application settings
logs:clear
php artisan logs:clear
Deletes cronjob logs and campaign table data older than the configured retention period (default: 1000 days).
delete:storage_files
php artisan delete:storage_files
Processes and deletes extra/stale JSON files from the storage/app/private/clicked/ directory.
clean:sessions_dir
php artisan clean:sessions_dir
Deletes all session files from the sessions directory, effectively logging out all users from all devices.
test:cron
php artisan test:cron
Tests that the cron scheduler is working by writing a test file to private storage. Useful for diagnosing cron issues.
running:tasks
php artisan running:tasks {task?}
Processes background tasks from the tasks table. Commands or queries stored in the table are executed in the background.
| Parameter | Required | Description |
|---|---|---|
task | No | Specific task type to process |
Cron scheduled: Yes (every minute)
dump-autoload
php artisan dump-autoload
Runs Composer's dump-autoload command to regenerate the class autoloader.
check:modules
php artisan check:modules
Verifies that all required base modules (ESPs, etc.) are installed and registered.
limit:reset
php artisan limit:reset {id?}
Resets sending limits for users whose billing month has ended.
| Parameter | Required | Description |
|---|---|---|
id | No | Specific user ID |
Cron scheduled: Yes (daily at 21:00)
update:packageData
php artisan update:packageData {id?}
Updates user package data when package configurations change.
| Parameter | Required | Description |
|---|---|---|
id | No | Specific user ID |
Database Operations
alter:tables
php artisan alter:tables
Runs queued database ALTER queries in the background. Used for non-blocking schema changes.
Cron scheduled: Yes (every minute)
optimize:tables
php artisan optimize:tables {type?}
Updates the domain_name field in subscribers and logs tables. Splits email addresses and populates the domain field for faster domain-based queries.
| Parameter | Required | Description |
|---|---|---|
type | No | Operation type |
upgrade:db
php artisan upgrade:db
Upgrades the database schema when updating Mumara to a newer version. Runs pending migration-like changes.
db:sync
php artisan db:sync
Compares the current local database schema to the remote updated schema and reports differences.
sync:database
php artisan sync:database
Synchronizes local and remote database schemas by applying missing columns, tables, or indexes.
sync:fields
php artisan sync:fields {list_ids}
Synchronizes custom field values according to their assigned field definitions.
| Parameter | Required | Description |
|---|---|---|
list_ids | Yes | Comma-separated list IDs to sync |
Configuration & Setup
initial:setup
php artisan initial:setup {primary-domain?}
Sets the primary domain and mail attributes during initial installation. Reads from the .env file if no domain is provided. Run once after a fresh install.
| Parameter | Required | Description |
|---|---|---|
primary-domain | No | Primary domain URL. Auto-detected from .env if omitted |
settings:sync
php artisan settings:sync {--skip-unsubscribe} {--skip-headerfooter}
Synchronizes application settings with Blade template files and configuration files.
| Option | Description |
|---|---|
--skip-unsubscribe | Don't update unsubscribe template |
--skip-headerfooter | Don't update header/footer templates |
config:appSettings
php artisan config:appSettings
Saves application_settings table values to a cached config file for performance.
rebuild:sidemenu
php artisan rebuild:sidemenu
Migrates the sidebar menu from JSON format to the database main_menu table.
listen:hook
php artisan listen:hook {name} {vars}
Executes a registered hook in the background.
| Parameter | Required | Description |
|---|---|---|
name | Yes | Hook name to execute |
vars | Yes | Variables to pass to the hook |
country-name:change
php artisan country-name:change
Updates country name entries to use ISO country codes in the database.
RebuildPermissions
php artisan permissions:rebuild
Rebuilds user permission entries.
License Management
license:insert
php artisan license:insert {license_id} {ip}
Inserts a license record into the database. Used by the installation bash script.
| Parameter | Required | Description |
|---|---|---|
license_id | Yes | License key |
ip | Yes | Server IP address |
license:cloud
php artisan license:cloud {clientid} {serviceid}
Updates or creates a cloud-based license.
| Parameter | Required | Description |
|---|---|---|
clientid | Yes | Cloud client ID |
serviceid | Yes | Cloud service ID |
Addons & Updates
addons:update
php artisan addons:update {name?}
Checks for addon updates and updates their version in the database.
| Parameter | Required | Description |
|---|---|---|
name | No | Specific addon name. If omitted, checks all addons |
Cron scheduled: Yes (daily at 01:00)
update:available
php artisan update:available
Checks whether a Mumara update is available. If found, updates the application_settings table with the new version number and sends email notifications to all administrators.
Cron scheduled: Yes (daily)
upgrade:finalize
php artisan upgrade:finalize {--dry-run}
Runs post-upgrade checks and fixes. Renames deprecated .env variables to their modern Laravel 12 equivalents (e.g. CACHE_DRIVER → CACHE_STORE, QUEUE_DRIVER → QUEUE_CONNECTION) and rebuilds the config cache.
| Option | Description |
|---|---|
--dry-run | Shows what would change without applying any modifications |
This command is idempotent — safe to run multiple times. It inspects the .env file and only renames variables that still use the old names.
Environment variable renames:
| Old Name | New Name |
|---|---|
CACHE_DRIVER | CACHE_STORE |
QUEUE_DRIVER | QUEUE_CONNECTION |
MAIL_DRIVER | MAIL_MAILER |
BROADCAST_DRIVER | BROADCAST_CONNECTION |
FILESYSTEM_DRIVER | FILESYSTEM_DISK |
APP_LOG_LEVEL | LOG_LEVEL |
Called automatically during the update process (web UI, legacy update, and CLI update script).
Storage Management
storage:restructure
php artisan storage:restructure {--dry-run} {--rollback} {--force} {--skip-htaccess}
Migrates the storage directory from the flat structure (storage/users/, storage/campaigns/, etc.) to Laravel's standard layout (storage/app/public/ and storage/app/private/). Also creates the public/storage symlink and sets up the root .htaccess rewrite to public/. This command runs automatically during upgrades from versions < 7.0.
| Option | Description |
|---|---|
--dry-run | Shows what would be moved without actually moving files |
--rollback | Reverses the migration, moving files back to the old structure |
--force | Skip interactive prompts (used during automated upgrades) |
--skip-htaccess | Skip root .htaccess creation (use when Apache DocumentRoot already points to public/) |
Migration steps:
- Pre-flight checks (writable directories, disk space)
- Creates
storage/app/public/andstorage/app/private/directory trees - Moves public user files (media, broadcasts, profile images, etc.)
- Moves public system files (web form designs, builder templates, HTML files)
- Moves branding files
- Moves private user files (imports, exports, sending domains, campaigns)
- Moves private system files (backups, tracking data, callbacks, bounce rules, etc.)
- Moves miscellaneous single files
- Sets up the
public/storagesymlink - Cleans up empty old directories
A manifest file is saved at storage/app/storage_restructure_manifest.json to support rollback.
Usage example:
# Preview changes first
php artisan storage:restructure --dry-run
# Run the actual migration
php artisan storage:restructure
# Rollback if needed
php artisan storage:restructure --rollback
Dynamic Content
dynamictag:convert
php artisan dynamictag:convert
Converts dynamic tags from the old format and stores them in Blade template format.
dynamictags:fetchfeed
php artisan dynamictags:fetchfeed {id?} {--force}
Fetches RSS/Atom feed content for dynamic tags and updates their stored content.
| Parameter | Required | Description |
|---|---|---|
id | No | Specific dynamic tag ID |
| Option | Description |
|---|---|
--force | Fetch regardless of last-fetched time |
Cron scheduled: Yes (configurable via dynamic_rss_tags setting)
Integration & ESP
add:esp
php artisan add:esp {esp_name}
Registers a new ESP (Email Service Provider) module in the system.
| Parameter | Required | Description |
|---|---|---|
esp_name | Yes | ESP module name (e.g., amazon, sparkpost, mailgun) |
get:contact (Zapier)
php artisan get:contact {id}
Posts contact details to saved Zapier subscription URLs. Used by the Zapier integration to push contact data to external workflows.
| Parameter | Required | Description |
|---|---|---|
id | Yes | Contact/subscriber ID |
Autoresponder
autoresponder:process
Autoresponder scheduling is handled through the trigger pipeline (triggers:run). There is no separate standalone autoresponder command.
Unused / Internal Commands
These commands exist in the codebase but are either deprecated, internal-only, or not actively scheduled:
| Command | Signature | Notes |
|---|---|---|
not:use | BounceProcessingPmta | Inactive PMTA bounce processor |
command:name | Sending\SendCampaign, UpdateUserLogs | Placeholder/unused signature |
updateList:domain-id | {user_id?} | Internal migration utility |
Cron Schedule Summary
The following commands are automatically scheduled via app/Console/Kernel.php. Their frequency is configurable through Settings > Cron Settings in the application UI.
| Command | Default Frequency | Configurable |
|---|---|---|
running:tasks | Every minute | No |
delete:custom_field_data | Every 15 min | No |
send:campaigns | Every minute | Yes |
email:clicked | Every minute | Yes |
email:opened | Every minute | Yes |
track:processing | Every minute | Yes |
triggers:run | Every minute | Yes |
triggers:checkup | Daily 01:00 | Yes |
event-process-queue:run | Every minute | No |
bounce:processing | Every 6 hours | Yes |
fbl:processing | Every 2 hours | Yes |
suppress:subscribers | Every 5 min | Yes |
run:maintenance | Daily | Yes |
segments:count | Daily | Yes |
stats:pending | Every 30 min | Yes |
stats:update | Hourly | No |
schedule:evergreen | Every 5 min | Yes |
segment:processing | Every 5 min | No |
auto:inactive | Every 5 min | Yes |
alter:tables | Every minute | No |
update:available | Daily | No |
addons:update | Daily 01:00 | No |
limit:reset | Daily 21:00 | No |
recount:contacts | Hourly | No |
app:delete-dynamic-tags | Daily | No |
delete:exportedFiles | Every 5 min | Yes |
dynamictags:fetchfeed | Configurable | Yes |
queue:work | Every minute | Yes |
resume:stucked-campaigns | Configurable | Yes |
Setting a cron value to -1 disables that scheduled task. Setting it to 0 or leaving it empty uses the default frequency.