Jetpack CRM implementation

Jetpack CRM. The zero nonsense CRM for WordPress. Logo and screenshot of viewing a contact.

I recently migrated into Jetpack CRM free edition (no premium add-ons used). This is a great free plugin with significant premium add-on capabilities, supported by the same company as WordPress.com and WooCommerce.com

Here’s my experience with it so far:

I like how the admin menu offers regular main menu item mode versus individual main items and even a mode for CRM only use cases (front end site off). This is nice for usage on a production site versus a subdomain or intranet.

It has a nice core system for adding and editing contacts and companies and their respective contact info, statuses, and notes / logs of various methods. Those two seemed like obvious necessities. No problem, adding them was easy!

It supports custom fields, and custom statuses. I definitely had to create a URL field for company entries, plus a contact field (or tag) for their source / referrer.

I like the separation of contacts and companies for my situations where one agency refers multiple companies, or one company has multiple contacts. This is a great included module called B2B.

I also like the ability to direct email individual contacts via wp_mail, connected to my domain’s email service.

An area that remains a bit unclear is email marketing. I use Klaviyo with clients and developers, but I could use a way to bulk email prospects for status checks. It doesn’t seem to offer this. However, Jetpack non CRM does have a Follow Blog feature that sends new post notifications. That feature is limited to 100 users on the free plan.

One area I had to do considerable work on was using the free API module to import data. It imports contacts and companies, but the latter was not documented and I had to do code review to figure out how to do it. There remained no way to connect contacts to companies so I had to add a WPDB query to achieve that. See my import code.

Jetpack CRM data import code snippet

add_action( 'admin_notices', function() {

	// Settings
	$API_URL = site_url() . '/zbs_api/%s?api_key=%s&api_secret=%s';
	$API_Key = 'jpcrm_pk_#####PASTE#####';
	$API_Sec = 'jpcrm_sk_#####PASTE#####';

	// Input Data (CSV format, escape any single quotes!)
	// Cols: Date, Status, First, Last, Email, Tel, City, Country,
	// Cols: Custom: Source, Company, Company Tag 1, Company Tag 2
	// Date Format: YYYY-MM-DD
	$csv_data = '';

	// Loop Data
	global $wpdb;
	$data = explode( "\n", $csv_data );
	foreach( $data as $row ) {
		$row = str_getcsv( trim( $row ) );

		// Create Contact Record
		$args = [
			'assign' => '1',
			'status' => $row[1],
			'fname' => $row[2],
			'lname' => $row[3],
			'email' => $row[4],
			'worktel' => $row[5],
			'city' => $row[6],
			'country' => $row[7],
			'custom-field-source' => $row[8],
		];
		$response = wp_remote_post(
			sprintf(
				$API_URL, 'create_customer', $API_Key, $API_Sec
			),
			[ 'body' => json_encode( $args ) ]
		);
		$contact_response = json_decode(
			wp_remote_retrieve_body( $response )
		);

		// Halt On Error
		if( empty( $contact_response->id ) ) {
			echo 'ERROR - Contact ';
			print_r( $contact_response );
			return;
		}

		// Set Created Date
		$wpdb->update(
			$wpdb->prefix . 'zbs_contacts',
			[ 'zbsc_created' => strtotime( $row[0] ) ],
			[ 'zbsc_email' => $row[4] ]
		);

		// Maybe Create Company Record
		if( $row[9] ) {
			$args = [
				'assign' => '1',
				'name' => $row[9],
				'email' => $row[4],
				'tags' => [],
			];
			if( $row[10] ) {
				$args['tags'][] = $row[10];
			}
			if( $row[11] ) {
				$args['tags'][] = $row[11];
			}
			$response = wp_remote_post(
				sprintf(
					$API_URL, 'create_company', $API_Key, $API_Sec
				),
				[ 'body' => json_encode( $args ) ]
			);
			$company_response = json_decode(
				wp_remote_retrieve_body( $response )
			);

			// Halt On Error
			if( empty( $company_response->id ) ) {
				echo 'ERROR - Company';
				print_r( $company_response );
				return;
			}

			// Set Created Date
			$wpdb->update(
				$wpdb->prefix . 'zbs_companies',
				[ 'zbsco_created' => strtotime( $row[0] ) ],
				[ 'zbsco_email' => $row[4] ]
			);

			// Bind Contact With Company
			$args = [
				'zbs_site' => 1,
				'zbs_team' => 1,
				'zbs_owner' => -1,
				'zbsol_objtype_from' => 1,
				'zbsol_objtype_to' => 2,
				'zbsol_objid_from' => $contact_response->id,
				'zbsol_objid_to' => $company_response->id,
			];
			$wpdb->insert( $wpdb->prefix . 'zbs_object_links', $args );

		}

		// Admin Feedback
		echo $row[4] . ' ';

	} // Loop Data Ends

} );

Alternatively, there is a paid add-on that can import more advanced spreadsheets, but this developer prefers to lift the hood, naturally. Speaking of the hood, this CRM plugin was originally called No BS CRM. It uses its own DB tables for efficiency.

So I do recommend Jetpack CRM in general. Reply if you would like to do a free consultation to discuss your project. Thanks for reading.


Share this:

Note: I may receive compensation for referrals.

WP Engine - A smarter way to WordPress
The best email marketing tool, responsive templates, automations, Worldwide support, tracking and reports, Benchmark Email, free plan available
Sell everywhere. Use Shopify to sell in-store and online.
Klaviyo partner badge
Okendo Partner, certified
WooCommerce, the most customizable eCommerce platform for building your online business. Click to get started.
Jetpack, a stronger, customizable site without sacrificing safety. Click to get started.