People Add-on Now Available for Event Espresso 4

Sponsored development! This add-on was developed under a sponsored development contract. Learn more about Our Mission and Sponsoring Development.

Get Started!
Purchase the People add-on for Event Espresso 4.


The Event Espresso People add-on creates an interface for managing staff, instructors, speakers, volunteers, sponsors, or just about any type of role someone might fill within an event and/or organization.

How does it work?

The People add-on creates a new interface within the Event Espresso 4 admin for managing people associated with an organization and/or event. People can be organized by type (eg. as staff (default), volunteer, speaker, sponsor, etc.) and categories.

Views and Post Types

People archive pages are automatically created using WordPress Custom Post Types, and can be easily added to a WordPress menu or customized by a designer/developer.

The default templates use your WordPress theme’s default archive.php file. Theme designers/developers should be able to create custom post type templates using the Event Espresso People Custom Post Types that are made available, once the add-on is installed and people are added to the system.

For example, this is a list of “Founders” (just a custom type I created earlier), that I can view by visiting the “founders” people type archive page (example:

This is a list of “Founders” profiles, as seen on a People archive page.ee4-people-people-archive


This shows an individual’s profile, type, and events he is assigned to.
This is the People manager, or People overview.
Multiple staff members can be assigned to a single event, or many different events.
The People display order can also be customized from within the event editor. Drag and drop ordering will be available in a future version.
Events templates automatically display the staff assigned to an event.
Your theme controls the style of the People listings within the event pages.
Dynamically list events a staff member is involved in on staff page. If a staff member is assigned to an event, each event is dynamically listed on their staff page.


Frequently Asked Questions

  1. How are people related to WordPress users?
    In the initial iteration there will be no relationships between a person in the people post type and WordPress users. However, nothing we are planning in the initial iteration will prevent integrating a relationship in the future. Here’s some of the things we are considering for later iterations (again VERY early spec talk).

    • have some sort of mapping between people type and WordPress user roles.
    • ability to “link” a person to a wp-user
    • automate the above process or have manual interaction (tbd)
  2. Is there a way to customize the relationship between people and events?
    Initially we are going to store role and order in the relationship table as for most use cases that will likely be sufficient.One thing we have built in EE is something called an Extra Meta table. This is basically a universal meta table for adding additional meta information attached to object representations. So we could easily use this to extend the saved meta for a people to event (or eventually people to venue) relationship.
  3. What is the relationship between attendees and people?
    When our team first talked about doing a people custom post type early in EE4 development we had considered including attendees (referred to as “contacts” in the UI) as a potential people type. However we decided against this primarily because although much of the same information is shared, there are some unique relationships between not only attendees and events but also attendees and registrations (which in turn relate to transactions), and attendees and system questions (i.e. email, first name, last name) that really complicated things if we wanted the people post type to be really flexible and yet have certain inflexible components to it due to the attendee people type. So in the end we decided that attendees would be their own custom post type that helps to clearly delineate between contact records for attendees and people who function more on the event organization side of things. We recognize that there still will be some overlap. i.e. it’s usually the case where a “speaker” also attends an event. This is why at some point I think we’ll build in some relational connections between the people post type and the attendee post type, at least for an easier way to keep data in sync if necessary. It is our feeling that explicitly separating attendees from more generic people is the better way to go in this case after weighing all the options and nothing we have built yet contradicts that. So to be more specific:

    1. In the initial iteration people will never be tied to attendees.
    2. In the initial iteration attendees (contacts) will never have people records (but we *may* make that possible in later iterations)
Get Started!
Purchase the People add-on for Event Espresso 4.
View documentation for People Add-on

Get help with the People add-on in our support forums

Ask a pre-sales question about the People add-on.

Please post your questions below, we are eager to help.

Related Articles

Share a Reply or Comment

Your email address will not be published.

Need help with Event Espresso? Create a support post in our support forums

Event Espresso
[gravityform id=116 title=false description=false]
<script type="text/javascript">var gform;gform||(document.addEventListener("gform_main_scripts_loaded",function(){gform.scriptsLoaded=!0}),window.addEventListener("DOMContentLoaded",function(){gform.domLoaded=!0}),gform={domLoaded:!1,scriptsLoaded:!1,initializeOnLoaded:function(o){gform.domLoaded&&gform.scriptsLoaded?o():!gform.domLoaded&&gform.scriptsLoaded?window.addEventListener("DOMContentLoaded",o):document.addEventListener("gform_main_scripts_loaded",o)},hooks:{action:{},filter:{}},addAction:function(o,n,r,t){gform.addHook("action",o,n,r,t)},addFilter:function(o,n,r,t){gform.addHook("filter",o,n,r,t)},doAction:function(o){gform.doHook("action",o,arguments)},applyFilters:function(o){return gform.doHook("filter",o,arguments)},removeAction:function(o,n){gform.removeHook("action",o,n)},removeFilter:function(o,n,r){gform.removeHook("filter",o,n,r)},addHook:function(o,n,r,t,i){null==gform.hooks[o][n]&&(gform.hooks[o][n]=[]);var e=gform.hooks[o][n];null==i&&(i=n+"_"+e.length),gform.hooks[o][n].push({tag:i,callable:r,priority:t=null==t?10:t})},doHook:function(n,o,r){var t;if(,1),null!=gform.hooks[n][o]&&((o=gform.hooks[n][o]).sort(function(o,n){return o.priority-n.priority}),o.forEach(function(o){"function"!=typeof(t=o.callable)&&(t=window[t]),"action"==n?t.apply(null,r):r[0]=t.apply(null,r)})),"filter"==n)return r[0]},removeHook:function(o,n,t,i){var r;null!=gform.hooks[o][n]&&(r=(r=gform.hooks[o][n]).filter(function(o,n,r){return!!(null!=i&&i!=o.tag||null!=t&&t!=o.priority)}),gform.hooks[o][n]=r)}});</script> <div class='gf_browser_unknown gform_wrapper gform_legacy_markup_wrapper' id='gform_wrapper_116' ><form method='post' enctype='multipart/form-data' id='gform_116' action='/2015/04/people-add-on-now-available-for-event-espresso-4/' novalidate> <div class='gform_body gform-body'><ul id='gform_fields_116' class='gform_fields top_label form_sublabel_below description_below'><li id="field_116_5" class="gfield gfield_contains_required field_sublabel_hidden_label field_description_below gfield_visibility_visible" ><label class='gfield_label gfield_label_before_complex' >What is your first name?<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_complex ginput_container no_prefix has_first_name no_middle_name no_last_name no_suffix gf_name_has_1 ginput_container_name' id='input_116_5'> <span id='input_116_5_3_container' class='name_first' > <input type='text' name='input_5.3' id='input_116_5_3' value='' aria-required='true' placeholder='First name' /> <label for='input_116_5_3' class='hidden_sub_label screen-reader-text'>First name</label> </span> </div></li><li id="field_116_1" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" ><label class='gfield_label' for='input_116_1' >What is your email address so we can follow up with you?<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_text'><input name='input_1' id='input_116_1' type='text' value='' class='medium' placeholder='' aria-required="true" aria-invalid="false" /> </div></li><li id="field_116_2" class="gfield gfield_contains_required field_sublabel_below field_description_below gfield_visibility_visible" ><label class='gfield_label' for='input_116_2' >Tell us about your concerns below<span class="gfield_required"><span class="gfield_required gfield_required_asterisk">*</span></span></label><div class='ginput_container ginput_container_textarea'><textarea name='input_2' id='input_116_2' class='textarea medium' placeholder='What kind of events are you planning?' aria-required="true" aria-invalid="false" rows='10' cols='50'></textarea></div></li><li id="field_116_6" class="gfield field_sublabel_below field_description_below gfield_visibility_visible" ><label class='gfield_label gfield_label_before_complex' >GDPR Agreement</label><div class='ginput_container ginput_container_checkbox'><ul class='gfield_checkbox' id='input_116_6'><li class='gchoice gchoice_116_6_1'> <input class='gfield-choice-input' name='input_6.1' type='checkbox' value='I consent to have this website store my submitted information so they can respond to my inquiry.' id='choice_116_6_1' /> <label for='choice_116_6_1' id='label_116_6_1'>I consent to have this website store my submitted information so they can respond to my inquiry.</label> </li></ul></div></li><li id="field_116_3" class="gfield gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" ><div class='ginput_container ginput_container_text'><input name='input_3' id='input_116_3' type='hidden' class='gform_hidden' aria-invalid="false" value='' /></div></li><li id="field_116_4" class="gfield gform_hidden field_sublabel_below field_description_below gfield_visibility_visible" ><div class='ginput_container ginput_container_text'><input name='input_4' id='input_116_4' type='hidden' class='gform_hidden' aria-invalid="false" value='' /></div></li><li id="field_116_7" class="gfield gform_validation_container field_sublabel_below field_description_below gfield_visibility_visible" ><label class='gfield_label' for='input_116_7' >Name</label><div class='ginput_container'><input name='input_7' id='input_116_7' type='text' value='' autocomplete='new-password'/></div><div class='gfield_description' id='gfield_description_116_7'>This field is for validation purposes and should be left unchanged.</div></li></ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_116' class='gform_button button' value='Send my message' onclick='if(window["gf_submitting_116"]){return false;} if( !jQuery("#gform_116")[0].checkValidity || jQuery("#gform_116")[0].checkValidity()){window["gf_submitting_116"]=true;} ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_116"]){return false;} if( !jQuery("#gform_116")[0].checkValidity || jQuery("#gform_116")[0].checkValidity()){window["gf_submitting_116"]=true;} jQuery("#gform_116").trigger("submit",[true]); }' /> <input type='hidden' class='gform_hidden' name='is_submit_116' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='116' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_116' value='WyJbXSIsIjBiNjdjZjkyMDUzOWUxOWY5Y2NiZjIwMzM4YjA1Mjk4Il0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_116' id='gform_target_page_number_116' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_116' id='gform_source_page_number_116' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> <p style="display: none !important;"><label>&#916;<textarea name="ak_hp_textarea" cols="45" rows="8" maxlength="100"></textarea></label><input type="hidden" id="ak_js_2" name="ak_js" value="183"/><script>document.getElementById( "ak_js_2" ).setAttribute( "value", ( new Date() ).getTime() );</script></p></form> </div>