Membership & Loyalty

If you are running a membership business, delivering a member-get-member program for your loyalty program, or if you simply require an account to shop and purchase, we recommend this guide. The flow that we support here allows for distinct signup and purchase events, including rewarding on either.

Overview

This guide will walk you through the five necessary steps for setting up a successful referral program:

  1. Brand your Program
  2. Tag your Website
  3. Reward your Customers
  4. Design your Experience (done by your creative team)
  5. Add to your Mobile App
Membership Referral Steps

Membership Referral Steps

Brand your Program

Create a CNAME for your Domain

📘

Task Duration

This task will typically take an IT/Ops engineering team 10–15 minutes to complete.

You'll want to create a CNAME for your domain so that you can create branded Promotion Links and Share Links.

To set up your CNAME, please complete the steps outlined in Extole DNS Requirements.

Send from Your Branded Email

The referral program will send program emails from you to your customers:

  • Welcome Email
  • Advocate Stats Email
  • Earned Reward Email

The from address for this will typically be something similar to [email protected]. Once this email has been identified, Extole can check if it is configured to allow Extole to send emails from this address.

For details on how to update your SPF DNS records and install Extole DKIM keys, please reference Extole DNS Requirements.

📘

Related Content

Tag your Website

Extole works with your site using lightweight JavaScript tags. The core tag must be included on every page of your site and contains Extole's JavaScript Library.

Extole tags can go anywhere in the HTML of the page and do not need to be loaded in any specific order. They are asynchronous to ensure fast page loading.

Marketing tags display CTA s inline on your page. These tags will reference a specific span tag by id and should be placed into the HTML inline where they will be displayed.

Add the Core Tag (Extole's JavaScript Library)

Extole's JavaScript library must be placed on all of your pages using the core tag. This tag is used to activate the Extole system and ensures that any other Extole tags on your page work properly.

The core tag can be found under your program’s branded domain (refer.brand.com). If you haven't set up your branded domain yet, you can load the tag from the Extole unbranded domain.

Find your active referral domain and use that for your core tag. It will look like brand.extole.io (unbranded) or refer.brand.com (branded).

<!-- BRANDED -->
<script type="text/javascript" src="https://refer.brand.com/core.js" fetchpriority="high" async></script>

<!-- UNBRANDED -->
<script type="text/javascript" src="https://brand.extole.io/core.js" fetchpriority="high" async></script>

Add Marketing Tags

In order to drive participation, Extole displays CTAs that promote the program. For example, a global_header CTA will add a banner element to the top of the screen that will say something like “Refer a friend.” When clicked or tapped, the banner will take the user to the Share Experience.

Marketing tags tell Extole where to serve CTAs onto your website. These CTAs are clickable entities that advertise your program to your customers and visitors. These marketing tags also enable tracking, so that you can know which marketing placements are driving participation in the program.

Extole recommends rewarding your advocates by having Extole email advocates a promotion code they can use to apply credits to their account. If your membership program will reward the advocate automatically with account credits (and not by emailing a promo code to the advocate), then you will need to restrict all sharing behind login and include advocates' information in the marketing tags.

An Extole campaign comes with a standard marketing names:

  • global_header
  • global_footer
  • product
  • confirmation
  • overlay

It's easy to create additional marketing tags if you want to add CTAs to additional pages like your blog, help pages, and so on. As you're getting started, contact your Customer Success Manager to help learn how to create these additional tags.

Marketing Tag Placement

There is a span section that goes into your web page where the content will appear. This is typically done through your CMS or on site. It is required for all tags that put content inline (but not required for overlay and confirmation tags).

<span id="extole_zone_global_header"></span>

Additionally, there is the script tag that loads the targeted content from the program and inserts it onto the page in the span tag.

Below is an example of a global_header tag:

<span id="extole_zone_global_header"></span>
<script type="text/javascript">
  /* Start Extole */
  (function(c,e,k,l,a){c[e]=c[e]||{};for(c[e].q=c[e].q||[];a<l.length;)k(l[a++],c[e])})(window,"extole",function(c,e){e[c]=e[c]||function(){e.q.push([c,arguments])}},["createZone"],0);
  /* End Extole */

   extole.createZone({
     name: 'global_header',
     element_id: 'extole_zone_global_header',
     data: {
       "partner_user_id":"00O40000004SA1AA", // DYNAMIC VALUE
       "email": "[email protected]",  // DYNAMIC VALUE
       "first_name": "April",  // DYNAMIC VALUE
       "last_name": "Advocate"  // DYNAMIC VALUE
     }     
  });
</script>

🚧

Important Note

Extole uses the visitor's name, email, and id to personalize their experience. This practice also aids in matching advocates and friends for rewards, customizing emails and shares, and recognizing when the user at a given browser has changed, which can occur on shared computers.

FieldDescription
first_name
recommended
This should be passed to a marketing tag if the advocate is logged in and their first name is known.
last_name
recommended
This should be passed to a marketing tag if the advocate is logged in and their last name is known.
email
recommended
This should be passed to a marketing tag if the advocate is logged in and their email is known.
partner_user_id
recommended
This should be passed to a marketing tag if the advocate is logged in. This is your unique identifier for this person such as an account id or member ID.

Track Signups and Purchases

Track Signups with Registration Tags

Because your business model requires the friend to create an account, you need to track those account creations. In order to capture that the friend signed up and is eligible for their reward, you add a registration tag to your post-signup page.

The registration tag passes information about the new customer to allow Extole to attribute the account to a referral when possible, run quality rules on the account, and run reward rules on the account. This helps successful tracking when the lead goes on to complete the purchase.

This tag should only fire if the account created is new. This will solidify the goal of rewarding for new customer memberships.

<script type="text/javascript">
  /* Start Extole */
  (function(c,e,k,l,a){c[e]=c[e]||{};for(c[e].q=c[e].q||[];a<l.length;)k(l[a++],c[e])})(window,"extole",function(c,e){e[c]=e[c]||function(){e.q.push([c,arguments])}},["createZone"],0);
  /* End Extole */

   extole.createZone({
     name: 'registration',
     data: {
       "first_name":"Julio",  // DYNAMIC VALUE
       "last_name":"Friend", // DYNAMIC VALUE
       "email":"[email protected]", // DYNAMIC VALUE
       "partner_user_id":"00O40000004SQbO", // DYNAMIC VALUE
       "advocate_code":"ref3lb" // IF USED
     }
  });
</script>

🚧

Important Note

Make certain that you fire the Extole tag for all new registrations so that Extole will correctly attribute registrations and manage the fraud and business rules. Please provide all customer information so that our customer support tools can be used to handle inquiries.

FieldDescription
first_nameThe first name of the person signing up.
last_nameThe last name of the person signing up.
email
required
The email address of the person signing up.
partner_user_id
required
Your unique identifier for this person signing up such as an account ID or member ID.
advocate_code
recommended
On the registration tag, this is the advocate code that the friend enters to track back to the original advocate. Must be used on advocate code programs.

Track Purchase Events with Conversion Tags

It is our recommendation that you reward the advocate after their friend purchases, not after sign-up. In order to do this, you need to communicate to Extole a purchase has happened by adding the conversion tag to your order thank you page.

The conversion tag passes information about the purchase to allow Extole to attribute the conversion to a referral when possible, run quality rules, and run reward rules. Extole will discard the conversions that are not attributed to a referral after processing rules.

🚧

Important Note

Make certain that you fire the Extole tag for all conversions so that Extole will correctly attribute conversions and manage the fraud and business rules.

<script type="text/javascript">
  /* Start Extole */
  (function(c,e,k,l,a){c[e]=c[e]||{};for(c[e].q=c[e].q||[];a<l.length;)k(l[a++],c[e])})(window,"extole",function(c,e){e[c]=e[c]||function(){e.q.push([c,arguments])}},["createZone"],0);
  /* End Extole */

   extole.createZone({
     name: 'conversion',
     data: {
       "first_name":"Julio", // DYNAMIC VALUE
       "last_name":"Friend", // DYNAMIC VALUE
       "email":"[email protected]", // DYNAMIC VALUE
       "partner_user_id":"00O40000004SQbO", // DYNAMIC VALUE
       "partner_conversion_id":"00O415320037eWy", // DYNAMIC VALUE
       "cart_value":"20.00", // DYNAMIC VALUE
       "coupon_code":"QA754AZ" // DYNAMIC VALUE
     }
  });
</script>
FieldDescription
first_nameThe first name of the person making the purchase.
last_nameThe last name of the person making the purchase.
email
required
The email address of the person making the purchase.
partner_user_idYour unique identifier for this person making the purchase such as an account ID or member ID.
partner_conversion_id
required
Your order number that uniquely identifies this transaction. Used for customer support tools.
cart_value
required
On the conversion tag, this is the value of the purchase. Ideally this is the gross cart value before coupons have been applied.
coupon_codeThe coupon code that used to make the purchase.

Track Purchases In Store / Offline

After registration, your new customer's first purchase might be made in store or after a home setup. The conversion, therefore, will need to be sent via an API call that occurs after the offline purchase or via a file delivered through an SFTP connection.

Create Extole API Keys

Extole requires API calls from account systems to authenticate with an API identifier provided in the header (OAuth key).

Your keys are managed through the My Extole Security Center.

Create your first key via the "Create New Access Token" button. My Extole will temporarily display the newly created random key for you.

Once your API key is created, you can test successful authentication using the Client API method:

curl -H "Authorization: Bearer XXXX" https://api.extole.io/v2/me/clients

[
  {
    "client_id": "1",
    "name": "Demo"
  }
]
Event API Call

For each purchase that occurs in store, an API request is sent to Extole. It is fine for the same order to be sent by the tag as well as by the API as Extole will automatically deduplicate based on the order ID.

POST https://api.extole.io/v5/events
Authorization: Bearer XXX

{
  "event_name": "purchased",
  "data": {
    "first_name": REPLACE,
    "last_name": REPLACE,
    "email": REPLACE,
    "partner_user_id": REPLACE,
    "order_id": REPLACE,
    "cart_value": REPLACE
  }
}
{
  "id":"6747711822563808783"
}
FieldDescription
first_name
recommended
The first name of the person who made the conversion.

E.g. Julio
last_name
recommended
The last name of the person who made the conversion.

E.g. Jones
email
required
The email address of the person who made the conversion.

E.g. [email protected]
partner_user_id
recommended
(can be renamed to your id, such as member_id or user_id)
Your unique identifier for this person who made the conversion, such as the member ID. This value should match the value sent in the registration tag.

E.g. 00O4000099PDZ1AA
order_id
required
On the purchased event, this is your order number that uniquely identifies the purchase event.

E.g. 122948302lala
cart_value
recommended
On the purchased event, this indicates the value that will be shown in the Extole dashboard.

E.g. 10000.00

📘

Additional Fields

In addition the above fields, any additional fields can be added onto any event.

Additional fields added on can be used for:

  • Reward Tiering
  • Customer Segmentation
  • Reporting
Response FieldDescription
idIndicates the API input event at Extole that can be used for debugging.

Reward your Customers

The advocate reward should be delivered directly into their account after the friend purchase is approved, and the friend code is delivered via overlay or email after they sign up to become a customer. The friend purchases should be automatically approved or declined after Extole's quality rules run.

Reward Friends

The friend coupon codes are uploaded into My Extole by your marketing team. You may need to create an easy process for them to generate batches of one-time-use or multi-use coupon codes.

Extole can be configured to pass these coupon codes into your friend landing URL using your parameter to display the coupon code to the friend.

You will then go into My Extole > Rewards to create and upload rewards.

Reward using Webhooks

Issue Account Credits via Webhook

When an approved conversion occurs, Extole will track an issued account credit to the account. Extole can be configured to make a real-time API to your system to inform it a reward needs to be issued.

In My Extole, you will provide a web service name, URL, and shared secret. After each reward is earned, Extole will make an outbound API call to the service name you provided.

POST https://YOURWEBHOOK
Authorization: Bearer 7049bee0bcbb149b597e2c3d0d334e3daea0f97410bd38bd5a9f15f053937b4d
Content-Type: application/json

{
    "type": "reward_earned",
    "event_id": "qb3jju459ugjr2aojk5e",
    "event_time": "2020-05-29T14:14:18.548Z",
    "reward_id": "bf67905b4e1b41daf39c30f0",
    "reward_supplier_name": "Advocate Account Credit",
    "reward_supplier_id": "701e681a9e46c8b6778f3452",
    "partner_reward_supplier_id": "Advocate Account Credit",
    "reward_supplier_type": "CUSTOM_REWARD",
    "person_id": "6816411215104951917",
    "partner_user_id": "1036950000",
    "face_value": 50,
    "face_value_type": "USD",
    "data": [
      "recipient_email": "[email protected]"
    ],
    "message": null,
    "schema_version": 1
}
Input FieldDescription
typeThis is the type of event triggering the webhook. When you configure you’re webhook you will select which events to send. The most common the reward_earned.
event_idExtole’s unique identifier for the webhook event.
event_timeThe time stamp of when Extole created the webhook event.
reward_idThe Extole unique identifier for the reward that has been issued.
reward_supplier_nameThe friend name for the reward configured in My Extole. This name can be changed by the Marketer.
reward_supplier_idExtole’s unique identifier for the reward supplier. This will not change, but Extole recommends using the partner reward supplier ID.
partner_reward_supplier_idThis is defined by you and can be any string that helps you identify the reward that you are delivering in your system. Since you are trying to apply account credits to advocate accounts, you might want to make this something like ‘extole_account_credit’. If this is not passed, all reward types will be returned.
reward_supplier_typeThis is the type of reward going out which will be:
CUSTOM_REWARD - account credits
MANUAL_COUPON - coupon code
TANGO_V2 - gift card
person_idThe Extole ID associated with the person who the reward should be delivered to. This can be used to look up more information about that person.
partner_user_idA unique identifier providing the reward to the recipient. It is important that all marketing tags include the partner_user_id.
face_valueThe face value of the reward.
face_value_typeThe face value type, which could be:
3-digit currency symbol (USD, GBP, EUR, etc.)
PERCENT_OFF (indicates the reward is a percentage off coupon)
CREDITS (indicates the reward is account credits)
data.recipient_emailThe email address of the reward recipient.
data. This object can contain any other configurable data about the person or event that caused the reward.

Reward using APIs

Issue Account Credits via API

Extole can make rewards available via an API. Schedule a process on your side that will call into the Extole Rewards API on a regular basis to pull back the rewards that have been earned by each consumer. You can then apply these rewards to each account.

POST https://api.extole.io/v2/rewards?state=earned&reward_supplier_type=custom-reward
Authorization: Bearer XXXX
Content-Type: application/json

[
  {
    "reward_id": "6626084585458921557",
    "cause_event_id": "6625713485380188505",
    "reward_supplier_id": "fd6d46833d459fb13071e261",
    "campaign_id": "6624279975852929111",
    "person_id": "6620831314790485965",
    "partner_user_id": "06e2077f-80af-4b67-89cb-2fddd7de0f4f",
    "email": "[email protected]",
    "state": "EARNED",
    "face_value": 9,
    "face_value_type": "USD",
    "partner_reward_id": null,
    "created_at": "2018-11-20T15:12:18.461-08:00"
  },
]

🚧

Important Notes

In the call above replace XXXX with your access token.

Input FieldsDescription
state
recommended
This allows you to filter to all of the rewards that you should be fulfilling.
reward_supplier_type
recommended
This selects the type of reward Extole will return. Since you are trying to apply account credits to advocate accounts, make sure to specify custom-reward to avoid getting back any friend coupon codes that might be issued.
Output FieldsDescription
reward_idThe Extole unique identifier for the reward that has been issued.
partner_reward_supplier_idThis is defined by you and can be any string that helps you identify the reward that you are delivering in your system. Since you are trying to apply account credits to advocate accounts, you might want to make this something like ‘extole_account_credit’. If this is not passed, all reward types will be returned.
person_idThe ID associated with the person who the reward should be delivered to. This can be used to look up more information about that person.
emailThe email address of the intended recipient.
partner_user_idA unique identifier providing the reward to the recipient. It is important that all marketing tags include the partner_user_id.
stateThis is the state the reward is in. If no state is specified in the API call, all states will return: redeemed, fulfilled, sent, earned, failed, canceled. You should pass "earned" as a parameter in the call to filter by all rewards that need to be fulfilled.
face_valueThe face value of the reward.
face_value_typeThe face value type, which could be:

3-digit currency symbol (USD, GBP, EUR, etc.)
PERCENT_OFF (indicates the reward is a percentage off coupon)
* CREDITS (indicates the reward is account credits)
partner_reward_idThis is a reward id that can be specified by you when the reward is created. For account credits, this will likely always be null.

Fulfill Events via API

Let Extole know that rewards have been fulfilled via an API. Schedule a process on your side that will call into the Extole Events API on a regular basis to share the rewards that have been fulfilled.

POST https://api.extole.io/v5/events
{
  "event_name": "reward_fulfilled",
  "data": {
    "reward_id" : "bf67905b4e1b41daf39c30f0",
    "partner_reward_id" : "RewardId123459",
    "message": "successful fulfillment"
  }
}
{
  "id":"6747711822563808783"
}
Input FieldDescription
event_namereward_fulfilled
reward_canceled
reward_idThe Extole unique identifier for the reward that has been issued.
partner_reward_idIf you have a unique tracking or fuflillment identifier
messageA message reward fulfillment that shows up in customer support
Response FieldDescription
idIndicates the API input event at Extole that can be used for debugging.

🚧

Response Field

The API results can contain various IDs that will be ignored. The preferred method to reconcile with Extole is to use your Partner Conversion Id (order number).

Reward using Files (SFTP)

Issue Account Credits via File

When an approved conversion occurs, Extole will track an issued account credit to the account. The earned rewards report will be automatically made available in your account on the Extole SFTP server on a daily basis.

The conversion file can be downloaded from the Extole SFTP system or pushed to your SFTP system.

📘

SFTP Resources

Using Extole's SFTP Server

Our system uses the following naming convention:
earned-reward-report-YYYY-MM-DDTHHMMSS.csv

CSV ColumnDescription
reward_idThe Extole unique identifier for the reward. This will be used in the fulfillment file to indicate this reward has been fulfilled.
reward_state_transition_timeWhen the reward transitioned into this state (usually earned) as an ISO time format:
e.g. 2021-04-12T10:14:10.163-07:00.
face_value_typeIndicates the face value type such as “USD” or “GBP” or “Points"
face_valueIndicates the value of the reward for example a $50 reward would have a “face_value_type” of “USD” and a face value of “50”

e.g. 50
campaign_id
optional
The Extole Campaign Identifier.
campaign_name
optional
The Marketing Name for the campaign.
reward_supplier_typeThe reward supplier type. Most likely this will be CUSTOM_REWARD to indicate an account credit.
reward_supplier_id
optional
The Extole internal unique identifier for the reward supplier
partner_reward_supplier_idThe reward identifier configured in My Extole. This can be set to any string desired, for example:

E.g. QA-FRIEND-REWARD
passed_through_reward_stateThis indicates the reward passed through this state, but typicaly the report is set to only return EARNED rewards.
current_reward_stateThe reward's current state. Typically the report is set to only return rewards currently in the EARNED state.
reward_nameThe marketer-friendly name of the reward.

E.g. Friend $50 Reward
person_idThe Extole unique identifier for the person.
emailThe email address of the recipient of this reward.
partner_user_idThe partner_user_id of the recipient of this reward. This is your ID for the person, and this ID would have been passed into the program on a tag or event.
first_nameThe first name of the person earning the reward.
last_nameThe last name of the person earning the reward.

Fulfill Rewards via File

After the rewards have been fulfilled, you can upload a response file back to the Extole SFTP to transition the reward to fulfilled.

CSV ColumnDescription
event_namereward_fulfilled
reward_idThe Extole unique identifier for the reward, which can be ignored.
emailThe email address of the person who received the reward.
partner_reward_idA unique fulfillment or tracking ID for the reward in your system.
messageA unique message that displays with the fulfillment in Extole support.

Design your Experience

Your entire referral consumer experience can be configured in the My Extole Campaign Editor. This part of setting up the solution can be done entirely by your marketing and creative team and doesn't require technical involvement. Each template is a comprehensive guide for your designer or marketer to customize.

2646

Marketer Control Editing

Integrate with your Mobile App

If you have a mobile app, then it is essential that you connect to Extole's API to make certain:

  1. That clicks on links shared to friends on mobile devices go to the right landing experience to register a new customer
  2. That Extole knows about the registrations and conversions on mobile (because we need to reward the advocates!)
  3. That we add appropriate promotion (remember Calls to Action?) in menu items and on account screens.
  4. That we enable sharing from the mobile phone, whether in the app or using the native sharing dialogs

Please take a look at our Mobile App Guide for more details about how to implement.

Recommended Additional Steps

Embed the Advocate Stats Dashboard Directly onto a Page

If you want to have an advocate stats dashboard directly onto one of your pages after the user is logged in, for example on the My Account Page, you will want to verify the user and tell Extole who they are.

You will need to do 2 things:

  1. Add an advocate_stats_embedded tag, which looks exactly like a marketing tag, to the page where you want to serve the creative.
  2. Verify consumers so that their data displays: Verifying Consumers

Embed a Share Experience Directly onto a Page

If you want to embed a sharing experience on a dedicated referral page or account page, the tag looks exactly same as marketing tags, you would just call the zone referral_page or account_page.

Enable Product Sharing

If you want to enable your advocates to share specific products, then the product marketing tag may be placed on your category and product pages to allow advocates to share specific categories or products. Extole will read the Facebook OpenGraph meta tags off of the page and incorporate the product name, description, and image into the share message.

Optional Additional Steps

Below are some of the topics regarding parts of the process that aren't requirements for most retail experiences, but might be for yours.

Creating your own Advocate Code or Link

Extole will automatically create a unique code for every advocate that comes through the program. If you want to create your own codes for your customers you will need to take the following steps:

  1. Create Token to call the Extole API
 Get Token
  2. Identify the Advocate
 Create or Update User Profile
  3. Get Share Code (if one exists):
 Get My Share Links (Shareables)
  4. Create Share Code: Create Share Link (Shareable)

Use your Opt-out List

All mails sent by Extole are CAN-SPAM compliant and honor the customer preferences. Referral programs are typically treated as their own segment of emails unique from the normal marketing opt-out list, making this step optional. Each email sent to an advocate or friend will include an unsubscribe link, managed by Extole, that will opt the customer out of the referral program.

If you need to do a more complex opt-out synchronization, Extole can check your opt-out list with a webhook API or you can upload a list of opt-outs to Extole's SFTP server.

  1. Extole Opt-out Check: Opt Out API
  2. File-based Opt-Out List Management: Opt Out Files

Upload an SSL Certificate for your Branded Domain

When you created your branded domain at Extole and notify your CSM, Extole will automatically procure a certificate from LetsEncrypt for your domain.

Verify Advocate Codes

When a potential customer is going become a member of your business, there is a good likelihood that they will not click on a referral link but will rather go to your site directly and enter an advocate code they received from their friend.

That advocate code, provided it is valid, will tell Extole to capture the sign up in our system and then run quality rules to reward to the friend.

If you want your implementation to return feedback to the customer right when they attempt to apply the code, you can find those integration details here. That means that in the code capture field you will need to call Extole to ask if the code is a valid referral code.

You only need to implement the code below if you want to tell the user before she signs up that it was a valid code or not (similar to an apple coupon code button on a cart page).

// SCENARIO: Person on has submitted an advocate code, verify it is real, apply a coupon:

function promptForAdvocateCode() {
    // TODO - implemented by client
}

submitAdvocateCode("ADVOCATE_CODE", function (error, response) {

    if (error) {
        // handle error
        return;
    }

    isRewardable(function (error, response) {
        if (error) {
            //handle error
            return
        }
        applyReward();
    });
});

function isRewardable(callback) {
    extole.require(["core-root:///shared/person-rewardable-service.js"], function (personRewardableService) {
        personRewardableService.isRewardable(callback);
    });
}

function submitAdvocateCode(advocateCode, callback) {
    extole.require(["core-root:///shared/person-relationship-service.js"], function (personRelationShipService) {
        personRelationShipService.createRelationship(advocateCode, callback);
    });
}