Member Profile Add-ons in ExpressionEngine

By Jonathan McGaha

My name is Jonathan McGaha, and I’m a developer who has worked with Focus Lab for a little over a year.

Member Profile Review Banner Alt

As we prepare to start a new project, we realized that a review of the available options for member management and form management would be valuable for us as well as other members of our community. This post will look at the currently available add-ons for creating and editing member profiles in ExpressionEngine, while a post reviewing form management add-ons will follow in the next few weeks.

Coming into this post, we only wanted to review add-ons that store member data as channel entries, rather than simply keeping them inside the member_data area of the database. For this reason, Solspace User is not included. For the add-ons covered, we’ll discuss the installation process, the workflow for migrating users from existing sites, the template tags available and the included support.

Add-ons we’re reviewing

Profile:Edit v1.0.7

Safecracker Registration v1.1.5

Zoo Visitor v1.3.15

  • Initial version released February, 2012
  • $59.99 - Devot:ee

At the outset, I’ll tell you that the add-on that most impressed me was Zoo Visitor. It has complete documentation, the easiest installation process and simplest migration process, which made me appreciate all of the work that went into executing every detail of this add-on.


The installation process for each of these these add-ons is a standard ExpressionEngine add-on installation experience. Each has an extension and a module to be installed, but Zoo Visitor also has a nifty fieldtype (more on that later). Once the add-ons are installed, Profile:Edit and Zoo Visitor also give you the option to install sample templates that really help to speed up the development process.

Another plus for Zoo Visitor is a “Troubleshooting” tab. This tab checks all the necessary settings to ensure Safecracker and Zoo Visitor are working correctly. I happened to have missed one setting that otherwise would have been hard to figure out, but the Troubleshooting tool caught it for me. Any add-on that has multiple moving parts and settings should consider something like this to help users and decrease support requests.

Zoo Visitor's Troubleshooting screenZoo Visitor’s Troubleshooting screen (Full size)


Any existing site that installs these add-ons will need to migrate data from the member fields into a channel. Zoo Visitor handles this process the best of the three. All you do is simply check which fields you want migrated, and you’re done. The channel and all of the custom fields are made for you automatically. With Safecracker Registration, you have to make the channel and then all the custom fields yourself before migrating the data. Profile:Edit makes a channel for you and places a few fields into that channel, but these are not your custom fields. I actually deleted all of the fields that the add-on put in there for me.

Zoo Visitor's import options screenZoo Visitor’s import options screen

Profile:edit's import options screenProfile:edit’s import options screen

It is also worth mentioning that I could not get Safecracker Registration’s migration to work. I contacted the developer who said that was a little-used feature, but he was going to do more work on it before the v1.2 is released.


One of the main purposes of these add-ons is for your users to be able to register and edit their profiles without having to use archaic, built-in member templates included with ExpressionEngine. All three of these add-ons are built on top of Safecracker, so if you’ve ever used Safecracker, the syntax will instantly be recognizable. Safecracker Registration even uses the {exp:safecracker} tags with just a few enhancements, so it should be quite easy to pick up.

Here are examples of the template code needed to edit your profile.

<code>{exp:zoo_visitor:update_form return='profile'}     Screen Name: <input type="text" name="screen_name" value="">     Email: <input type="text" name="email" value="">     First Name: <input type="text" name="member_first_name" value="{member_first_name}">     <input type="submit" value="Save"> {/exp:zoo_visitor:update_form} </code>
<code>{exp:profile:edit return="profile"}     Screen Name: <input type="text" name="screen_name" value="">     Email: <input type="text" name="email" value="">     First Name: <input type="text" name="member_first_name" value="{member_first_name}">     <input type="submit" value="Save"> {/exp:profile:edit} </code>
<code>{exp:safecracker channel="members" error_handling="inline" return="profile"     dynamic_title="[member_first_name] [member_last_name] - [email]" register_member="true" }     Screen Name: <input type="text" name="screen_name" value="">     Email: <input type="text" name="email" value="">     {label:member_first_name}: <input type="text" name="member_first_name" value="{member_first_name}">     <input type="submit" value="Save"> {/exp:safecracker} </code>

Extra Features

Profile:Edit, which is made by the same company that makes the e-commerce module CartThrob, has some cool, built-in integration. When these two add-ons are installed, you don’t have to use any Profile:Edit tags. You just use the CartThrob customer_info tag.

Profile:Edit and Zoo Visitor also make your member fields available as global variables. If anyone has worked with member profiles without this, you’ll know that you very quickly run into parse order problems since these fields are normally parsed at the end.

If you edit or view a profile from the control panel, Zoo Visitor uses its custom fieldtype to add some really convenient features. If you go to Content → Edit → Zoo Visitor Members and then choose any member, from there you can change their member group, email address, password, login as the member or even delete the member. For the other add-ons, you’d have to go the native route and go Members → View All, then pick the member and click through various links to find that info. With Zoo Visitor, it’s all in one place.


Safecracker Registration and Zoo Visitor are supported in the Devot:ee forums. I was able to get quick responses for Safecracker Registration and Erik, our Technical Director, vouches for quality support from Zoo Visitor in a previous project.

Profile:Edit has a support forum at their own website. I’ve not needed it yet, but I’ve always gotten good support for their other product, CartThrob.


As we stated in the introduction, Zoo Visitor came out on top for us. Their installation and migration process was by far the easiest of the three. When you see that the template tags are pretty even across them all, you appreciate the extra niceties Zoo Visitor has.

The one caveat I have for this recommendation is for those who are doing a project that uses CartThrob. In this case, Profile:Edit might be the way to go because it integrates better with CartThrob than Zoo Visitor does.