{"id":12139,"date":"2023-10-30T22:27:56","date_gmt":"2023-10-31T05:27:56","guid":{"rendered":"https:\/\/codedcommerce.com\/?p=12139"},"modified":"2025-05-29T08:39:33","modified_gmt":"2025-05-29T15:39:33","slug":"jetpack-crm","status":"publish","type":"post","link":"https:\/\/codedcommerce.com\/jetpack-crm\/","title":{"rendered":"Jetpack CRM implementation"},"content":{"rendered":"\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Jetpack CRM Implementation and data migration\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/S90K3y8iSzE?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">I recently migrated into <strong>Jetpack CRM free edition<\/strong> (no <a rel=\"noreferrer noopener\" href=\"https:\/\/jetpackcrm.com\/extensions\/?aff=5031\" data-type=\"link\" data-id=\"https:\/\/jetpackcrm.com\/extensions\/?aff=5031\" target=\"_blank\">premium add-ons<\/a> used). This is a great free plugin with significant premium add-on capabilities, supported by the same company as WordPress.com and WooCommerce.com<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Here\u2019s my experience with it so far:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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 <strong>B2B<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I also like the ability to direct email individual contacts via wp_mail, connected to my domain\u2019s email service.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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&#8217;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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One area I had to do considerable work on was using the <strong>free API module<\/strong> 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.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jetpack CRM data import code snippet<\/h2>\n\n\n\n<pre class=\"wp-block-code language-php\"><code>add_action( 'admin_notices', function() {\n\n\t\/\/ Settings\n\t$API_URL = site_url() . '\/zbs_api\/%s?api_key=%s&amp;api_secret=%s';\n\t$API_Key = 'jpcrm_pk_#####PASTE#####';\n\t$API_Sec = 'jpcrm_sk_#####PASTE#####';\n\n\t\/\/ Input Data (CSV format, escape any single quotes!)\n\t\/\/ Cols: Date, Status, First, Last, Email, Tel, City, Country,\n\t\/\/ Cols: Custom: Source, Company, Company Tag 1, Company Tag 2\n\t\/\/ Date Format: YYYY-MM-DD\n\t$csv_data = '';\n\n\t\/\/ Loop Data\n\tglobal $wpdb;\n\t$data = explode( \"\\n\", $csv_data );\n\tforeach( $data as $row ) {\n\t\t$row = str_getcsv( trim( $row ) );\n\n\t\t\/\/ Create Contact Record\n\t\t$args = &#91;\n\t\t\t'assign' =&gt; '1',\n\t\t\t'status' =&gt; $row&#91;1],\n\t\t\t'fname' =&gt; $row&#91;2],\n\t\t\t'lname' =&gt; $row&#91;3],\n\t\t\t'email' =&gt; $row&#91;4],\n\t\t\t'worktel' =&gt; $row&#91;5],\n\t\t\t'city' =&gt; $row&#91;6],\n\t\t\t'country' =&gt; $row&#91;7],\n\t\t\t'custom-field-source' =&gt; $row&#91;8],\n\t\t];\n\t\t$response = wp_remote_post(\n\t\t\tsprintf(\n\t\t\t\t$API_URL, 'create_customer', $API_Key, $API_Sec\n\t\t\t),\n\t\t\t&#91; 'body' =&gt; json_encode( $args ) ]\n\t\t);\n\t\t$contact_response = json_decode(\n\t\t\twp_remote_retrieve_body( $response )\n\t\t);\n\n\t\t\/\/ Halt On Error\n\t\tif( empty( $contact_response-&gt;id ) ) {\n\t\t\techo 'ERROR - Contact ';\n\t\t\tprint_r( $contact_response );\n\t\t\treturn;\n\t\t}\n\n\t\t\/\/ Set Created Date\n\t\t$wpdb-&gt;update(\n\t\t\t$wpdb-&gt;prefix . 'zbs_contacts',\n\t\t\t&#91; 'zbsc_created' =&gt; strtotime( $row&#91;0] ) ],\n\t\t\t&#91; 'zbsc_email' =&gt; $row&#91;4] ]\n\t\t);\n\n\t\t\/\/ Maybe Create Company Record\n\t\tif( $row&#91;9] ) {\n\t\t\t$args = &#91;\n\t\t\t\t'assign' =&gt; '1',\n\t\t\t\t'name' =&gt; $row&#91;9],\n\t\t\t\t'email' =&gt; $row&#91;4],\n\t\t\t\t'tags' =&gt; &#91;],\n\t\t\t];\n\t\t\tif( $row&#91;10] ) {\n\t\t\t\t$args&#91;'tags']&#91;] = $row&#91;10];\n\t\t\t}\n\t\t\tif( $row&#91;11] ) {\n\t\t\t\t$args&#91;'tags']&#91;] = $row&#91;11];\n\t\t\t}\n\t\t\t$response = wp_remote_post(\n\t\t\t\tsprintf(\n\t\t\t\t\t$API_URL, 'create_company', $API_Key, $API_Sec\n\t\t\t\t),\n\t\t\t\t&#91; 'body' =&gt; json_encode( $args ) ]\n\t\t\t);\n\t\t\t$company_response = json_decode(\n\t\t\t\twp_remote_retrieve_body( $response )\n\t\t\t);\n\n\t\t\t\/\/ Halt On Error\n\t\t\tif( empty( $company_response-&gt;id ) ) {\n\t\t\t\techo 'ERROR - Company';\n\t\t\t\tprint_r( $company_response );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t\/\/ Set Created Date\n\t\t\t$wpdb-&gt;update(\n\t\t\t\t$wpdb-&gt;prefix . 'zbs_companies',\n\t\t\t\t&#91; 'zbsco_created' =&gt; strtotime( $row&#91;0] ) ],\n\t\t\t\t&#91; 'zbsco_email' =&gt; $row&#91;4] ]\n\t\t\t);\n\n\t\t\t\/\/ Bind Contact With Company\n\t\t\t$args = &#91;\n\t\t\t\t'zbs_site' =&gt; 1,\n\t\t\t\t'zbs_team' =&gt; 1,\n\t\t\t\t'zbs_owner' =&gt; -1,\n\t\t\t\t'zbsol_objtype_from' =&gt; 1,\n\t\t\t\t'zbsol_objtype_to' =&gt; 2,\n\t\t\t\t'zbsol_objid_from' =&gt; $contact_response-&gt;id,\n\t\t\t\t'zbsol_objid_to' =&gt; $company_response-&gt;id,\n\t\t\t];\n\t\t\t$wpdb-&gt;insert( $wpdb-&gt;prefix . 'zbs_object_links', $args );\n\n\t\t}\n\n\t\t\/\/ Admin Feedback\n\t\techo $row&#91;4] . ' ';\n\n\t} \/\/ Loop Data Ends\n\n} );<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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\u2019s my experience with it so far: I like how the admin menu offers regular main menu item mode versus individual main items [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":12154,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[52047,635717813,635718626],"tags":[],"class_list":["post-12139","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-video","category-wordpress-guides"],"jetpack_featured_media_url":"https:\/\/codedcommerce.com\/wp-content\/uploads\/2023\/10\/jetpack-crm.png","_links":{"self":[{"href":"https:\/\/codedcommerce.com\/wp-json\/wp\/v2\/posts\/12139","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/codedcommerce.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/codedcommerce.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/codedcommerce.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/codedcommerce.com\/wp-json\/wp\/v2\/comments?post=12139"}],"version-history":[{"count":0,"href":"https:\/\/codedcommerce.com\/wp-json\/wp\/v2\/posts\/12139\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/codedcommerce.com\/wp-json\/wp\/v2\/media\/12154"}],"wp:attachment":[{"href":"https:\/\/codedcommerce.com\/wp-json\/wp\/v2\/media?parent=12139"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/codedcommerce.com\/wp-json\/wp\/v2\/categories?post=12139"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/codedcommerce.com\/wp-json\/wp\/v2\/tags?post=12139"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}