Proven Digital Marketing

SMS Marketing Suite with CRM Integration Using Twilio and Keap

Keap is a SaaS CRM, sales, and marketing automation platform that also offers text message marketing. However, it costs over twice as much as using Twilio, the leading API-based cloud communication platform. To keep messaging costs low, I wrote a WordPress plugin to integrate Keap and Twilio.

The primary feature within this plugin is a WordPress admin page for sending an SMS message to a group of Keap contacts. The recipients are determined by chosen Keap tags via a multi-select combobox within the “SMS Blast” form. Below that, there is a text area field to compose the SMS message. Keap contact field variables can be included in the message template with an optional fallback value like %%Contact.FirstName%% or %%Contact.City|your area%%.

Since the goal of this WordPress plugin is to keep marketing costs low, data validation and confirmation are essential. After submitting the SMS Blast form, the system processes and stores the data for review. The review screen shows Keap contacts vs. planned Twilio messages followed by potential alerts of discrepancies. This may include the number of duplicate phone numbers, contacts missing required template variables, and contacts not opted in to receive text messages. Lastly, the review screen offers buttons for sending to a test group and final submission.

This plugin also includes various custom WordPress REST API endpoints to further integrate Twilio and Keap. Some endpoints create, tag, and update Keap contacts while others send texts and trigger flows via Twilio. Within Keap campaigns and Twilio Studio flows, these WordPress endpoints facilitate more engaging and personalized customer experiences.

The Holistic Psychologist

ActiveCampaign Contact Record Cleanup with Bulk Deletion Plugin

After running a successful online business for some time, stale contact records eventually pile up. This means costs consistently increase when using a CRM with volume-based pricing, such as ActiveCampaign. However, there is no quick way to purge these cold contacts within ActiveCampaign!

To help businesses reduce their CRM costs and clean up their records, I created a WordPress plugin. It registers a new WordPress admin page with a quick, multi-step process. Since it is quick to tag contacts within ActiveCampaign in bulk, I decided to mark contacts for deletion with a tag. Then the business can apply the “Marked for Deletion” tag to all ActiveCampaign contact records that they’d like to delete.

In the WordPress admin page, the user first clicks a button to start the process. API requests to ActiveCampaign then retrieve all contact records with the “Marked for Deletion” tag. The WordPress admin page then displays the number of contact records, asking the user to confirm the bulk deletion process. Once confirmed, all contact records are then deleted from ActiveCampaign. Since this process can take a while depending on the number of contacts, I used benchmark tests to also show the WordPress user an estimated end time.

Purple Turtle Creative

Custom WordPress Plugin API to Fulfill Downloads and Remote Updates

After developing Completionist, I wanted to make it available for free download. Instead of listing it in the WordPress.org plugins directory as I had done with Grouped Content, I wanted to create my own resources server API.

To implement the client-side connection, I used YahnisElsts’s plugin-update-checker package on GitHub. This gave me a fantastic starting place to understand what API endpoints I needed to create.

I packaged the resources server code into a WordPress plugin which runs on Purple Turtle Creative. It includes custom WordPress REST API endpoints to dynamically deliver the plugin’s details from the requested release’s ZIP file.

The endpoints are secured with nonces to ensure the download link expires. Direct requests for the plugin ZIP file are also denied via NGINX rules, so the release package can only be downloaded via a valid request to the resources API. Lastly, I implemented Google Analytics’ Measurement Protocol API to monitor the API’s traffic and performance.

Purple Turtle Creative

Asana Integration WordPress Plugin: Completionist

I wanted to track Asana assignments related to my WordPress website as I worked on it. To my amazement, a specialized solution had not been built yet, despite an obvious need in the market.

Ever since then, I have worked on my own solution to integrate Asana tasks with WordPress. Completionist is a WordPress plugin that I offer for free download which features a dashboard widget, post edit panel (aka “metabox”), and custom automations.

Despite being a pretty small project thus far with minimal efforts to make its presence known, Completionist has received some notable attention:

COS Brews

Video Upload Optimizations via Mux API on BuddyBoss Theme

Poor video performance often leads BuddyBoss site owners to use third-party video embeds via YouTube or Vimeo. However, this requires the user to upload and host their videos from another platform—a platform they do not own nor have control over. This is an unacceptable solution for site visitor-uploaded content, which occurs directly on the business’s BuddyBoss WordPress website.

Using the Mux API, I was able to bring video optimizations to WordPress, including normalized audio tracks. I developed a custom WordPress plugin that uploads new videos to Mux and caches the Mux asset data to the site. To ensure the cached asset data is always current, I implemented a custom REST endpoint to process Mux webhook events. The endpoint is secured by verifying each request’s signature.

To achieve a seamless frontend experience, I implemented JavaScript that collects video source URLs that are not hosted via Mux. The video posters are replaced with a “Processing Video” loader gif image while the JavaScript continuously checks each Mux asset’s status. Once the static renditions are ready, the JavaScript sets the video source to the Mux playback URL and removes the “processing” poster.

Hearst Newspapers

Google Sheets-Powered Custom Post Type Plugin with Mailchimp and Other Integrations

Upon joining the Local Commerce team at Hearst, I was asked to overhaul our map article custom post type. Each map article post features a custom Google Maps instance with scroll event interactions and animations.

To streamline the curation team’s efforts, I implemented the ability to import their collected merchant listing data from Google Sheets. The data is stored as metadata for each map article post, effectively caching the data in WordPress and serving as the posts’ main content.

With our team’s designer, I then updated the frontend styles and functionality to improve the map articles’ sales appeal. Additional features were implemented to make sponsored listings stand out from the regular listings. In particular, I custom-coded asynchronous email signup form modals which submitted to the Mailchimp and Sailthru APIs. To ensure proper security, I also implemented custom WordPress REST API endpoints to proxy the form submission requests to the third-party APIs. My custom implementation of the Google ReCaptcha v3 API also validated the form submissions to reduce spam signups.

Client Work

Facebook Messenger Bot to Register WordPress Users via ManyChat API

A client of mine had a grand vision for their Black Friday marketing initiatives. They were having a lot of success with Facebook Messenger and used ManyChat to automate conversation flows. For Black Friday, they wanted to give their Facebook contacts an easy way to join their WordPress website.

With their marketing team, I configured a ManyChat flow with Dynamic Blocks to process API requests to their WordPress website. The flow collected various information from the user and then sent a request to a custom WordPress REST API endpoint that I developed. Depending on the information provided, the custom endpoint would register the user in WordPress, tag the user in Keap, reward Gamipress points, and then respond with a success message containing their generated password and a sign-in link.