{"id":322121,"date":"2026-06-16T16:42:18","date_gmt":"2026-06-16T16:42:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/integration-for-constant-contact-and-memberpress\/"},"modified":"2026-06-16T16:41:54","modified_gmt":"2026-06-16T16:41:54","slug":"listbridge-sync-for-constant-contact-memberpress","status":"publish","type":"plugin","link":"https:\/\/mr.wordpress.org\/plugins\/listbridge-sync-for-constant-contact-memberpress\/","author":16347519,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"ListBridge Sync for Constant Contact and MemberPress","header_author":"Hitesh Gandhi","header_description":"Integrates MemberPress membership events with Constant Contact contact lists via the v3 API. It helps to automate your email marketing by syncing your MemberPress members with Constant Contact lists based on their membership status.","assets_banners_color":"fdecce","last_updated":"2026-06-16 16:41:54","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/paypal.me\/h1994tesh","header_plugin_uri":"https:\/\/www.wpexpertplugins.com\/documents\/constant-contact-integration-memberpress","header_author_uri":"https:\/\/www.wpexpertplugins.com\/contact-us\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":48,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"gandhihitesh9","date":"2026-06-16 16:41:54"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3569202,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3569202,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3569202,"resolution":"1","location":"assets","locale":"","width":1440,"height":773},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3569202,"resolution":"10","location":"assets","locale":"","width":1440,"height":773},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3569202,"resolution":"2","location":"assets","locale":"","width":1440,"height":773},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3569202,"resolution":"3","location":"assets","locale":"","width":1440,"height":773},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3569202,"resolution":"4","location":"assets","locale":"","width":1440,"height":773},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3569202,"resolution":"5","location":"assets","locale":"","width":1440,"height":773},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3569202,"resolution":"6","location":"assets","locale":"","width":1440,"height":773},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3569202,"resolution":"7","location":"assets","locale":"","width":1440,"height":773},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3569202,"resolution":"8","location":"assets","locale":"","width":1440,"height":773},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3569202,"resolution":"9","location":"assets","locale":"","width":1440,"height":773}},"screenshots":{"1":"Initial Screen.","2":"Application setup from constant contact developer portal.","3":"Application created successfully.","4":"Application edited &amp; client id shown there.","5":"Generate Application secret.","6":"Update redirect URI.","7":"Asking for permission.","8":"Connection successfully.","9":"Contact List mapping with MemberPress Membership.","10":"Member successfully added after purchasing membership plan."}},"plugin_section":[],"plugin_tags":[997,264,597,15170,1932],"plugin_category":[58],"plugin_contributors":[178787],"plugin_business_model":[],"class_list":["post-322121","plugin","type-plugin","status-publish","hentry","plugin_tags-constant-contact","plugin_tags-email-marketing","plugin_tags-integration","plugin_tags-memberpress","plugin_tags-membership","plugin_category-user-management","plugin_contributors-gandhihitesh9","plugin_committers-gandhihitesh9"],"banners":{"banner":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/banner-772x250.png?rev=3569202","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/icon-256x256.png?rev=3569202","icon_2x":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/icon-256x256.png?rev=3569202","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/screenshot-1.png?rev=3569202","caption":"Initial Screen."},{"src":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/screenshot-2.png?rev=3569202","caption":"Application setup from constant contact developer portal."},{"src":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/screenshot-3.png?rev=3569202","caption":"Application created successfully."},{"src":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/screenshot-4.png?rev=3569202","caption":"Application edited &amp; client id shown there."},{"src":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/screenshot-5.png?rev=3569202","caption":"Generate Application secret."},{"src":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/screenshot-6.png?rev=3569202","caption":"Update redirect URI."},{"src":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/screenshot-7.png?rev=3569202","caption":"Asking for permission."},{"src":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/screenshot-8.png?rev=3569202","caption":"Connection successfully."},{"src":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/screenshot-9.png?rev=3569202","caption":"Contact List mapping with MemberPress Membership."},{"src":"https:\/\/ps.w.org\/listbridge-sync-for-constant-contact-memberpress\/assets\/screenshot-10.png?rev=3569202","caption":"Member successfully added after purchasing membership plan."}],"raw_content":"<!--section=description-->\n<p>ListBridge Sync for Constant Contact and MemberPress connects MemberPress membership events to your Constant Contact account so subscribers move between contact lists based on their membership state \u2014 without exporting CSVs or running manual syncs.<\/p>\n\n<p>This is an independent integration. \"Constant Contact\" is a trademark of Constant Contact, Inc. and \"MemberPress\" is a trademark of Caseproof, LLC. This plugin is not affiliated with, endorsed by, or sponsored by either company.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>OAuth2 Authorization Code flow<\/strong><\/li>\n<li><strong>Three event slots<\/strong>, each mapped to a Constant Contact list of your choice:\n\n<ul>\n<li><em>New Member Signup<\/em> \u2014 added when a member registers and pays for the first time.<\/li>\n<li><em>Membership Expired<\/em> \u2014 added when a membership expires or a subscription is cancelled.<\/li>\n<li><em>Reactivated \/ Renewed<\/em> \u2014 added when an expired membership is renewed or a cancelled subscription is reactivated.<\/li>\n<\/ul><\/li>\n<li><strong>Cron<\/strong> at Midnight (site timezone) catches any expired members the real-time hooks may have missed \u2014 for example, if your site was offline when MemberPress fired the event.<\/li>\n<li><strong>Admin-triggered status changes<\/strong> (Transactions list, Edit Transaction screen, bulk status updates) are detected and synced.<\/li>\n<li><strong>Automatic access-token refresh<\/strong> before every API call \u2014 you never hit a 401.<\/li>\n<li><strong>Translation-ready<\/strong> with a <code>.pot<\/code> file in <code>\/languages<\/code>.<\/li>\n<\/ul>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 5.8 or later<\/li>\n<li>PHP 7.4 or later<\/li>\n<li>PHP OpenSSL extension (the plugin will refuse to activate without it)<\/li>\n<li>MemberPress 1.12.14 or later<\/li>\n<li>A Constant Contact developer account \u2014 create one for free at https:\/\/developer.constantcontact.com<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on the Constant Contact service to synchronise your MemberPress members with your Constant Contact account. No data is transmitted until a site administrator saves valid OAuth2 credentials on the plugin's settings page <strong>and<\/strong> completes the OAuth2 connection flow.<\/p>\n\n<p><strong>Service used<\/strong><\/p>\n\n<ul>\n<li>Constant Contact (operated by Constant Contact, Inc.)<\/li>\n<li>OAuth2 authorisation endpoint: <code>https:\/\/authz.constantcontact.com\/oauth2\/default\/v1<\/code><\/li>\n<li>API endpoint: <code>https:\/\/api.cc.email\/v3<\/code><\/li>\n<\/ul>\n\n<p><strong>What data is sent, and when<\/strong><\/p>\n\n<ul>\n<li><strong>During OAuth2 connect \/ token refresh<\/strong> \u2014 your Constant Contact Client ID and Client Secret are sent to the Constant Contact authorisation endpoint to obtain or refresh an access token. This happens when an administrator clicks \"Connect to Constant Contact\" and automatically before any API call whose access token has expired.<\/li>\n<li><strong>When a MemberPress member signs up<\/strong> (<code>mepr-signup<\/code>) \u2014 the member's email address, first name, and last name are sent to Constant Contact so the contact can be added to the list mapped to the \"New Member Signup\" slot.<\/li>\n<li><strong>When a membership expires or a subscription is cancelled<\/strong> (<code>mepr-event<\/code>, <code>mepr-expire-membership<\/code>, <code>mepr-subscription-pre-cancel<\/code>, <code>mepr_txn_store<\/code>, <code>mepr-transaction-saved<\/code>, <code>mepr_txn_transition_status<\/code>) \u2014 the member's email, first name, and last name are sent so the contact can be moved to the list mapped to the \"Membership Expired\" slot.<\/li>\n<li><strong>When an expired membership is renewed or reactivated<\/strong> (<code>mepr-transaction-completed<\/code>, <code>mepr-event<\/code>) \u2014 the member's email, first name, and last name are sent so the contact can be moved to the list mapped to the \"Reactivated \/ Renewed\" slot.<\/li>\n<li><strong>Nightly cron at 12:05 AM in the site's timezone<\/strong> \u2014 the plugin queries MemberPress for transactions that expired in the last 48 hours and, for any that have not yet been migrated, sends the same fields (email, first name, last name) so Constant Contact stays in sync if a real-time hook was missed (for example, the site was offline).<\/li>\n<li><strong>When loading the settings page (administrators only)<\/strong> \u2014 the plugin requests the list of contact lists in your Constant Contact account so they can be shown in the mapping dropdowns. No member data is sent in this call. The response is cached for 30 minutes.<\/li>\n<\/ul>\n\n<p>The plugin does <strong>not<\/strong> transmit any data to any other third-party service.<\/p>\n\n<p><strong>Terms and privacy<\/strong><\/p>\n\n<p>By connecting your site to Constant Contact you agree to Constant Contact's policies:<\/p>\n\n<ul>\n<li>Constant Contact Terms of Service: <a href=\"https:\/\/www.constantcontact.com\/legal\/terms\">https:\/\/www.constantcontact.com\/legal\/terms<\/a><\/li>\n<li>Constant Contact Privacy Notice: <a href=\"https:\/\/www.constantcontact.com\/legal\/privacy-notice\">https:\/\/www.constantcontact.com\/legal\/privacy-notice<\/a><\/li>\n<li>Constant Contact Developer Portal terms: <a href=\"https:\/\/developer.constantcontact.com\">https:\/\/developer.constantcontact.com<\/a><\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Activate the plugin from <strong>Plugins \u2192 Installed Plugins<\/strong>.<\/li>\n<li>Navigate to <strong>MemberPress \u2192 Constant Contact<\/strong> in the WordPress admin.<\/li>\n<\/ol>\n\n<h4>Setup<\/h4>\n\n<p><strong>Step 1 \u2014 Create a Constant Contact application<\/strong><\/p>\n\n<ol>\n<li>Go to https:\/\/developer.constantcontact.com and sign in (or create a free developer account).<\/li>\n<li>Under <strong>My Applications<\/strong>, click <strong>New Application<\/strong>.<\/li>\n<li>Give it a name (for example \"My WordPress Site\") and click <strong>Save<\/strong>.<\/li>\n<li>Copy the <strong>API Key (Client ID)<\/strong>.<\/li>\n<li>Click <strong>Generate Client Secret<\/strong> and copy the secret \u2014 it is only shown once.<\/li>\n<li>Add a <strong>Redirect URI<\/strong>: copy the exact value shown on the plugin's settings page (for example <code>https:\/\/yoursite.com\/wp-admin\/admin-post.php?action=mp_cc_oauth_callback<\/code>).<\/li>\n<\/ol>\n\n<p><strong>Step 2 \u2014 Save credentials<\/strong><\/p>\n\n<ol>\n<li>Paste the Client ID and Client Secret into the plugin's settings page.<\/li>\n<li>Click <strong>Save Credentials<\/strong>.<\/li>\n<\/ol>\n\n<p><strong>Step 3 \u2014 Authorise access<\/strong><\/p>\n\n<ol>\n<li>Click <strong>Connect to Constant Contact<\/strong>.<\/li>\n<li>Log in to Constant Contact and grant access.<\/li>\n<li>You will be redirected back to the settings page with a \"Connected\" confirmation.<\/li>\n<\/ol>\n\n<p><strong>Step 4 \u2014 Map contact lists<\/strong><\/p>\n\n<ol>\n<li>Three dropdowns appear once you are connected.<\/li>\n<li>Pick a Constant Contact list for each event slot.<\/li>\n<li>Click <strong>Save List Mappings<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20paid%20constant%20contact%20developer%20account%3F\"><h3>Do I need a paid Constant Contact developer account?<\/h3><\/dt>\n<dd><p>No. The free developer tier is enough to create the application that holds your Client ID and Client Secret. A paid Constant Contact subscription is only required to actually send marketing emails to the lists you sync to.<\/p><\/dd>\n<dt id=\"where%20are%20my%20credentials%20stored%3F\"><h3>Where are my credentials stored?<\/h3><\/dt>\n<dd><p>Inside the standard WordPress <code>options<\/code> table, encrypted with AES-256-CBC. The encryption key is derived from your site's <code>AUTH_KEY<\/code>, so a database leak alone is not enough to recover the credentials.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20an%20access%20token%20expires%3F\"><h3>What happens when an access token expires?<\/h3><\/dt>\n<dd><p>The plugin stores the <code>expires_at<\/code> timestamp and refreshes the access token automatically (using the saved refresh token) before every API call.<\/p><\/dd>\n<dt id=\"what%20if%20my%20site%20is%20offline%20when%20a%20membership%20expires%3F\"><h3>What if my site is offline when a membership expires?<\/h3><\/dt>\n<dd><p>A nightly cron job runs at 12:05 AM in your site's timezone and looks back 48 hours for any expired transactions whose contact has not yet been migrated to the expired list. Members caught by the safety net are processed exactly once.<\/p><\/dd>\n<dt id=\"can%20i%20sync%20constant%20contact%20custom%20fields%3F\"><h3>Can I sync Constant Contact custom fields?<\/h3><\/dt>\n<dd><p>No. Currently this functionality not available. We will add in our road map if many users will ask for that.<\/p><\/dd>\n<dt id=\"does%20deleting%20the%20plugin%20clean%20up%20my%20database%3F\"><h3>Does deleting the plugin clean up my database?<\/h3><\/dt>\n<dd><p>Yes. <code>uninstall.php<\/code> removes every option and transient the plugin created when you delete it via <strong>Plugins \u2192 Delete<\/strong> (not just deactivate).<\/p><\/dd>\n<dt id=\"which%20memberpress%20events%20trigger%20a%20sync%3F\"><h3>Which MemberPress events trigger a sync?<\/h3><\/dt>\n<dd><ul>\n<li><code>mepr-signup<\/code> \u2014 new member completes signup<\/li>\n<li><code>mepr-event<\/code> \u2014 generic event bus (expired, renewed, cancelled)<\/li>\n<li><code>mepr-transaction-completed<\/code> \u2014 renewal transaction<\/li>\n<li><code>mepr-subscription-pre-cancel<\/code> \u2014 subscription cancelled<\/li>\n<li><code>mepr-expire-membership<\/code> \u2014 natural membership expiry<\/li>\n<li><code>mepr_txn_store<\/code>, <code>mepr-transaction-saved<\/code>, <code>mepr_txn_transition_status<\/code> \u2014 admin-triggered status changes<\/li>\n<\/ul><\/dd>\n<dt id=\"why%20does%20the%20plugin%20require%20the%20openssl%20extension%3F\"><h3>Why does the plugin require the OpenSSL extension?<\/h3><\/dt>\n<dd><p>So that we can store your Constant Contact credentials encrypted at rest with AES-256-CBC. OpenSSL ships with PHP by default; if your host has disabled it, please ask them to enable it before activating the plugin.<\/p><\/dd>\n<dt id=\"how%20do%20i%20enable%20the%20debug%20log%3F\"><h3>How do I enable the debug log?<\/h3><\/dt>\n<dd><p>On the settings page, open the <strong>Debug Settings<\/strong> card and tick <strong>Enable debug log<\/strong>. Logs are written to <code>wp-content\/uploads\/mp-cc-logs\/mp-cc-YYYY-MM-DD.log<\/code> and protected from direct web access by an <code>index.php<\/code> and an <code>.htaccess<\/code> file.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0 \u2014 2026-06-05<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>OAuth2 Authorization Code flow with automatic token refresh.<\/li>\n<li>Three event slots: New Member Signup, Membership Expired, Reactivated \/ Renewed.<\/li>\n<li>cron at Midnight (site timezone).<\/li>\n<li>OpenSSL is a hard requirement.<\/li>\n<li>Translation-ready.<\/li>\n<\/ul>","raw_excerpt":"Sync MemberPress members to Constant Contact lists on signup, renewal, or expiry via the OAuth2-secured Constant Contact v3 API.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/322121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=322121"}],"author":[{"embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/gandhihitesh9"}],"wp:attachment":[{"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=322121"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=322121"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=322121"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=322121"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=322121"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mr.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=322121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}