How I Built A Service Credit System For My Membership Site

LAST UPDATED April 6, 2021  |  0 Comments

YouTube video
David Risley
Founder, Lead Instructor of Blog Marketing Academy

Inside the LAB (my membership site), I have optional services that members can purchase. That includes technical services as well as coaching calls.

For both, I take a flexible credit-based approach. Members can purchase one or more credits. Those credits stay on their account. They can use those credits whenever they wish. And we now even have a debit log so they can see how those credits were spent.

I've had many people actually pay me to build a similar system on their membership site. But, in this post, I'm simply going to show you how it is done.

Truthfully, this isn't complicated. It is all done using "out of the box" tools and some simple automations.

Below, I'm going to show you how my system is built. Keep in mind, you still need some level of understanding of marketing automation tools to implement it. If you would like my help building this in your business, you can look into having me just build it for you.

So, let's dive in...

Tools I Use In This Setup

I've already covered all of the tools and plug-ins that I use in my membership site. For the credit system in particular, the relevant tools are:

I'll show you how these tools are used below.

Now, to be clear, you don't necessarily need to use these same tools. WP Fusion is quite important in this setup. But, you could just as easily use any CRM that enables rules and automations. You could use another shopping cart (like WooCommerce). And there are other ways to create custom fields.

Custom Fields For The Service Credit System

First up, I use Advanced Custom Fields to create the necessary custom fields.

I created a field group called "Member Credits". In that field group, I created the following custom fields:

  • Tech Service Credits. Text field to hold their balance of tech service credits.
  • Strategy Calls. Text field to hold their balance of call credits.
  • Call History. A repeater field, within which I have a field for date, amount debited, and a description.
  • Tech Credit Debits. A repeater field, within which I have a field for date, amount debited, and a description.

A repeater field is quite handy in that you can have rows of fields which... repeat. I use this to create a running log of debits from their account balance so they can see where credits were spent.

This field group is set up to show on the User screen and only for Administrators.

Now, when I enter one of the user profiles in WordPress, these fields look like this:

Using repeater fields for the debit logs just makes it simple. I probably could have gotten fancier with the tech setup of that, but since all I need is a simple display of debits on the front-end, a repeater field works just fine.

Syncing These Fields To My CRM

To make these fields usable within emails to members as well as to trigger automations, I need to synchronize these fields with Drip (my CRM).

This is where WP Fusion comes in. 🙂

I don't need to sync the debit logs to Drip. But, I do want to sync the balances. So, the first step is to create the necessary custom fields over in Drip.

In Drip, I created the following custom fields:

  • credits_strat_calls
  • credits_techservice

What you name them isn't really important. 

Now, with those fields created, you re-sync the fields with WP Fusion so they show up inside of WordPress.

Then, go to the contact Fields screen and match up the two fields from Advanced Custom Fields to the fields in the CRM. Like so...

Once that is saved, then there's a full two-way integration between WordPress and Drip for those fields. This means:

  • If I update those fields inside WordPress, it automatically updates the field in Drip. And...
  • If I update those fields in Drip, it automatically updates those fields back in WordPress.

OK, next up...

Selling Credits And Updating Balances

I use ThriveCart for my shopping cart. So, when somebody purchases service credits, they buy it with ThriveCart.

I also currently sell credits either as a single credit, 3 credit package, or 5 credit package.

These are set up as different pricing options for the product inside of ThriveCart. Then, when they purchase, it triggers the automation in Drip. Thrivecart uses Behavior Rules to tell Drip what to do depending on what they have purchased.

As an example, here's the behavior rule for when a person buys a single strategy call credit.

So, when they buy that option, it will add them to a Drip workflow called "Purchase Strategy Session (TC)". It will also simultaneously add the tag BUYCALL1. If they buy the 3-credit package, I add the tag BUYCALL3. And likewise, the 5-credit package uses BUYCALL5.

Those tags are used to tell Drip how many credits to add. To illustrate,  here's part of the workflow being triggered:

I'm not showing the entire workflow here for the sake of space. However it simply has 3 conditionals so that it acts differently depending on whether they just bought 1, 3 or 5 credits.

The first thing done is that I increment the custom field by the number of credits purchased. Now, with Drip, you have to use some geeky liquid templating to do this. It updates the custom field value by adding to whatever the pre-existing field value was. Here's the formula for adding 1 to the field:

{{ subscriber.credits_strat_calls | plus: 1 }}

I wish Drip made it simpler than using liquid templating. For instance, ActiveCampaign has a simple way to increment number fields so this would be even easier with ActiveCampaign. But, point is... it can be done with Drip and this is how. 🙂

In addition to updating the custom field, I record an event on their contact log, send them an email notifying them of their new credit balance, and then remove the trigger tag (i.e. "BUYCALL1") since I was only using that tag for internal processing and it doesn't needs to stay on their profile.

Keep in mind, WP Fusion automatically syncs this field back to WordPress. So, I only need to update it inside of Drip. Once the member does anything inside the LAB, it automatically synchronizes their credit balance to their member profile.

You could use this same method with almost any shopping cart. In fact, you could even update custom fields within WordPress instead of on the CRM side. For instance, if you were using WooCommerce, you could use something like Uncanny Automator to automatically change their credit balances based on purchase of a WooCommerce product.

Enabling Members To Use Their Credits

OK, at this point, you have credit balances on member profiles and you have a way to sell those credits. Now, let's look at the delivery side of things.

I use credits for coaching calls and service credits. When people book a call with me, they will book using Calendly so they work within my availability. When people request technical service, they start by filling out a simple form with what they wish to have done.

I only want those things showing up if they have credits on their account. For instance, they should only see my calendar if they have at least 1 call credit on their account. Otherwise, they'll see instructions for purchasing credits.

The key to doing this is, once again, WP Fusion. In this case, we're making heavy use of the WP Fusion shortcodes. Using these powerful shortcodes, I can show or hide things depending on their tags, custom field values, and more. In my case, I created my own shortcode since WPFusion didn't have this ability at the time I built this. Let me show you both methods below.

To demonstrate how this is built, let's just look at booking a call with me. The tech service request works the same way.

First, I have a page inside THE LAB that people will visit when they want to book a call. I personally built the content of that page using Thrive Architect. Let me show you part of it as it appears inside Thrive Architect:

As you can see, you can see shortcodes right in the editor. And you can see all the conditional content. Which text they see depends on whether they have credits or not... and whether they are a PRO member or a STARTER member of the LAB.

Right at the top of the page, I use the [wpf_update_meta] shortcode. This simply triggers WP Fusion to re-sync the custom fields. I want to make sure that every time a person visits this page, it is working on current information. So, I trigger a sync every time.

Next, you can see that I created my own shortcode called [callcredits]. The code behind this shortcode makes use of PHP functions for WP Fusion so that I can do conditionals. By using my own shortcode, it simplifies the syntax that I have to put into the page editor. Here's the PHP code behind that shortcode:

function bma_callcredits( $atts, $content = null, $tag = '' ) {
global $current_user;
$atts = array_change_key_case((array)$atts, CASE_LOWER);
$wporg_atts = shortcode_atts([
'status' => 0,
], $atts, $tag);
$status = intval($wporg_atts['status']);

// member has at least 1 call credit
if (!intval(get_field( "strategy_calls","user_".$current_user->ID )) and !$status) {
$content = do_shortcode($content);
return $content;
}
if (intval(get_field( "strategy_calls","user_".$current_user->ID )) and $status) {
$content = do_shortcode($content);
return $content;
}
return false;
}
add_shortcode('callcredits', 'bma_callcredits');

Basically, a status of 0 means they have no credits. A status of 1 means they have any positive credit balance.

Now, if you don't understand that code, be aware that since I originally built this setup, WP Fusion has been updated to include conditional shortcodes using custom meta fields. It didn't have that ability before which is why I needed to create my own code. If you were to do this now, you could use a shortcode like:

[user_meta_if field="strategy_calls" value="1" compare=">="] Content here if they have at least one credit [/user_meta_if]

That would definitely be simpler than making your own shortcode, but I present both options here. 🙂

The following code is also used on this page:

  • [wpf tag="Member - Active"]. This is used to show conditional content only if they are a LAB PRO member, for which I use a tag called "Member - Active".
  • [user_meta field="first_name"]. This shortcode will display meta fields on screen. In this case, it shows their first name so I can address them by name on the screen.
  • [user_meta field="strategy_calls"]. Another use of the same shortcode to show them their current balance of call credits.

Using the conditional fields, I also embed my Calendly calendar on screen if they have at least one call credit on their account. Also, if they have no credits, I give them a link to go buy some instead of seeing the calendar.

Now, later on once we have completed a scheduled call, I go into their profile and deduct a call credit manually as well as add an entry to their debit log to reflect the call in their history.

Drip and Calendly have an integration, so I can also automatically deduct a credit using an automation as soon as they schedule. But, since I want to also add an entry to their history, I simply do it manually after a call is completed. It is just part of my own internal business system.

Displaying A Debit Of Credit Debits

This is a more recent addition to the system, but I thought it was also important to show members where their credits were spent. Here's a simple look at the tech service history in one member's account:

For this, we make use of those custom repeater fields that were set up using Advanced Custom Fields. Only now, we need some front-end code to actually show that to members.

In my case, I created a shortcode called [callhistory] for showing the call history, and [techcreditdebits] for showing their tech service history. Here's the PHP code that powers the call history:

function bma_callhistory( $atts, $content = null ) {
global $current_user;
ob_start();
if( have_rows('strat_call_history', 'user_'.$current_user->ID) ):
echo "<table><tr><th>Date</th><th>Debit</th><th>Summary</th></tr>";
while ( have_rows('strat_call_history', 'user_'.$current_user->ID) ) : the_row(); ?>
<tr>
<td><?php the_sub_field('call_date'); ?></td>
<td><?php the_sub_field('credit_change'); ?></td>
<td><em><?php the_sub_field('call_description'); ?></em></td>
</tr>
<?php
endwhile;
echo "</table>";
else :
echo "There are not yet any strategy calls in your call history. <a href=\"/book-call/\">Click here to book one.</a>";
endif;
$output = ob_get_contents();
ob_end_clean();
return $output;
}
add_shortcode('callhistory', 'bma_callhistory');

This code makes use of the functions of Advanced Custom Fields to check that repeater field and loop through to show the entries.

Sending Customers Notice Of Updated Balances

Whenever a customer's balance is updated, we send them an automated notice letting them know. We do this using a simple automation inside of Drip.

Here's the workflow in Drip that sends an update whenever their strategy session credit balance is updated:

The automation is triggered whenever that custom field is updated.

If their last purchase event of a call credit was in the last day, we don't update them since they already know. 🙂 Otherwise...

It checks their balance. If their new balance is zero, it will send them an email letting them know they are now out of credits and may want to buy more. If their new balance is more than zero, we'll simply update them with how many credits they now have.

The automation is all within Drip. But, using WP Fusion, it is all automated. Even if I update their balance in WordPress, Drip will be triggered to send them the auto-update.

Reminding Members Of Credit Balances

Since members can buy more than one credit at a time, there are instances where they could have credits sitting there on their account and they forget all about it.

Now, we don't hunt them down over these things. 🙂 But, we also don't want to sit there and never say anything. So, I employ some more marketing automation to periodically email them a gentle update of their credit balances in case they want to use them.

The main automation workflow looks like this:

The workflow is automatically triggered if they are added to a particular segment or if I apply an internal tag called SENDBALANCEUPDATE. Then, if their balance is greater than zero on either service type I offer, it will send them a reminder email. It then removes that internal tag and that's it.

I then use another workflow to control the timing.

If the customer enters that segment or has an event added to their profile of "Sent Account Balance Reminder", it will start a 30 day countdown. In 30 days, it will apply that SENDBALANCEUPDATE tag, which in turn triggers the other automation to run and send the email.

By using these two workflows together, we've got an automated loop that will send them a balance reminder every 30 days, but only if they have a positive balance of either service type.

That customer segment is simply a list of all leads in my system which hold positive balances in either credit field. I use that segment to enter new customer into this recurring reminder loop. If they leave that segment, we also need to remove them from the recurring loop so they are not reminded of zero balances.

Wrap It Up!

If you're technically inclined and familiar with using automation tools, then you can see that this isn't exactly a complicated setup.

It is using tools "out of the box". Sure, there are a few custom shortcodes involved, but they are optional. Mostly, this is just using tools in the right combination to make the thing work.

It is quite the handy system. The cool thing is that a credit system like this can be used in other ways to bundle service credits in cool ways for members. For instance:

  • You could gamify the system with GamiPress and, once they reach a certain number of points, you could automatically add a service credit to their account.
  • You could make special offers to bundle service credits into a sale. Technically, it would be as simple as incrementing the custom field when they purchase your special offer.

You could even apply this credit approach to other types of services. I use it for coaching calls and service work, but it could be used for anything where credits are the preferred system.

This is pretty much the rundown of how I built the system in use in The LAB.

To be clear, there's still a little technical knowledge needed to implement this. Even while I'm pretty much showing the whole setup here, a newbie is going to have a tough time doing it. So...

If you would like my help implementing this in your business, you can pick up some technical service credits and we'll get in there and build it for you.

If you've got the tools to enable it, I estimate it would take about 2-3 service credits to build it for you. Your best bet would be to pick up a 3-credit package to get it done.

Keep in mind, you don't need to use the exact same tools I do. The methods will be mostly the same, but you can use other tools in most cases. If you're wondering if the tools you're using could be used, just get in touch and ask. I'll help you figure it out. 🙂


TOPICS


You may also like

How To Integrate ConvertBox With FluentCRM

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}
>