Mautic is an incredible marketing automation platform that is still available for free.  This is an amazing tool for small businesses with small budgets that want to do big things on the Salesforce Marketing Cloud level.  I have helped enough small businesses and even enterprise corporations set up Mautic and many of its power users in digital marketing had been very impressed with its capabilities and performance.

Many of them like its simplicity of use, its clean set up, and visual campaign editor that is so much simpler to setup and follow then the clunky Salesforce marketing cloud Journey Builder.  Quite simply you can do so much of Salesforce marketing Cloud so much faster in my tech with less hassles and it is a good fit especially for small businesses looking for a new way to expand their digital marketing efforts without the ginormous Salesforce price tag.

Upgrading to Mautic 6 was no small feat, as it took about 3 hours to set up but many businesses that want to explore free Marketing Automation and CRMs would be hard-pressed to find a more powerful and productive investment of a few hours to expand any organizations marketing and automation capabilities.

One of the very powerful capabilities of Mautic is the ability to connect your WordPress site to the Mautic API.  You can also connect Mautic to other CRMs and custom systems But I will be addressing WordPress specifically in this case.  In wordpress, by embedding a simple shortcode on any page or post you can change the content of the page.  It offers a wonderful ability to personalize content with Dynamic Content. You can also put useful user messages and call to actions based on individual behaviors on a schedule.

This Mautic exit-intent popup on Brandager.com’s Contact page is a great way to help recover abandonment without being intrusive. To test Mautic’s pop up of focus item when “Visitor is Leaving”, use Incognito to make sure it will trigger.

You can also ad what is called a focus item including one of my favorite versions of user abandonment recovery, the exit intent pop up.  That’s this live screenshot above. You can do this all without having to write code or alter much of your WordPress content to achieve this higher level integration that expands your website capabilities and functions.

For those who have installed Mautic 6, you may have encountered some limitations to embedding a focus item like an exit intent pop up with an embedded form. what happened very recently on this website is on the contact page I embedded and exit intent pop up through Mautic’s  Focus Item.  Unfortunately, any required fields were not enforced so when testing the form and just clicking the submit button, it would allow blank data to go through.

This shortcoming happens when setting up the exit intent pop up through the “Basic Content Mode” in the Focus Item editor.  To overcome this minor issue, I had to set up the pop-up in HTML content mode. Here is the pop-up HTML, Javascript and custom CSS in its entirety, please note the JavaScript in script tags in the HTML content editor.

To embed a form, Mautic provides the shortcode token within the editor which is {focus_form}.

The live editor in Mautic is very useful since you can put in your own HTML page and it will simulate the behavior of the pop-up, however just be warned that your custom CSS does not update in this view, but all of your changes WILL show up when it is called on from your website.

Here is some sample HTML, CSS & Javascript to get our Mautic 6.0 focus item form working with user input validation.

<h3>
We offer FREE one-hour strategy sessions!
</h3>
<p>
    There is no obligation, you won't know if we could help you if you don't take the first step and reach out to us!
</p>
<p>&nbsp;</p>
<p>
    {focus_form}
</p>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
       const requiredParentDivs = document.querySelectorAll('.mauticform-required');

    requiredParentDivs.forEach(function(parentDiv) {
        const formElements = parentDiv.querySelectorAll('input, select, textarea');

        formElements.forEach(function(element) {
            element.setAttribute('required', 'required');
        });
    });
});
</script>

Please be advised that any code or recommendations are made available to you, in the spirit of Stack Overflow, but we do not make any guarantees that they will work in your individual case. 

If you are a small business, a non-profit  or a veteran owned company and you are looking for new ways to set up a very powerful, simple and reliable marketing automation, Mautic is exceptional and will give your organization the edge over your competition. To learn more, I suggest reaching out to the business growth and tech consultants at brandager.com.


Mautic CRM Marketing Automation Logo

The latest Mautic release update to 2.12 went seamlessly.  Like any system, however, you discover something that didn’t seem to cause a problem before.  This issue isn’t a bug, it’s just one of those snags you don’t catch until you get down to the level of testing you didn’t reach before.  The “Import Contacts” tool is one of those times when I discovered that if you select “Import in Background” instead of direct through the browser you will wait and nothing will import.  The reason isn’t obvious but I suspected it was because a CRON job was missing.

I assumed this was triggered simply when the user put the import task in the queue, but this is not the case.  For all the CRON jobs they recommend at this link, Mautic does not mention anything about scheduling imports.  You can simply go to your command line and type this to execute:

$ php /home/path/to/your/mautic/app/console mautic:import

Also, I set up a CRON job for this command to run every thirty minutes so this won’t happen to others in the future.  I do think CRON jobs have a place, but manually setting them up seems a little archaic, I think like WordPress they should be more automated, if nothing else to reduce the number of people who lack more web technical skills and just want to use the marketing automation system from scratching their heads or complaining.

Mautic is a great marketing automation tool, it comes in two flavors, the free Community Edition and the Enterprise Edition. It is quickly evolving into a stable and robust marketing automation system.  My favorite part is that Mautic is developed on the PHP Symfony framework, as an experienced PHP developer with decades of experience with different systems here in Jacksonville, Florida, I can say the past 4 years I have been watching Mautic grow that it is a very exciting time for small businesses and marketing departments that may not currently have a lot of resources or high budgets for higher cost platforms like SalesForce.  I can also speak from direct experience that it blows InfusionSoft out of the water with a lot more customization and capabilities.


Since 2.8.2, a bunch of Mautic forms were hanging on “Please wait…”, even though the form data was going through, this is not a good customer experience.  Here is the fix for it on Git Hub from the Mautic team.  It turns out, this issue only happened for Mautic instances running in a sub-directory.

I think it’s usually best to put Mautic on a site within a sub-directory, perhaps in “/marketing” to keep it out of the way and not conflicting with your site’s WordPress or Drupal CMS.

This fix just came off Git Hub from the Mautic marketing automation developers yesterday.  Inside your Mautic folder, go to /media/js and make this change to both files, “mautic-form-src.js” and “mautic-form.js”:

if (event.origin !== MauticDomain) return;

// Replace the above with these two lines in both files

var MauticDomainWithoutPath = MauticDomain.match(/https?:\/\/[^\/]*/);
if (event.origin != MauticDomainWithoutPath) return;

I can confirm that this patch to these two .js files fixes the problem of “Please wait…” upon form submission and the form will behave upon submission properly, whether to show a message or perform a redirect.

Besides being free, why choose Mautic for your organization’s marketing automation?

As a web PHP developer in Jacksonville with over 13 years experience integrating and developing from scratch different systems, I have seen the rise of Mautic as a free marketing automation platform that rivals much more expensive platforms.  I can’t say enough great things about Mautic marketing automation and one of the best things about it that other experienced web developers who appreciate the power of leverage PHP frameworks is the fact Mautic is built on Symfony, my preferred collaborative full stack development framework I’ve been using now for over four years.

The fact Mautic is built on Symfony means that it is fully extendable and since it is by nature modular by design, it is easy to create your own custom themes for brands, channels and create other behaviors that other marketing automation platforms don’t even allow your programmer’s to access because they are completely closed systems.  This usually means if you have the right web developers with the “programmer’s mentality“, there is nothing you can’t get Mautic to do for your organization!

A special thanks to John Linhart and Michael Van Laar, Mautic geniuses!  By the way, a special message to Mr. Linhart — thank you for all your hard work and competent development of Mautic, it’s tough to read some of the messages, so many people don’t understand how complex these things are because you make it look easy!  Keep up the great work (please)….  🙂


All experienced web developers know that before you run any updates to a system that you back up your database and files, and Mautic, the marketing automation platform, is no exception.  Mautic comes in two flavors and this only applies to the completely free community version, which in my opinion makes Mautic the best, most powerful and scalable free marketing automation system.  It comes with no strings attached!  I may be partial to Mautic because it’s built on Symfony, as an experienced Symfony PHP developer in Jacksonville, Florida, I can say it makes me feel better about its stability and it tells me that the people behind Mautic are serious about its future and success.  We’re talking about the platform’s code base, which is stable, secure, and strongly encourages best coding practices.

Also, Mautic under the hood is very easy to customize and extend.  It uses all of Symfony’s patterns and components, so it’s easy to create your own Twig templates for your company that can do some very intuitive things that you just can’t do in much more expensive marketing automation platforms like Hub Spot, Marketo, SharpSpring, and InfusionSoft.

The fact Mautic is built on a very familiar and stable PHP framework makes it very unique among the marketing automation systems out there and it is positioned to explode for businesses tired of paying thousands of dollars every month for software that locks them in.  Are any of these other marketing automation platforms developed in a major PHP framework?

Probably not, and this is an area of concern because if it’s all proprietary, these other MA’s (acronym for “Marketing Automation”) are reinventing the wheel with basic system functions, functions best left uncoupled to a framework so there’s parallel improvements to the system.  Symfony updates and improves the way code talks to the database while the Mautic magicians work on ways to improve Mautic.

Updating Mautic: The Two Golden Commands To Fix Your Marketing Automation Update

When you log into your Mautic, you will see update notification.  This always makes me a little anxious, especially knowing that it’s not a button click, there’s always something that needs to be done afterwards to make sure the update completes.  Usually, it hangs at the cache clearing stage during the automatic update, so it never actually reaches the part where it can update the database schema, so that’s where these two commands have saved the last three updates I’ve performed in Mautic since 2.7 all the way to 2.9.2, it’s most current available version.

First, “cd” into your Mautic directory in the command line, then type in the following:

app/console doctrine:migration:status
app/console doctrine:migration:migrate

Here’s something similar you should see after executing both commands.  Again, it hasn’t happened to me yet where I had to restore, but do not forget to make backups of your database and files!

$app/console doctrine:migration:status
PHP Warning:  Module 'XCache' already loaded in Unknown on line 0

 == Configuration

    >> Name:                                               Mautic Migrations
    >> Database Driver:                                    pdo_mysql
    >> Database Name:                                      your_db
    >> Configuration Source:                               manually configured
    >> Version Table Name:                                 migrations
    >> Version Column Name:                                version
    >> Migrations Namespace:                               Mautic\Migrations
    >> Migrations Directory:                               /home/app/migrations
    >> Previous Version:                                   2016-09-26 00:00:00 (20160926000000)
    >> Current Version:                                    2016-09-26 00:00:01 (20160926000001)
    >> Next Version:                                       2016-09-26 18:28:07 (20160926182807)
    >> Latest Version:                                     2017-07-28 11:03:51 (20170728110351)
    >> Executed Migrations:                                46
    >> Executed Unavailable Migrations:                    0
    >> Available Migrations:                               89
    >> New Migrations:                                     43
[]$ php app/console doctrine:migration:migrate
PHP Warning:  Module 'XCache' already loaded in Unknown on line 0

                    Mautic Migrations


WARNING! You are about to execute a database migration that could result in schema changes and data lost. Are you sure you wish to continue? (y/n)

Then don’t forget to clear the Mautic cache.  The standard Symfony “app/console ca:cl” always results in an error, so you have to cd to the app/console/cache directory and remove all the files manually with “rm -rf *”.

Setting up marketing automation requires a “Programmer’s Mentality”

As an experienced web developer, it’s almost a liability knowing so much about marketing and the business side.  It’s ironic, though because so much of marketing requires understanding of data and setting up systems to automatically do things properly based on logic.  This sounds familiar and much more complicated than “marketing” though, doesn’t it?  That’s why data, systems, logic, flow charts, and automation all require a programmer’s mentality to execute properly.  To set up a marketing automation system for any business so it succeeds and works properly is technical and complex.  Marketing automation requires more programmer’s skills than marketing knowledge, by far.

I have over 13 years experience in web development and media production and am currently a senior PHP developer in Jacksonville, Florida, specializing in the Symfony framework, LAMP stack development, database architecture and system design, among other things.  I have a “programmer’s mentality” and I know when I meet someone who does not.  Also, a few friends of mine interviewing around Jacksonville and elsewhere have shared with me a few stories lately (I’m perfectly happy where I am, despite the awful commute).  Here’s a little advice for those looking to hire any web developers:  Don’t look silly and naive when you try to pigeonhole experienced web developers by labeling them as just a “front-end” or a “back-end” web developer, we can be good at systems and databases and still know how to make the interfaces and web pages look as good as the system functions in the back-end.  People can have a strong business and marketing skill set and still be effective programmers.  This is just a pet peeve of mine, just because you may have only dealt with web developers in the past who are “strong in one area” doesn’t mean we’re all like that.  These days, web developers must have a diverse set of skills, just like all graphic designers should be able to build their own emails and web pages.


As a PHP web developer with over 13 years experience, I can say that Mautic is the best of all the free marketing automation platforms, by far.  Sugar CRM is good, for what it does, but that’s a CRM, not an MA (Marketing Automation).  Still, when you are updating Mautic, like you would WordPress, be sure to always back up your files and database!

Now, I will chronicle my latest experience updating Mautic from 2.8.3 and 2.9.1.  By clicking the update button beneath the bell icon, it take you to the update page where you have to click “Update”.  Then, the process unfolds, it seems to hang at clearing the cache on my server, but you have to logout then log back in.  Everything went fine, except when I went to “Emails” and “Focus Items” and it hung up.  In the logs, I saw the following entries:

mautic.CRITICAL: Uncaught PHP Exception Doctrine\DBAL\Exception\InvalidFieldNameException: "An exception occurred while executing 'SELECT COUNT(*) AS dctrn_count FROM (SELECT DISTINCT id_10 FROM (SELECT e0_.is_published AS is_published_0, e0_.date_added AS date_added_1, e0_.created_by AS created_by_2, e0_.created_by_user AS created_by_user_3, e0_.date_modified AS date_modified_4, e0_.modified_by AS modified_by_5, e0_.modified_by_user AS modified_by_user_6, e0_.checked_out AS checked_out_7, e0_.checked_out_by AS checked_out_by_8, e0_.checked_out_by_user AS checked_out_by_user_9, e0_.id AS id_10, e0_.name AS name_11, e0_.description AS description_12, e0_.subject AS subject_13, e0_.from_address AS from_address_14, e0_.from_name AS from_name_15, e0_.reply_to_address AS reply_to_address_16, e0_.bcc_address AS bcc_address_17, e0_.template AS template_18, e0_.content AS content_19, e0_.utm_tags AS utm_tags_20, e0_.plain_text AS plain_text_21, e0_.custom_html AS custom_html_22, e0_.email_type AS email_type_23, e0_.publish_up AS publish_up_24, e0_.publish_down AS publish_down_25, e0_.read_count AS read_count_26, e0_.sent_count AS sent_count_27, e0_.revision AS revision_28, e0_.lang AS lang_29, e0_.variant_settings AS variant_settings_30, e0_.variant_start_date AS variant_start_date_31, e0_.dynamic_content AS dynamic_content_32, e0_.variant_sent_count AS variant_sent_count_33, e0_.variant_read_count AS variant_read_count_34 FROM emails e0_ LEFT JOIN categories c1_ ON e0_.category_id = c1_.id WHERE e0_.variant_parent_id IS NULL AND e0_.translation_parent_id IS NULL ORDER BY e0_.subject DESC) dctrn_result) dctrn_table':  SQLSTATE[42S22]: Column not found: 1054 Unknown column 'e0_.utm_tags' in 'field list'" at /home/marketingautomation/yourdirector/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php line 71 {"exception":"[object] (Doctrine\\DBAL\\Exception\\InvalidFieldNameException(code: 0): An exception occurred while executing 'SELECT COUNT(*) AS dctrn_count FROM (SELECT DISTINCT id_10 FROM (SELECT e0_.is_published AS is_published_0, e0_.date_added AS date_added_1, e0_.created_by AS created_by_2, e0_.created_by_user AS created_by_user_3, e0_.date_modified AS date_modified_4, e0_.modified_by AS modified_by_5, e0_.modified_by_user AS modified_by_user_6, e0_.checked_out AS checked_out_7, e0_.checked_out_by AS checked_out_by_8, e0_.checked_out_by_user AS checked_out_by_user_9, e0_.id AS id_10, e0_.name AS name_11, e0_.description AS description_12, e0_.subject AS subject_13, e0_.from_address AS from_address_14, e0_.from_name AS from_name_15, e0_.reply_to_address AS reply_to_address_16, e0_.bcc_address AS bcc_address_17, e0_.template AS template_18, e0_.content AS content_19, e0_.utm_tags AS utm_tags_20, e0_.plain_text AS plain_text_21, e0_.custom_html AS custom_html_22, e0_.email_type AS email_type_23, e0_.publish_up AS publish_up_24, e0_.publish_down AS publish_down_25, e0_.read_count AS read_count_26, e0_.sent_count AS sent_count_27, e0_.revision AS revision_28, e0_.lang AS lang_29, e0_.variant_settings AS variant_settings_30, e0_.variant_start_date AS variant_start_date_31, e0_.dynamic_content AS dynamic_content_32, e0_.variant_sent_count AS variant_sent_count_33, e0_.variant_read_count AS variant_read_count_34 FROM emails e0_ LEFT JOIN categories c1_ ON e0_.category_id = c1_.id WHERE e0_.variant_parent_id IS NULL AND e0_.translation_parent_id IS NULL ORDER BY e0_.subject DESC) dctrn_result) dctrn_table':\n\nSQLSTATE[42S22]: Column not found: 1054 Unknown column 'e0_.utm_tags' in 'field list' at /home/marketingautomation/yourdirectory/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:71, Doctrine\\DBAL\\Driver\\PDOException(code: 42S22): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'e0_.utm_tags' in 'field list' at /home/marketingautomation/yourdirectory/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:106, PDOException(code: 42S22): SQLSTATE[42S22]: Column not found: 1054 Unknown column 'e0_.utm_tags' in 'field list' at /home/marketingautomation/yourdirectory/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:104)"} []

So here’s what I did on the command line to force the Mautic update to finish:

$ app/console mautic:update:find -e prod
PHP Warning:  Module 'XCache' already loaded in Unknown on line 0
Great! You are running the current version of Mautic.
$ php app/console doctrine:migration:status
PHP Warning:  Module 'XCache' already loaded in Unknown on line 0

 == Configuration

    >> Name:                                               Mautic Migrations
    >> Database Driver:                                    pdo_mysql
    >> Database Name:                                      your_database_name
    >> Configuration Source:                               manually configured
    >> Version Table Name:                                 migrations
    >> Version Column Name:                                version
    >> Migrations Namespace:                               Mautic\Migrations
    >> Migrations Directory:                               /home/symfony/yourdirectory/app/migrations
    >> Previous Version:                                   2016-07-26 00:00:00 (20160726000000)
    >> Current Version:                                    2016-07-26 00:00:01 (20160726000001)
    >> Next Version:                                       2016-07-28 00:00:00 (20160728000000)
    >> Latest Version:                                     2017-07-25 15:50:53 (20170725155053)
    >> Executed Migrations:                                37
    >> Executed Unavailable Migrations:                    0
    >> Available Migrations:                               88
    >> New Migrations:                                     51
$ php app/console doctrine:migration:migrate
PHP Warning:  Module 'XCache' already loaded in Unknown on line 0

                    Mautic Migrations


WARNING! You are about to execute a database migration that could result in schema changes and data lost. Are you sure you wish to continue? (y/n)y
Migrating up to 20170725155053 from 20160726000001

  SS skipped (Reason: Schema includes this migration)

  ++ migrating 20160731000000

     -> update campaign_lead_event_log log inner join campaign_events events on log.event_id = events.id set log.metadata = 'a:0:{}' where events.type = 'email.send' and log.metadata = 'a:2:{s:6:"failed";i:1;s:6:"reason";s:50:"mautic.notification.campaign.failed.not_subscribed";}'

  ++ migrated (2.49s)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  ++ migrating 20160926182807

     -> insert into companies (companyname, is_published) (SELECT DISTINCT TRIM(company), 1 from leads l left join companies c ON l.company = c.companyname where company IS NOT NULL and company <> '' and c.companyname is null)
     -> insert into companies_leads (company_id, lead_id, date_added, manually_added, manually_removed) SELECT c.id, l.id, '2017-07-30 12:30:05', 0, 0 from leads l join companies c on c.companyname = l.company ON DUPLICATE KEY UPDATE company_id = c.id;

  ++ migrated (4.85s)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  ++ migrating 20161123225456

Migration 20161123225456 was executed but did not result in any SQL statements.

  ++ migrated (11.54s)

  ++ migrating 20161124145649

     -> ALTER TABLE lead_frequencyrules CHANGE `frequency_number` `frequency_number` SMALLINT DEFAULT NULL;
     -> ALTER TABLE lead_frequencyrules CHANGE `frequency_time` `frequency_time` VARCHAR(25) DEFAULT NULL;

  ++ migrated (2.38s)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  ++ migrating 20170108012944

     -> ALTER TABLE push_notifications CHANGE button button LONGTEXT NULL
     -> ALTER TABLE dynamic_content_lead_data DROP FOREIGN KEY FK_515B221B55458D
     -> ALTER TABLE dynamic_content_lead_data CHANGE lead_id lead_id INT NOT NULL
     -> ALTER TABLE dynamic_content_lead_data ADD CONSTRAINT FK_515B221B55458D FOREIGN KEY (lead_id) REFERENCES leads (id) ON DELETE CASCADE

  ++ migrated (4.52s)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  ++ migrating 20170216221648

     -> ALTER TABLE focus ADD editor LONGTEXT NULL
     -> ALTER TABLE focus ADD html_mode VARCHAR(255) DEFAULT NULL
     -> ALTER TABLE focus ADD html LONGTEXT NULL
     -> ALTER TABLE focus ADD utm_tags LONGTEXT DEFAULT NULL COMMENT '(DC2Type:array)';

  ++ migrated (12.38s)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  ++ migrating 20170429092049

     -> ALTER TABLE emails ADD utm_tags LONGTEXT DEFAULT NULL COMMENT '(DC2Type:array)';
     -> ALTER TABLE push_notifications ADD utm_tags LONGTEXT DEFAULT NULL COMMENT '(DC2Type:array)';

  ++ migrated (4.45s)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  ++ migrating 20170515222314

     -> CREATE TABLE imports (
    id INT AUTO_INCREMENT NOT NULL,
    is_published TINYINT(1) NOT NULL,
    date_added DATETIME DEFAULT NULL COMMENT '(DC2Type:datetime)',
    created_by INT DEFAULT NULL,
    created_by_user VARCHAR(255) DEFAULT NULL,
    date_modified DATETIME DEFAULT NULL COMMENT '(DC2Type:datetime)',
    modified_by INT DEFAULT NULL,
    modified_by_user VARCHAR(255) DEFAULT NULL,
    checked_out DATETIME DEFAULT NULL COMMENT '(DC2Type:datetime)',
    checked_out_by INT DEFAULT NULL,
    checked_out_by_user VARCHAR(255) DEFAULT NULL,
    dir VARCHAR(255) NOT NULL,
    file VARCHAR(255) NOT NULL,
    original_file VARCHAR(255) DEFAULT NULL,
    line_count INT NOT NULL,
    inserted_count INT NOT NULL,
    updated_count INT NOT NULL,
    ignored_count INT NOT NULL,
    priority INT NOT NULL,
    status INT NOT NULL,
    date_started DATETIME DEFAULT NULL COMMENT '(DC2Type:datetime)',
    date_ended DATETIME DEFAULT NULL COMMENT '(DC2Type:datetime)',
    object VARCHAR(255) NOT NULL,
    properties LONGTEXT DEFAULT NULL COMMENT '(DC2Type:json_array)',
    INDEX import_object (object),
    INDEX import_status (status),
    INDEX import_priority (priority),
    PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;

  ++ migrated (2.82s)

  ++ migrating 20170516000000

     -> INSERT INTO `lead_fields` (`is_published`, `label`, `alias`, `type`, `field_group`, `default_value`, `is_required`, `is_fixed`, `is_visible`, `is_short_visible`, `is_listable`, `is_publicly_updatable`, `is_unique_identifer`, `field_order`, `properties`, `object`)
VALUES (1, 'Points', 'points', 'number', 'core', '0', 0, 1, 1, 0, 0, 0, 0, 29, 'a:0:{}', 'lead');

  ++ migrated (2.09s)

  ++ migrating 20170517091309

     -> CREATE TABLE lead_event_log (
    id INT AUTO_INCREMENT NOT NULL,
    lead_id INT DEFAULT NULL,
    user_id INT DEFAULT NULL,
    user_name VARCHAR(255) DEFAULT NULL,
    bundle VARCHAR(255) DEFAULT NULL,
    object VARCHAR(255) DEFAULT NULL,
    action VARCHAR(255) DEFAULT NULL,
    object_id INT DEFAULT NULL,
    date_added DATETIME NOT NULL COMMENT '(DC2Type:datetime)',
    properties LONGTEXT DEFAULT NULL COMMENT '(DC2Type:json_array)',
    INDEX lead_id_index (lead_id),
    INDEX lead_object_index (object, object_id),
    INDEX lead_timeline_index (bundle, object, action, object_id),
    INDEX lead_date_added_index (date_added),
    PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;
     -> ALTER TABLE lead_event_log ADD CONSTRAINT FK_753AF2E55458D FOREIGN KEY (lead_id) REFERENCES leads (id) ON DELETE SET NULL;

  ++ migrated (5.34s)

  ++ migrating 20170607150241

     -> ALTER TABLE webhook_logs ADD note VARCHAR(255) DEFAULT NULL

  ++ migrated (4.9s)

  ++ migrating 20170607155015

     -> ALTER TABLE webhook_logs ADD runtime DOUBLE PRECISION DEFAULT NULL

  ++ migrated (4.03s)

  SS skipped (Reason: Schema includes this migration)

  SS skipped (Reason: Schema includes this migration)

  ++ migrating 20170628191405

     -> CREATE TABLE plugin_crm_pipedrive_owners (
  id INT AUTO_INCREMENT NOT NULL,
  email VARCHAR(255) NOT NULL,
  owner_id INT DEFAULT NULL,
  INDEX email (email),
  INDEX owner_id (owner_id),
  PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB;

  ++ migrated (3.61s)

  ++ migrating 20170725155053

     -> ALTER TABLE companies CHANGE score score INT(11) NULL

  ++ migrated (6.32s)

  ------------------------

  ++ finished in 71.72s
  ++ 51 migrations executed
  ++ 23 sql queries

The strange thing is, Mautic says that there has been no database schema changes, except for updates older than 2.6, but I was updating Mautic from the most recent previous verison, 2.8.3.  Oh well, something was missed in translation, can’t really complain about free marketing automation if it has a few glitches once in a while.  I’ve never updated a version of Mautic that was completely smooth but there has always been a workaround.