Mapping Addresses

WP Issues CRM supports the presentation any list of found constituents on maps. You can add layers (like district boundaries) that will be displayed on all maps. If political party is coded, found constituents will show as red, blue or purple.

There are three parts to making this work.

First, all presentation of maps relies entirely on the Google Maps API — so an API Key needs to installed, following the instructions on your WP Issues CRM Main Settings geocoding tab.

Second, although the Google Maps API can do geocoding, it is not designed to support real time geocoding of a large number of points, so we need to geocode all the addresses in advance to be ready for presentation. One economical service that does geocoding is Gecodio. If you get yourself a Geocodio API key and install it in main settings, WP Issues CRM will do the rest.

Please note that the geocoding process handles batches of 10,000 addresses every five minutes, so that if you add 120,000 records to your database, it will take approximately an hour to geocode them all.

If you are running multi site, you can install either or both the Google Maps and Geocodio keys in your wp-config.php and they will be available to all sites on your installation. Just plug your keys into these two lines and add them to wp-config.php somewhere above “/* That’s all, stop editing! Happy blogging. */”:

define( 'WIC_GOOGLE_MAPS_API_KEY', 'YOUR_MAPS_API_KEY');
define( 'WIC_GEOCODIO_API_KEY','YOUR_GEOCODIO_KEY');

If you configure the Geocodio API centrally, then all sites will share looked up addresses, saving costs — once an address has been geocoded by one site, it will be saved in a central cache for others to use.

Especially in a central installation, it may make sense to install a cron tab to assure that geocoding continues while the site is idle. Place the following line in your wp-config.php:

define( 'WIC_GEOCODING_CRON_RUN_KEY', 'some_long_string_letters_and_numbers');

And then set up a cron tab through CPanel to run every five minutes:

wget -q -O - http://yoursiteurl/?wic_geocoding_cron_run_key='the_same_long_random_string'

The results of geocoding runs can be monitored in the file named wp_issues_crm_geocoding_log which will appear in the wp-content directory.

You can also write your own geocoding function to user your preferred geocoding data source instead of Geocodio. Just name it wp_wic_lookup_geocodes_local and install it as a WordPress plugin and WP Issues CRM will turn to that function. Refer to the code for WIC_Entity_Geocode::update_geocode_address_cache as a model.

Finally, to add layers, you must encode them in geojson format and then point to them in the wp-config.php file by carefully following this example:

define('WP_ISSUES_CRM_MAP_DATA_LAYERS',
array (
array( 'layerTitle' => 'Senate Districts', 'layerURL' => 'http://localhost/senatedistricts.geojson'),
array( 'layerTitle' => 'House Districts', 'layerURL' => 'http://localhost/repdistricts.geojson'),
array( 'layerTitle' => 'Municipalities', 'layerURL' => 'http://localhost/town351.geojson'),
)
);

Customizing mail tabs

The WP Issues CRM inbox will, without any customization, segregate any trained messages under the ‘Advocacy’ tab. The advocacy tab is so populated regardless of any further customization below.

WP Issues CRM allows you to further segregate messages into custom tabs based on whatever message content or header data you wish to parse. This requires creating a special purpose plugin. A simple example plugin that adds a ‘Social’ tab appears below. You may be able to go much further by referencing data in the spam filter headers created by the spam filter installed on your mail server.

Write the plugin php code and then place it within a .php file within a subdirectory of the wp-content/plugins directory of your site. This code will then be invoked in the message parsing process to assign a category to each message.

Sample code module:

<?php 
/**
Plugin Name: WP Issues CRM Sample Social Tab plugin
Plugin URI: http://example.com
Description: Sample code to demonstrate model for create custom tabs
Version: 0.1
Author: Will Brownsberger
Author URI: http://willbrownsberger.com
Text Domain: wp-issues-crm
License: Not Licensed
License URI: Not Licensed
Text Domain: wp-issues-crm
*
NOTE THAT HEADERS AS ABOVE ARE NECESSARY FOR WORDPRESS TO ALLOW YOU TO ACTIVATE THE PLUGIN
*
*
*/

// category filter hook -- hooks your function into the parsing process for WP Issues CRM
add_filter( 'wp_issues_crm_local_category_filter', 'social_mail_filter', 10, 3 );

// category filter
function social_mail_filter( $category, $email_object, $constituent_id ) {

// list social domains
$group_social = array (
'facebook.com',
'twitter.com',
'linkedin.com',
'mail.instagram.com',
'meetup.com',
'rs.email.nextdoor.com',
'eventbrite.com',
);
if ( in_array( $email_object->from_domain, $group_social ) ) {
return 'CATEGORY_SOCIAL';
}
// default if not social
return 'CATEGORY_GENERAL';
}

/*
* local_tab_definition() is called when inbox produced
* tab names must correspond to category names --
* as 'General' corresponds to 'CATEGORY_GENERAL'
*/
function local_tab_definition() {
$tabs_array = array(
  'General',
  'Advocacy',
'Social', );
  return $tabs_array;
}

Multisite Activesync configuration

In a multisite installation where all sites are reading email accounts on the same email server, you may wish to control the polling process and the delivery process to manage mail server work load.

WP Issues CRM includes a mechanism for managing server work load that is especially tailored for ActiveSync on Exchange. It involves replacing the random WordPress cron cycles of the various sites with a single cron job that runs periodically to do read and send for all sites. The process divides the requests of each user into manageable chunks and maximizes the chances that all users make read and send progress in every cycle.

The steps for configuring this mechanism are as follows:

(1) place the following lines in wp-config.php above the line that reads /* That’s all, stop editing! Happy blogging.

define('WP_ISSUES_CRM_USING_CENTRAL_CRON_CONTROL', true);
define('WP_ISSUES_CRM_GET_REQUEST_PAGE_SIZE', 10 );
define('WP_ISSUES_CRM_MESSAGES_SENT_PER_ROTATION', 10 );
define('WP_ISSUES_CRM_CRON_CLEARANCE_SECONDS', 20 );
define('WP_ISSUES_CRM_CRON_INTERVAL', 120 );
define('WP_ISSUES_CRM_MESSAGE_SEND_DELAY', 50 );
  • WP_ISSUES_CRM_GET_REQUEST_PAGE_SIZE sets the number of messages batched in single request for message bodies — recommended value is 10 ( will get a singe page per batch cycle)
  • WP_ISSUES_CRM_MESSAGES_SENT_PER_ROTATION sets the number of messages that will be sent each time the user gets a turn in the rotation generated by this function
  • WP_ISSUES_CRM_CRON_CLEARANCE_SECONDS is an estimated safe number number of seconds that should suffice to complete a page of get or send requests
  • WP_ISSUES_CRM_CRON_INTERVAL is max number of seconds that the cron job will keep working for — should correspond to timing of cron interval
  • WP_ISSUES_CRM_MESSAGE_SEND_DELAY is the number of milliseconds to wait between send events

(2)add an additional define line below those, replacing ‘some_long_random_string’ with a 64 character string of letters and numbers (not spaces or special characters)


define('WP_ISSUES_CRM_RUN_CRON_KEY', 'some_long_random_string');

(3) through CPanel, set up a cron tab to trigger at your desired cron interval — recommended starting point: 2 minutes

(4) in that cron tab, place the following instruction (on a single line)

wget -q -O - http://yoursiteurl/?wp_issues_crm_run_cron_key='the_same_long_random_string_you_inserted_in_step_two' >/dev/null 2>&1

(5) You may wish to also add a line to config.php limiting the size of list sends — example to limit to 500

 define('WP_ISSUES_CRM_MESSAGE_MAX_SINGLE_SEND', 500 ); 

Configuring Secure Gmail Access in WP Issues CRM

WP Issues CRM now supports the Gmail API as one option for reading email.  The Gmail API offers connectivity superior to traditional IMAP connectivity. It is a little more secure and also allows WP Issues CRM to present an inbox showing the Gmail tabs.

The steps to configuring the Gmail API are truly convoluted, but need only done once in a multiuser installation. Once the lead blog is configured with gmail credentials, each individual site need only supply their email to connect.

Whether for an individual site or for a multisite installation, here are the basic steps to configuring the gmail API. They require access to and basic familiarity with the file server that your web site runs on.  Additionally, they require interaction with Google’s developer console to create “project” credentials — the credentials creation progress can be confusing, but once complete, the API works like a charm.

  1. Sign into your Google Account.
  2. Visit the Google Developer’s console.
  3. You should be prompted to create a “project”.  Create a project with an appropriate name.
  4. Once you create the project, you will need to verify the domain that you intend to gain credentials for.  Click Domain Verification, Add Domain and follow instructions as necessary (may vary based on your prior google developer activity).
  5. Click the Oauth consent screen Tab and provide the required information.
  6. Then you click “Credentials” and click “Create Credentials” and select “Oauth Client ID” and then select “Web Application”.  
  7. The “Name” you choose will be visible to you and your users when they sign in through Google.
  8. You do not need to fill in “Javascript origins”, but you must fill in Authorized redirect URI  with the following : https://EXAMPLE.COM/wp-admin/admin.php?page=wp-issues-crm-main&entity=email_oauth&action=redirect_from_gmail&id_requested=0  — EXAMPLE.COM should be your site (including any subdirectory that you have installed WordPress in — e.g. EXAMPLE.COM/blog
  9. When you click Create after completing this form, you will be shown your client ID and secret. Just click OK and then download the credential file from the list of Client IDs.
  10. Install the credentials a file at location outside the public_html ( or www ) directory of your web server. You do not want the credential file to be directly accessible over the web. A good place is in the directory immediately above your public_html directory.
  11. Place a line in the wp_config.php file that resides within your public_html directory that reads as follows:

    define ('WIC_GMAIL_OAUTH_CREDENTIALS_FULL_PATH', '/full/pathto/yourcredentialsfile');

    This line should be placed in a manner consistent with the other definition lines in the file, but it does not matter exactly where.  A safe place is immediately below another definition line. You should replace /full/pathto/yourcredentialsfile with the full path to your credentials file, including the starting slash all the way through and including the full filename, likely ‘credentials.json’. The starting slash indicates the root directory of your server, so be sure to include all the intermediate elements of the path. The final semi-colon in the line is a necessary part of the line. Your line should include the single quotes around the path.

  12. You do NOT need to install the Google Client Library or do any other programming — the necessary components are packaged and integrated with WP Issues CRM.
  13. Once you have installed the credentials file, you should select Gmail as your “Read Email from” in the Account tab in the Settings for WP Issues CRM email  (not the “Main Settings” page).
  14. Finally click on the Gmail tab in  email settings and connect.  You will be alerted that you are connecting to an unrecognized project.  That project is the one you created — it is your installation of WP Issues CRM, not any central copy of WP Issues CRM.  You are giving permission to yourself.
  15. On first go around, you may be prompted to go to the developer console and enable the Gmail API — do so.

Note — if this is all too daunting, Gmail supports access for both sending and receiving using traditional IMAP and SMTP over SSL  and you can much more easily configure that type of access for WP Issues CRM.  If you connect using IMAP/SMTP instead of using the API,  Gmail will characterize the app as “less secure” and it is, in fact, slightly less secure in the sense that you are saving an encrypted copy of your password in an additional location (to wit, your copy of WP Issues CRM).  If you feel that your WordPress installation is secure, there is no real security reason not to use traditional IMAP access.  In the email Settings/Account tab select ‘Any account configured in main settings’ and then configure Email In and Email Out in main settings.

Understanding WP Issues CRM Email Version 3.4 and above

Overview

Essentially WP Issues CRM is an email client, an email list manager and a CRM combined in one, using all of the classification power of WordPress.

The email function supports the automated handling of high volume repetitive incoming correspondence and facilitates follow-up correspondence on issues.

It parses the body text of incoming emails to extract name and street address information (commonly included in political advocacy emails) and match that information to your constituent database.

It supports automated reply to learned subjects or texts and automated classification of messages for record keeping.

Basic Concepts

The major data concepts in WP Issues CRM are:

  • Constituents
  • Issues ( these are just WordPress posts and can be public or private )
  • Activities (which are always linked to a constituent and an issue)

An incoming email is logged as an activity — you may wish to delete it without logging it, but if it comes from a constituent, you can “Record” it, automatically logging it as an activity for a constituent pertaining to an issue. You would use the Record email button when you wanted to save the message for future action.

If you have a reply ready, you can just quickly reply and, if it the message does not pertain to a recurring issue and you do not wish to create an issue for it, the email will be assigned to “Unclassified Activity.”

If it looks like the email might be part of an incoming email campaign, one of many repetitive messages to come, you can automate future replies as follows.

  1. Select or create an Issue to assign the email to — one-click on the + sign to add a new issue and assign it.
  2. Draft your reply and Save it — this will become the standard reply for that issue/pro-con combination.
  3. When you reply, click “Train” on the confirmation popup.  Training sets the relationship between incoming subject and issue/pro-con classification.  The reply for that issue/pro-con combination can be edited.
  4. Future messages with the same subject line and the same main content can then be recorded and replied to with one click on the sweep (>>) button on the inbox.
  5. Note that if you already have a lot of identical messages in your inbox, you may need to wait a few seconds and refresh the inbox for the messages to come up as grouped and ready for sweeping.

Even if you do not click “Train”, your saved reply will be available for loading when you assign another incoming email to the same issue/pro-con combination.  You will not be offered the option to train unless you have saved or loaded a standard reply (except in the rare case where you have deleted a standard reply for a previously trained message).

Grouping Control

Grouping control determines when messages are grouped for bulk handling in the inbox. It resembles the “Conversation View” choice in many email clients, but is completely different.  It does not group messages from cc’d users in reply threads, rather it groups similar incoming messages from unrelated users to be handled in bulk.

By default WP Issues CRM takes a conservative approach to grouping — grouping messages only if you have checked train on a previous reply AND the messages:

  1. Have the exact same subject line (binary, down to capitalization and spaces, as when the messages are being generated by clicks on an advocacy website) AND
  2. The messages are reasonably long — over 200 words (1400 nonspace characters at 7 characters per word) AND
  3. The message content is 85% identical (excluding address blocks in the body).

You can loosen the second and third criteria to group more messages.  You might want to do this temporarily when using a wildcard subject line that matches multiple similar subjects to clean up messages in a campaign that is using multiple subject lines.  You can access the Grouping Control tab through Settings on the email menu.

Subjects

Trained subject lines and standard replies for issues typically need to evolve over time.  In addition to simply remapping subject lines and/or creating new replies in the main reply editor, you have three tools:

  1. You can set a “Forget Date” in email settings.  Older mappings will simply be ignored.
  2. You can directly manage the Subject list.
  3. You can directly manage the Saved reply list.

Wild Card Subjects and Informal Campaigns

The easiest campaigns to manage with WP Issues CRM are those generated by computers — constituents are urged to click to contact their legislator.  These campaigns often result in a flood of emails with identical subject lines and identical non-address content.  Less formal campaigns where the email subject and content can change slightly are more work.

You may need to manually review each message in an informal campaign to classify it to the issue that is the subject of the campaign.  But, once you classify the message, WP Issues CRM will prompt you to load your standard reply for that issue/pro-con combination.  You can then further personalize that reply before sending it.

In campaigns that are semi-formal (i.e., are computer generated, but with some variation in subject line and content), you may be able to fully automate responses to them as follows:

  1. Through the Subjects list add a wildcard subject line that matches most of the subject lines.  For example, if the campaign were about a particular numbered piece of legislation (H2389), you could create a wildcard line like %2389%.
  2. Return to the Inbox and create and save a standard reply to one of the messages.
  3. Reply to that message and click Train.
  4. Go to Settings and lower the length and matching standards under Grouping Control
  5. Return to the Inbox once again and the messages should be grouped (note that grouping will take a few seconds as the Train action in step 3 spins off a longer task to review the Inbox messages and see if they can be handled).
  6. If messages aren’t grouped, try lowering the length and matching standards even further and also check they way you defined your Wildcard subject.

Caution: Wildcard subject lines can match way too much, so it is good practice to delete them after you’ve handled campaign you designed them for.

Inbox and Outbox

Because accessing your email inbox across the internet is slow, WP Issues CRM creates a local image of your inbox on your WordPress server. It does so in two stages: First it synchronizes the list of the messages. Second it collects the details for each message — the second process is much slower, but it only needs to be done once and happens continuously as messages come in.  WP Issues CRM develops suggestions about issue and constituent mapping as it parses. The Inbox you see in WP Issues CRM is derived from the local image.   Every two minutes, your WP Issues CRM Inbox is synchronized to the underlying email inbox on your email server.

Conversion to 3.4 from Earlier Versions of WP Issues CRM

The upgrade from earlier versions to version 3.4 requires you to resave any standard reply templates you have developed manually.  There is a fundamental logic change in version 3.4.  In previous versions, reply templates belonged to subject lines.  Since many subject lines could correspond to a single issue, this created an artificial multiplication of templates.  In 3.4, reply templates are associated with issue/pro-con combinations.  For most users, this will be a healthy process of house cleaning — standardized replies need to be upgraded routinely anyway.

The upgrade also rebuilds the WP Issues CRM outgoing queue and if you do the upgrade while outgoing messages are pending in the outbox, those messages will be stranded, although not lost.

If you have a large set of standardized replies and need assistance converting or if you feel you may have stranded outgoing messages that you cannot easily reconstruct, we can help — send an email to help@wp-issues-crm.com.

Version 4.0  no longer supports use of |*first_name*|.  Use of first name and last name tokens creates too many risks of errors (nobody calls me Suzanne, my name is Sue) — much safer to just jump into the message, rather than start with a possibly incorrect salutation.

Technical Note on the Logic of Training and Grouping

You should generally be able to just go with the  flow of suggestions offered by WP Issues CRM.  However, for those interested in understanding how that flow is generated, here are some notes about the rules governing the process.

  • The inbox only groups messages if they look like messages that have previously been acted on — recorded or replied to — and Train was checked when the action was taken.
    • The subject line is binary identical to a previously trained message ( or matches a wildcard subject defined in Subjects ) AND
    • The content matches a previously trained message at the level required in Settings
      • The required percentage of sentences (by character count) match AND
      • The message is long enough
    • The subject line and content matches must agree as to what issue/pro-con combination they point to
    • The inbox will ungroup otherwise groupable messages if the sender addresses do not parse at the accuracy level required in settings
    • See code in WIC_Entity_Email_Inbox::load_inbox in wic-entity-email-inbox.php
  • The option to Train is offered at the time a message is recorded or replied to only if:
    • Issue has been assigned and a reply standard has been saved or loaded since the issue was assigned OR
    • You are only recording not replying — in this case, if there is no reply template, when you sweep, messages will be recorded, but not replied to OR
    • The count of messages in the current subject line is greater than one — in other words, the messages meet the requirements above for grouping (they had to have been previously trained)
    • See code in wpIssuesCRM.processEmail in email-process.js.
  • When Train is checked and a message is submitted to reply or record, the processor (WIC_Entity_Email_Process::handle_inbox_action_requests in wic-entity-email-process.php ) saves two mappings:
    • A single mapping of subject line (binary exact) to issue/pro-con combination (WIC_Entity_Email_Subject::save_new_subject_line_mapping in wic-entity-email-subject.php) — subject lines from future messages will be mapped using the most recently saved (matching) subject-line mapping to an issue/pro-con combination.
    • For each sentence in the message (excluding sentences recognized as addresses) a mapping of that sentence to the issue/pro-con combination (WIC_Entity_Email_MD5::create_md5_map_entries in wic-entity-email-md5.php).  Sentences in future messages will be individually compared to previously mapped sentences and the issue/pro-con combination getting the most sentence votes from the most recently mapped matches (weighted by sentence length) will be assigned (WIC_Entity_Email_MD5::get_issue_and_pro_con_map_from_md5 in wic-entity-email-md5.php).
    • As noted above under grouping, mappings are used only if the subject map agrees with the sentence map.
  • Only messages meeting the criteria above for grouping will be flagged as sweepable.  When you click the >> sweep button, all sweepable messages are sent to the server for processing:
    • They will be recorded to their last mapped issue/pro-con.  If they have been unmapped (by another instance someone else has open), they will be bypassed and still available for processing upon inbox refresh.
    • If there is no saved reply template for their last mapped issue pro-con, they will only recorded
    • If there is a saved reply template for their last mapped issue pro-con, that reply will be generated.
    • See code in WIC_Entity_Email_Process::handle_inbox_action_requests in wic-entity-email-process.php.
  • Some consequences of these rules are:
    • Messages are never grouped in the inbox until one of the matching group has been trained
    • Message grouping is conservative — this may mean a few more clicks in some cases, but minimizes risk of replying incorrectly.
    • When you make a quick reply to a message without saving or using a standard reply, you are not offered the option to train (and, in fact, are not required to confirm the action)
    • You can train messages without replying — this supports a work flow of accumulating messages for later reply.
    • If you train a message for sweeping with a reply, but later delete the reply from the Saved list, then sweeping will record matching without replying to them.

Using Forms with WP Issues CRM

With WP Issues CRM you can design your own custom front end forms using Contact Form 7 or Gravity Forms, and then feed the data directly into WP Issues CRM, giving you all the power of WP Issues CRM to organize the data and use it for communications.

Possible applications include:

  • New case intake
  • Event registration
  • Online fundraising (with a payment gateway like Stripe linked to your form).
  • New post creation for guest users combined with constituent interest tracking.

When you submit an interfaced form, WP Issues CRM will:

  1. Check if you have a matching constituent (based on the information the form includes).
  2. If no matching constituent, create a new constituent record.
  3. Optionally, update the matched constituent with form information.
  4. Add an activity record, logging the form submission or transaction and capturing additional data.
  5. Optionally, assign the constituent as a case to a particular staff member
  6. Optionally, create a new front facing post from the submission

The steps to setting this up are:

  1. Choose and install one of the form plugins.
  2. Build a form.
  3. Go to WP Issues CRM » Interfaces on the WordPress main admin menu.
  4. Create a new interface linking that form into WP Issues CRM.
  5. Map the fields occurring in the form to the standard WP Issues CRM fields and any custom fields you have created.

You can create as many interfaces as you would like using one or more form plugins.

Data Maintenance in WP Issues CRM

Many offices obtain lists of constituents from outside sources, for example voter, lists.  In the typical case, the office will record activities with only a fraction of the constituents in the database.  When an updated list becomes available, it may make sense to purge all constituents for whom one does not have any office-generated information.  The manage storage screen is designed to accommodate this kind of update cycle.  In addition, it supports the purging of staging files for uploads which are just duplicative once the upload has been verified.managestorage

Importing/Uploading Data in WP Issues CRM

WP Issues CRM provides a robust upload () facility:

  • It chunks processing tasks so as not to exceed memory or file size limits on smaller servers when handling large data sets.
  • It allows you to upload both activities and constituents simultaneously or separately.
  • It can create new issues for classifying activities as it goes.
  • It validates data transparently so that you can fix errors or bypass them.
  • It matches new constituent records with existing records using multiple possible match rules in a transparent way that you fully control.
  • It allows you to set defaults to complete partial incoming data (for example, for a list of signers of a petition, add them to the database and also create an activity record reflecting their signing of the petition).
  • In every instance it tells you clearly what the consequences of your taking the next upload step will be, and in most instances, it gives you the ability to roll-back any mistakes you make.
  • It offers a streamlined upload option to simplify the upload of clean new data.

It begins with the familiar operating system file selection dialog:uploadinit
It uploads the file in chunks showing a progress bar and then presents file parsing options — it handles most flavors of csv file:
uploadparse
Once the file has been parsed successfully, WP Issues CRM offers a friendly drag-and-drop interface for associating uploaded fields with existing database fields:
uploadmap
Once the user maps the data, the user can run validation. WP Issues CRM will apply validation rules appropriate to the fields as mapped:uploadvalidate
For much more on how WP Issues CRM validates incoming records, please see this post.

Continue to read: The next step in the Upload Process — Matching.

Basics

WP Issues CRM is built around three simple data constructs:  Constituents, Issues and Activities.

Constituents

Constituents are people (or institutions) and you can save basic information about them, including whatever custom information you might choose to define through custom fields.  WP Issues CRM stores constituents in custom tables within the WordPress database for fast retrieval.

saveconstituent

Issues

Issues can be used to represent anything that a constituent or constituent activity might have a relationship to.  An issue could be a public policy issue like “Charter Schools” and you could log incoming email as pertaining to that issue.  Or, an issue could be “the Town Club” and you could identify constituents as members.   Or an issue could be the 2016 Presidential Primary and you could record people as having voted in that election.  WP Issues CRM stores issues as WordPress posts.  WP Issues CRM stores the issue posts as private, but you can make them public or use any public post from your website as an issue.saveissue

Activities

Activities can be used to represent anything that a constituent might do or be with respect to an issue.  You can define whatever set of activity types you wish to.  You could have “Email”, “Letter”, and “Call” as activity types and use them to record incoming contacts from constituents and classify them by issue.  Or you could define activities like “Is a Member of” or “Voted in”.  saveactivity
The activity add form is available from within the issue and constituent forms.

Classifying and retrieving constituents and activities

WP Issues CRM offers multiple approaches to classifying and retrieving constituents and activities.

Most importantly, you have all the flexibility that WordPress offers to tag and categorize posts. The advanced search shown below would retrieve all constituents with a home address in Boston who had sent two or more emails about any issue classified under any sub-category under the environment category since January 1, 2016.advanced-search

Additionally, you can create custom fields for constituents, including drop down fields with option sets that you define. For example, you could add a “Party” field and classify voters by party.  (The party field is built-in in recent versions of WP Issues CRM).

fields

Finally, you can create custom activity types that fit the activity of your office. Activities could be relationships like “is a member of” or “subscribed to”.options