Skip to main content

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

CategoryDescription
Campaign Sending & SchedulingCore email sending pipeline
Campaign ManagementPause, resume, delete campaigns
Broadcast & Template ManagementTemplates, broadcasts, designs
Subscriber ImportImporting contacts into lists
Subscriber ManagementClean, recount, deduplicate contacts
List & Segment ManagementSegments, exports, list copy
Suppression ManagementSuppressed emails, domains, IPs
Bounce & FBL ProcessingBounce handling, feedback loops
Tracking & StatisticsClick, open, stats processing
Trigger & AutomationTriggers, drips, event queues
Domain & DKIM ManagementSending domains, DKIM, verification
SMTP ManagementAuto-inactive, limit recovery
Export CommandsData export (stats, lists, suppression)
User ManagementUser administration, sessions, assignment
Resource Cleanup (Delete)Delete operations for various resources
System MaintenanceMaintenance, cleanup, optimization
Database OperationsSync, alter, upgrade, optimize
Configuration & SetupSettings sync, initial setup, menus
License ManagementLicense insert, cloud licensing
Addons & UpdatesAddon management, update checks
Storage ManagementStorage restructure migration
Dynamic ContentDynamic tags, RSS feeds
Integration & ESPESP 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.

ParameterRequiredDescription
schedule_campaign_idNoSpecific scheduled campaign ID to send
thread_noNoThread 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.

ParameterRequiredDescription
schedule_campaign_idNoSpecific campaign schedule ID to prepare

prepare:campaign

php artisan prepare:campaign {campaign_id}

Alternative campaign preparation command (in Sending/ namespace).

ParameterRequiredDescription
campaign_idYesCampaign 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.

ParameterRequiredDescription
idNoSpecific campaign schedule ID. If omitted, pauses all running campaigns

campaign:resume

php artisan campaign:resume {id?}

Forcefully resumes a paused campaign.

ParameterRequiredDescription
idNoSpecific campaign schedule ID. If omitted, resumes all paused campaigns

campaign:delete

php artisan campaign:delete {id?}

Deletes scheduled campaigns and their associated data.

ParameterRequiredDescription
idNoCampaign 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.

ParameterRequiredDescription
user_idNoFilter by user
campaign_idNoSpecific campaign to delete

delete:scheduledbroadcasts

php artisan delete:scheduledbroadcasts {scheduled_id?} {user_id?}

Deletes all scheduled campaign data from related tables (logs, stats, etc.).

ParameterRequiredDescription
scheduled_idNoSpecific schedule ID
user_idNoFilter 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.

ParameterRequiredDescription
idNoSpecific 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.

ParameterRequiredDescription
file_noYesFile slice number
import_idYesImport 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.

ParameterRequiredDescription
import_idYesImport job ID
table_prefixYesDatabase table prefix
file_formatYesFile format (CSV, TXT, etc.)
formatYesColumn format mapping
is_activeYesSet subscribers as active
is_confirmedYesSet subscribers as confirmed
user_idYesOwning user ID
file_field_idYesField mapping ID
duplicatesYesDuplicate handling strategy
slicesYesNumber 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.

ParameterRequiredDescription
list_idNoSpecific list to clean
duplicatesNoDuplicate 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.

ParameterRequiredDescription
user_idNoSpecific 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.

ParameterRequiredDescription
list_idYesTarget list ID
user_idYesOwning user ID
duplicate_typeYesType 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.

ParameterRequiredDescription
list_idYesList ID
import_idYesImport job ID
user_idYesUser ID
duplicatesYesDuplicate handling mode
file_formatYesImport file format

update:contacts

php artisan update:contacts {id}

Bulk-updates contacts for a specific import/update job.

ParameterRequiredDescription
idYesUpdate 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.

ParameterRequiredDescription
copy_contactsYesWhether to copy subscribers (1/0)
orig_list_idYesSource list ID
copy_list_idsYesComma-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.

ParameterRequiredDescription
idNoSpecific segment ID
recountNoForce recount flag
OptionDescription
--prepare-multi-processSplit work for parallel processing
--max-execution=Max execution time
--chunk-size=Records per chunk
--forceIgnore 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.

ParameterRequiredDescription
idNoSpecific export ID
OptionDefaultDescription
--days2Delete 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.

OptionDescription
--resyncResynchronize all suppression rules
--forceBypass 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.

ParameterRequiredDescription
import_idYesSuppression import job ID
slicesYesNumber of file slices

normalSuppression:import

php artisan normalSuppression:import {import_id}

Standard suppression list import (non-rocket mode).

ParameterRequiredDescription
import_idYesImport job ID

supression:emails

php artisan supression:emails {user_id?} {subscriber_id?}

Processes suppressed emails for specific users/subscribers.

ParameterRequiredDescription
user_idNoFilter by user
subscriber_idNoSpecific 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.

OptionDescription
--forceRun 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.

OptionDescription
--forceRun 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.

ParameterRequiredDescription
pathNoCustom 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.

ParameterRequiredDescription
pathNoCustom 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.

ParameterRequiredDescription
timeNoTime parameter for stat generation

delete:dashboardstats

php artisan delete:dashboardstats {user_id}

Deletes all dashboard statistics for a specific user.

ParameterRequiredDescription
user_idYesUser 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.

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

OptionDescription
--forceForcibly delete triggers and all related data

delete:dripgroups

php artisan delete:dripgroups {user_id?} {group_id?} {--force}

Deletes drip campaign groups.

OptionDescription
--forceForcibly 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.

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

ParameterRequiredDescription
recordsNoNumber 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.

ParameterRequiredDescription
domain_idNoSpecific 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.

ParameterRequiredDescription
user_idNoFilter by user
domain_idNoSpecific domain ID

delete:domains

php artisan delete:domains {user_id} {domain_id?} {--force}

Deletes user sending domains.

OptionDescription
--forceForce 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.

ParameterRequiredDescription
smtp_idNoSpecific 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.

ParameterRequiredDescription
idYesCampaign schedule ID
user_idYesUser ID
customeFieldCheckYesInclude custom field data (1/0)
is_botsYesInclude bot data
typeYesStats type filter
exportTypeYesExport 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.

ParameterRequiredDescription
list_idYesList to export
user_idYesOwning 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.

ParameterRequiredDescription
assigneeYesTarget user ID (receives the data)
user_idYesSource 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.

ParameterRequiredDescription
user_idYesUser ID to delete

kill:session

php artisan kill:session {user_id?}

Deletes session data, logging out users from all devices.

ParameterRequiredDescription
user_idNoSpecific 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.

ParameterRequiredDescription
user_idYesAuthenticated user ID
session_fileYesSession file identifier
ipYesLogin IP address
agentYesBrowser user agent
rememberYesRemember-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.

OptionDescription
--forceForce 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

CommandSignatureDescription
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

CommandSignatureDescription
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

CommandSignatureDescription
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

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

OptionDescription
--forceRun 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.

ParameterRequiredDescription
taskNoSpecific 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.

ParameterRequiredDescription
idNoSpecific user ID

Cron scheduled: Yes (daily at 21:00)


update:packageData

php artisan update:packageData {id?}

Updates user package data when package configurations change.

ParameterRequiredDescription
idNoSpecific 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.

ParameterRequiredDescription
typeNoOperation 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.

ParameterRequiredDescription
list_idsYesComma-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.

ParameterRequiredDescription
primary-domainNoPrimary 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.

OptionDescription
--skip-unsubscribeDon't update unsubscribe template
--skip-headerfooterDon'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.

ParameterRequiredDescription
nameYesHook name to execute
varsYesVariables 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.

ParameterRequiredDescription
license_idYesLicense key
ipYesServer IP address

license:cloud

php artisan license:cloud {clientid} {serviceid}

Updates or creates a cloud-based license.

ParameterRequiredDescription
clientidYesCloud client ID
serviceidYesCloud service ID

Addons & Updates

addons:update

php artisan addons:update {name?}

Checks for addon updates and updates their version in the database.

ParameterRequiredDescription
nameNoSpecific 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_DRIVERCACHE_STORE, QUEUE_DRIVERQUEUE_CONNECTION) and rebuilds the config cache.

OptionDescription
--dry-runShows 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 NameNew Name
CACHE_DRIVERCACHE_STORE
QUEUE_DRIVERQUEUE_CONNECTION
MAIL_DRIVERMAIL_MAILER
BROADCAST_DRIVERBROADCAST_CONNECTION
FILESYSTEM_DRIVERFILESYSTEM_DISK
APP_LOG_LEVELLOG_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.

OptionDescription
--dry-runShows what would be moved without actually moving files
--rollbackReverses the migration, moving files back to the old structure
--forceSkip interactive prompts (used during automated upgrades)
--skip-htaccessSkip root .htaccess creation (use when Apache DocumentRoot already points to public/)

Migration steps:

  1. Pre-flight checks (writable directories, disk space)
  2. Creates storage/app/public/ and storage/app/private/ directory trees
  3. Moves public user files (media, broadcasts, profile images, etc.)
  4. Moves public system files (web form designs, builder templates, HTML files)
  5. Moves branding files
  6. Moves private user files (imports, exports, sending domains, campaigns)
  7. Moves private system files (backups, tracking data, callbacks, bounce rules, etc.)
  8. Moves miscellaneous single files
  9. Sets up the public/storage symlink
  10. 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.

ParameterRequiredDescription
idNoSpecific dynamic tag ID
OptionDescription
--forceFetch 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.

ParameterRequiredDescription
esp_nameYesESP 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.

ParameterRequiredDescription
idYesContact/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:

CommandSignatureNotes
not:useBounceProcessingPmtaInactive PMTA bounce processor
command:nameSending\SendCampaign, UpdateUserLogsPlaceholder/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.

CommandDefault FrequencyConfigurable
running:tasksEvery minuteNo
delete:custom_field_dataEvery 15 minNo
send:campaignsEvery minuteYes
email:clickedEvery minuteYes
email:openedEvery minuteYes
track:processingEvery minuteYes
triggers:runEvery minuteYes
triggers:checkupDaily 01:00Yes
event-process-queue:runEvery minuteNo
bounce:processingEvery 6 hoursYes
fbl:processingEvery 2 hoursYes
suppress:subscribersEvery 5 minYes
run:maintenanceDailyYes
segments:countDailyYes
stats:pendingEvery 30 minYes
stats:updateHourlyNo
schedule:evergreenEvery 5 minYes
segment:processingEvery 5 minNo
auto:inactiveEvery 5 minYes
alter:tablesEvery minuteNo
update:availableDailyNo
addons:updateDaily 01:00No
limit:resetDaily 21:00No
recount:contactsHourlyNo
app:delete-dynamic-tagsDailyNo
delete:exportedFilesEvery 5 minYes
dynamictags:fetchfeedConfigurableYes
queue:workEvery minuteYes
resume:stucked-campaignsConfigurableYes

Setting a cron value to -1 disables that scheduled task. Setting it to 0 or leaving it empty uses the default frequency.