Zen Cart – MailChimp Integration

My Zen Cart – MailChimp integrations have received the following updates:

  • Fixed bug in API integration:
    The original integration had error checking that was based on the 1.3 API, and lo longer work.  So while the success path logic was all correct, the error handling was wrong.
  • Added instructions for changing Zen Cart newsletter page:
    The original Zen Cart integration only handled signup on the account creation page. Now users may subscribe or unsubscribe on the newsletter page (which is linked to on the My Account page as /index.php?main_page=account_newsletters.
  • Removed double opt in:
    At the request of ecommerce companies, MailChimp has changed the default subscribe behavior so that double opt in is no longer required.  Users who prefer the prior behavior can still change it back by modifying the PHP API (includes/functions/extra_functions/mailchimp.php) to set status based on $options[‘status’] rather than just to subscribed.
  • Moved MailChimp error log to /logs folder:
    In the event of an error, the MailChimp.log file was being written to the /cache folder; it is now written to the /logs folder where it is more likely to be noticed (since most logfiles have been migrated there in Zen Cart 1.5+).

You can see the updates in my ZenCart MailChimp and ZenCart Newsletter Discount contributions, and  my MailChimp Integration for Zen Cart GitHub repository.

Buy the other TLDs, Cheapskate!

Imagine how embarrassing it must have been to Ted Cruz that visitors to TedCruz.com were encouraged to vote for Beto O’Rourke!  That is some devious hacking, right?

Uh, no.  The Cruz campaign just neglected to buy the .com variant of their domain, thinking TedCruz.org would be sufficient.  So someone else – a competitor – bought TedCruz.com.

Now do you really need to buy every possible TLD for your brand?  Do you need to buy the .tv if you’re not in television, for example?  Maybe not, but only a fool would neglect to buy the .com domain.  Don’t make this mistake!

PayPal’s New Download format – Big Red Consulting to the rescue!

If you are importing PayPal transactions (from your Zen Cart!) to Quickbooks using PayPal to QB Link from Big Red Consulting, you need the new version of this software to deal with Paypal’s new download format!  PayPal finally did away with their legacy downloader (and its associated format), and now all users must use the new download interface.  This is a new change; as recently as Oct 1, 2018, I was able to use the Legacy downloader.

Grab the updated PayPal to QB Link (sometimes just called PayPal Link) here: http://bigredconsulting.com/latest-version-info/

You will need to re-import your QB lists and modify the download format within PayPal, but the documentation will lead you through all of this.  BIG UPS to Big Red Consulting for being 100% prepared for this PayPal change!

Printing Mailing Labels from Salesforce

Thanksgiving and Christmas are just around the corner – would you like to send cards to your customers?  Doing this with Salesforce and a Dymo printer is quite straightforward.

You may want to create a new field in your Contacts account that allows you to mark customers who should receive cards.  I have a Status field that allows me to find customers who have a Support agreement with me, and I select on that basis.  (If you’re unsure how to add a new field to an object, watch this video from Salesforce.)

In Salesforce, go to Reports->New Report.   Select “Accounts & Contacts,” and use the report type “Contacts & Accounts.”   Update the columns so you use the following fields:


First Name Last Name Account Name Mailing Street Mailing City Mailing State/Province Mailing Zip/Postal Code

If required, you can also add Mailing Country.  Once you have all your fields selected, use filters to reduce the list to only the contacts you want, selecting on the field you used to determine if the contact gets a card.  In my case, that would be the Status field.  Then do an Export, and choose “Details Only” with format CSV.

In the Dymo Label app on your computer, use File->Import Data->New.  The default label is Address Barcode on Top, but you can change this if you like.  I like the address label without a barcode.  Select your data file (the CSV you just created from Salesforce), and click Next.  On the “Arrange Data Fields on the Label Layout” page, check the box labelled “Use first row as field names.”  To create the label, you just double click on each field, and lay it out on the label.  By the time you’re done, you should have something like this:

Dymo label for Salesforce Contact

Now just print them out and get cracking on those holiday cards!

From Zen Cart to Salesforce – Handling Accounts

Unlike most B2C e-commerce systems, Salesforce makes a distinction between Contacts, which are identified by an email address, and Accounts, which are identified by a name and site.  Contacts belong to an Account, and an Account may have many Contacts.

The way I handled this relationship in the first version of  Zen Cart to Salesforce was simply use the email address as the Account name. This has a significant advantage, since the email address for a shopping cart account is an immutable field.

However, some larger customers have multiple email addresses associated with a single account.   Also, some customers had e-mail address changes over the life of their relationship with me.

For these reasons, I decided to add a “salesforce_account_name”  field to the customers table.  I populate this only in cases where the email address is not sufficient.   I also had to modify the customer export script to export that field rather than the email address in the Account column of the CSV when it was set.

This new way of handling Accounts is reflected in the 360 Sales Reporting modification I did, to get more accurate per-account sales data.

Showing Zen Cart Customer Updates needed by Salesforce

If you’ve installed my Zen Cart to Salesforce Customer Import tool, and done a few exports of customers from your admin, you’d probably like an easy way to see how many updates (if any) are outstanding when you login to your Zen Admin.

I have made a small modification to the admin dashboard (in Zen Cart 1.5.5) to do this, which is described below.  Steps:

a) Add the define BOX_ENTRY_UPDATES_TO_SALESFORCE to admin/includes/languages/english/index.php.

define('BOX_ENTRY_UPDATES_TO_SALESFORCE','New/Updated records for Salesforce');

b) Add the logic to calculate and display the number of new/updated records to admin/index_dashboard.php.

Calculate it below the salemaker query on line 31:

$last_export = $db->Execute("SELECT * FROM " . TABLE_SFDC_CONFIG);
$last_customers_export = $last_export->fields['last_customers_export'];
$salesforce_customers_query = "SELECT count(*) AS count FROM " . 
   TABLE_CUSTOMERS . " c, " . TABLE_ADDRESS_BOOK . " a, " . 
   TABLE_CUSTOMERS_INFO . " ci WHERE a.customers_id = c.customers_id 
   AND a.address_book_id = c.customers_default_address_id AND 
   ci.customers_info_id = c.customers_id AND 
   (ci.customers_info_date_account_created > '" . 
   $last_customers_export . "' OR 
   ci.customers_info_date_account_last_modified > '" . 
   $last_customers_export . "')";
$salesforce = $db->Execute($salesforce_customers_query);

Now display it below the customers count display on line 72:

echo '<div class="row"><span class="left">
   <a href="' . zen_href_link(FILENAME_SFDC_EXPORT_CUSTOMERS) . '">' . 
   <span class="rigth"> ' . $salesforce->fields['count'] . '</span></div>';

The typo in the class name right is required in Zen Cart 1.5.5; it has been fixed in Zen Cart 1.5.6.

Lifetime Customer Value for Zen Cart customers

When coach Ryan Waggoner asked me about the lifetime value of my average customer, I was embarrassed to say I didn’t know!  So I added Lifetime Customer Value to the Zen Cart Admin->Customers page in this pull request.  The change is now in the 1.5.6 branch, but it can be easily backported to any 1.5.x version of Zen Cart.  It’s a great way to get visibility into the activity of all you customers, and especially your most valuable ones.