Beginning with Coupon module version 5.058 we have added a special coupon which can calculate a discount
based on the number of points the customer has accumulated in their coupon points account. Essentially the
system works like a coupon, but allows carry over of points.
Since this is a coupon, it uses the same rules which exist for other coupons. You can make the coupon valid
based on many factors; minimum order total, certain products, include/exclude price groups, location in the
world, or payment method used. That said, customers feel entitled to those points, so you probably won't put
too many restrictions on them. You can set a maximum redemption value on a single order. If the points available
for redemption exceeds the total of the order, points are carried over. You can also configure the system to only
redeem off the product total. However, you can configure it to consider other discounts (coupons, etc) or fees,
shipping and tax when calculating the order total it can subtract from. So you can make it so points can zero
out an order or you can make it so the customer pays shipping and tax.
You can configure the module so that points are saved to the account when the customer completes an order or
other action. You can make the points immediately available by checking the box to auto-activate the points.
The points can be 1 for 1, e.g. if an order is $147.50, 148 points are deposited in the account. You can limit the
order total used in the calculation to just the products and other charges (coupons, fees, etc) or you can include
shipping and/or tax in the total too. Or you can save points as a ratio of an amount, e.g. save as 1 point for
every $10 spent. Your choice. When the points are redeemed you can do the same thing, i.e. 1 for 1 or 1 for X.
Again, your choice. I found the clearest method for the customer is to save 1 for 1, then redeem at $1 for 10
points. Essentially they are getting 10% off their previous order which is given to them on the next order.
This stimulates customer loyalty and increases the chance they will return to collect the virtual money they
left on the table.
Customers can view their award point transactions in the Account tab after they login. Since the display the
customer sees is done with store morph template code, you can show or hide any of the columns of data. You can
also change the date format to match that of the majority of your customers, e.g. MM/DD/YYYY, DD/MM/YYYY, or
YYYYMMDD.
Store owners can view a customer's points transactions in admin (fig 12). If you do not have auto-activate turned
on, you can check the box to activate the points in the admin screen. Store owners can also edit transactions to
change points in case there was a change in the order. The store owner can also delete transactions from the
account. The store owner can insert a points transaction, e.g. to compensate for a problem with an order.
However, do not sell points as that would be more like a gift certificate which has a different legal status
than a coupon.
There is a quick update screen for pending points approval. On that screen it lists all points transactions that
are pending. You can approve the transactions or delete them by checking the applicable boxes in the transaction
list and click the update button at the bottom of the page.
The module has both an import and export capability. Fields in the import/export include customer login, order id
(if applicable), date in unix time, event (add, subtract, modify, etc.), note (welcome, order related,
compenstion, etc.), and points.
Getting Started:
- To get started create the coupon. This example is for 1 for 1 points creation and .1 for 1 redemption.
Add a new coupon with the coupon code POINTS. Select Percent Discount for the type. Set the amount to 10.00
(which is 10%, i.e. .1 for 1). Set a Maximum Value if you want to limit to a certain amount in a single order.
Do not set start or end dates. Make it a multiple use coupon. Set the Alternate Basket Label, e.g. Award Points
or whatever you want to call your program. Save the new coupon.
- Click the Admin tab in the Coupon Redemption screen. Scroll to the bottom (fig 13). You have the option to
make points available immediately with the auto-activate check box. Or you an make them pending until you
change the status to active in admin. Set the ratio for order
amount to points added. If you are giving 1 point for each dollar spent, the number would be 1. If 1/2 point
for each dollar spent, the number would be .5. When determining how many points can be redeemed in an order, the
limit will be at least the cost of the products. If you offer coupons or other discounts you would want to
include those "other" charges. As example, an order is $10. A coupon for $1 off is redeemed. That means their
balance is $9. If you only considered the products, the points redemption could be $10 which means you would
owe them a dollar. So you normally apply to the "other" charges too. As for tax and shipping, if you want
points to subtract from that so that you can get a zero dollar order, you would check those two boxes. Many
points systems expire points if they are not used and an account remains dormant for a period of time. If you
do that, you probably should notify customers that their points coupon is about to expire. You can send them
and email X number of days from the date of their last activity. Likewise, you can expire those points at
some time after that last activity. When you expire you have options on what message, if any, you want to
display in the customer's history panel (limited to 50 characters long). Once configured, you will be able to
run the email reminders and expired account adjustment by clicking the + to the left of Utilities. Then click
on the Coupon Utility link. You will see the forms for those two tasks. You could also setup cron tasks to
handle these operations automatically. An example cron command for sending the reminder emails that I use is:
wget --post-data='Screen=SUTL&Action=SUTL&Store_Code=YOURSTORECODE&Module_Code=couponrp&UserName=YOURUSERNAME&Password=YOURPASSWORD&Provision=yes&Submit=Login&subaction=reminders' https://www.YOURDOMAIN.com/mm5/admin.mvc --no-check-certificate >/dev/null 2>&1
An example cron command for adjusting dormant accounts that I use is:
wget --post-data='Screen=SUTL&Action=SUTL&Store_Code=YOURSTORECODE&Module_Code=couponrp&UserName=YOURUSERNAME&Password=YOURPASSWORD&Provision=yes&Submit=Login&subaction=remove' https://www.YOURDOMAIN.com/mm5/admin.mvc --no-check-certificate >/dev/null 2>&1
Change the words in upper case to the actual values for your store.
- If you opt to send the reminder emails, you will need to create a page template called POINTS_E. Here is
an example to help get you started.
<mvt:if expr="g.Screen CIN 'POINTS_E'">
<mvt:exit>
</mvt:if>
%subject|EmporiumPlus.com - Reward Points Program%
%to|bill_email%
<html>
<head>
<base href="&mvt:global:basehref;">
</head>
<body>
<mvt:item name="fonts" param="body_font">
Dear &mvte:global:CustomerPoints:bill_fname; &mvte:global:CustomerPoints:bill_lname;,
<br><br>
We noticed you have not added or redeemed points in our store
since &mvte:global:CustomerPoints:mm;/&mvte:global:CustomerPoints:dd;/&mvte:global:CustomerPoints:yyyy;.
We just wanted to remind you that you have &mvte:global:CustomerPoints:balance;
points in your account which are set to expire in approximately
30 days. To avoid losing these points, you can redeem the
points or make a purchase, no matter how small it is, to keep your
account active. %lf%
<br><br>
YOUR NAME HERE
<br>
Store Owner
<br>
<a href="http://www.YOURDOMAIN.com/mm5/merchant.mvc">&mvt:global:store:name;</a>
</mvt:item>
%lf%
</body>
</html>
Beginning with couponrp version 5.014 you can also change the from address block with tokens, e.g.
%from|abc@yourdomain.com%
%from_name|YOUR STORE NAME%
To use the from_name token you will need to have "Add Angle Brackets to Email Addresses" turned
on in your global settings:domain settings:site configuration if your mail server supports them.
Some mail servers, e.g. the new ones at mivamerchant.com are not supporting the from NAME address.
So we added a new token in version 5.017 of the coupon utility module to handle those servers. Use
this for the from name address token instead of the one above.
%from|abc@yourdomain.com%
%from_namens|YOUR STORE NAME%
Email opt out option
You will need Emporium Plus Tool Kit version 5.270 or newer and Coupon Utility version 5.019 or newer
in order to implement this feature. The Tool Kit maintains a registry of customers who have told you
they only want order emails from you. First setup the Tool Kit functionality. See the functions "donotemail_e"
and "donotemail" in the functions list.
Here is example code you can put in the Coupon Utility email to allow them to unsubscribe from emails.
If you want to be placed on the Do Not Email registry and only receive emails when you place an order or
when there is a product recall, click the email address
<a href="http://www.YOURDOMAIN.com/NOEMAIL.html?Action=add&email=%DoNotEmail_E%">%DoNotEmail%</a>
Keep in mind, this action will prevent you from receiving emails like this one.
The Coupon Utility module version 5.019 or newer has code in it that will replace the tokens %DoNotEmail%
and %DoNotEmail_E% with the 'to' address the email is being sent to. If the email recipient clicks the link
they will land on the page NOEMAIL and pass the 'add' action and email address to the Tool Kit donotemail_e
(or donotemail) function. With the Coupon Utility module four things need to happen to prevent someone from
receiving those emails. a) You need to be using Tool Kit 5.270 or newer, b) You need to be using Coupon
Utility 5.019 or newer, c) The tokens %DoNotEmail% and %DoNotEmail_E% must be in the POINTS_E email template,
d) The customer would have to click the link to be placed on the Do Not Email registry.
This registry can be used for any module written to interface with it. So, as example, you use the Coupon Utility
module to send emails to customers to warn of point expiration. If you have a version of the module that supports
it, you can include the tokens %DoNotEmail% and %DoNotEmail_E% in the email template and it will know to check the
registry before sending emails. If you do not include that token, the module will skip the registry check and send
them emails even if they opted out from Follow-on Contact or Restock Shelves emails. This may upset customers who've
told you they only want order emails from you. So if you are going to offer a Do Not Email option, you probably
should do it with all modules which send non-order emails.
- Create the custom customer fields called pointsdate and pointsmail.
- The first edit on the OSEL page puts a button at whatever location you want it. Important: It cannot go
inside the existing form on the page which collects shipping and payment methods and continues the customer to
the next page. I recommend you put this edit above the existing form on the page for two reasons, 1) it makes it
less confusing if the redeem button is prominently displayed further away from the existing continue button on the
page, 2) you only have to run the token to retrieve the balance once on the page. The first line is the token which
retrieves the balance.
<mvt:item name="couponrd" param="balance" />
<mvt:if expr="l.settings:points:inbasket">
<form method="post" action="&mvt:global:secure_sessionurl;">
<input type="hidden" name="Store_Code" value="&mvte:global:Store_Code;">
<input type="hidden" name="Screen" value="OSEL">
<input type="hidden" name="Action" value="NEW">
<input type="hidden" name="SubScreen" value="CouponRd">
<input type="hidden" name="coupon_id55" value="-POINTS">
<input type="submit" name="cpn" value="Remove Points">
</form>
<br />
<mvt:else>
<mvt:if expr="l.settings:points:balance">
<form method="post" action="&mvt:global:secure_sessionurl;">
<input type="hidden" name="Store_Code" value="&mvte:global:Store_Code;">
<input type="hidden" name="Screen" value="OSEL">
<input type="hidden" name="Action" value="NEW">
<input type="hidden" name="SubScreen" value="CouponRd">
<input type="hidden" name="coupon_id55" value="POINTS">
<input type="submit" name="cpn" value="Redeem Points Now">
<font color="red" size="-1">
<mvt:item name="couponrd" param="misc" />
</font>
</form>
<br />
<span style="font-size:100%;color:#0000ff">
You have &mvt:points:balance; award points in your account. They <br />
can be redeemed for up to &mvt:points:formatted_value; off your order.
</span>
<br />
</mvt:if>
</mvt:if>
- The second OSEL edit is a five line addition to the form which collects shipping and payment info and
goes to the OPAY page. Locate that form on the OSEL page. You will see several hidden inputs, e.g. for
Store_Code and others. At that location, e.g. on the line after the Store_Code line, put the following:
<mvt:if expr="l.settings:points:inbasket">
<input type="hidden" name="points_summary55" value="&mvte:points;">
<mvt:else>
<input type="hidden" name="points_summary55" value="">
</mvt:if>
Note: If this edit is further down the page then where you put the redeem form and button, you will need to include
this line <mvt:item name="couponrd" param="balance" /> just before these five lines so it will retrieve the
balance and whether points are going to be used in the order.
- Click items at the top of the OSEL page template. Scroll down and make sure couponrd is assigned to this page.
- In the event the customer redeems enough points to make the order $0.00, you will not need to send them to the
payment module. So you need to change the url in the form that posts when they click the button on the OPAY page.
On the OPAY page template, locate the line
<form method="post" action="&mvt:payment:url;">
Replace it with these five lines.
<mvt:if expr="l.settings:basket:total EQ 0">
<form method="post" action="&mvt:global:secure_sessionurl;">
<mvt:else>
<form method="post" action="&mvt:payment:url;">
</mvt:if>
Then a little further down the OPAY template locate the section for payment information. You will create a conditional
that shows a different message if the basket total is 0. But if it is not 0, then it will show the original payment
information.
<mvt:if expr="l.settings:basket:total EQ 0">
<input type="hidden" name="PaymentMethod" value="">
<div id="payment">
Your balance is zero. Please click the continue button to display the invoice.
</div>
<mvt:else>
Put the original payment info section in this part of the conditional
</mvt:if>
- You will probably want to add a points transaction log to the customer's account page. In a CSSUI store that
page is ACLN. In a MMUI store it is probably best on your ACED page. Locate the display on the page where you
want it.
<mvt:item name="couponrd" param="pointshistory|transactions" />
<mvt:if expr="g.transactions GT 0">
<mvt:item name="couponrd" param="balance" />
You have &mvt:points:balance; award points in your account.
<a href="&mvt:global:secure_sessionurl;Store_Code=&mvta:store:code;&Screen=ACLN&showpoints=1">Details</a>
</mvt:if>
You can see this line with a link includes a variable called showpoints which will expand the code below if clicked.
<mvt:if expr="g.showpoints">
<br class="clear" />
<mvt:if expr="g.transactions GT 0">
<center>
<table border="1" cellpadding="2" cellspacing="0" width="95%">
<tr>
<th align="middle" valign="middle" bgcolor="blue" colspan="5">
<font color="white" size="2">
<b>
Your Awards Points History</b>
</font>
</th>
</tr>
<tr>
<td align="left" valign="middle" bgcolor="blue">
<font color="white">
<b>
Order #</b>
</font>
</td>
<td align="left" valign="middle" bgcolor="blue"">
<font color="white">
<b>
Date</b>
</font>
</td>
<td align="left" valign="middle" bgcolor="blue"">
<font color="white">
<b>
Event</b>
</font>
</td>
<td align="left" valign="middle" bgcolor="blue">
<font color="white">
<b>
Note</b>
</font>
</td>
<td align="right" valign="middle" bgcolor="blue">
<font color="white">
<b>
Points</b>
</font>
</td>
</tr>
<mvt:foreach iterator="history" array="pointshistory">
<tr>
<td align="left" valign="top">
<mvt:if expr="l.settings:history:order_id">
<mvt:if expr="NOT l.settings:history:bill_email">
&mvt:history:order_id;
<mvt:else>
<a href="&mvt:global:secure_sessionurl;Screen=ORDS&Store_Code=&mvta:global:Store_Code;&Order_ID=&mvta:history:order_id;&Order_BillEmail=&mvta:history:bill_email;&Order_BillZip=&mvta:history:bill_zip;">
&mvt:history:order_id;</a>
</mvt:if>
</mvt:if>
</td>
<td align="left" valign="top">
&mvt:history:mm;/&mvt:history:dd;/&mvt:history:yyyy;
</td>
<td align="left" valign="top">
&mvt:history:event;
</td>
<td align="left" valign="top">
&mvt:history:note;
</td>
<td align="right" valign="top">
&mvt:history:points;
</td>
</tr>
</mvt:foreach>
<tr>
<td align="right" valign="top" colspan="5">
&mvt:points:balance;
</td>
</tr>
</table>
</center>
</mvt:if>
<br class="clear" />
</mvt:if>
- At the top of the ACLN or ACED (whichever you put the above code on), click Items. Scroll down and assign the
couponrd item to the page.
- Now test to make sure everything is working.
In addition to adding points after an order, you can use a token to reward points after a specific action by
the customer, e.g. creating a new account. The 1st parameter is addpoints. The 2nd is the text you want
for the event action, e.g. added, adjusted, initialized. The 3rd is the text you want as a note related to
the entry. The 4th is the number of points. You can use a variable which contains the value. Or you can
use the raw number surrounded by the apostrophe character as in the example below. The example below would
add 10 points upon account creation. You would place the code on the page the customer lands on after saving
their new account information.
<mvt:if expr="g.Action AND g.Action EQ 'ICST'">
<mvt:item name="couponrd" param="addpoints|Added|Welcome to our reward points|'10'" />
</mvt:if>
If you selected to not auto-activate the points after an order, you can edit the record in the customer's
admin screen and change the status to active. However, if you are using the manage orders system and
sending the "shipped" emails, you can embed a token which will activate the points for the order being
shipped as the email is being sent. Assign the couponrd item to the shipping email template's items list.
Then put this token anywhere in the page template.
<mvt:item name="couponrd" param="activate|l.all_settings:order:id" />
You can also use the pending transactions form by clicking the + to the left of Utilities and then
Coupon Utility. It will display all pending transactions. You can approve their activation or delete them.
Check the boxes for the transactions you want to update and then click the update button at the bottom of
the page. Fig 14.
If you want to let your customers know how many points were added to their account in the order email, you
can insert text in the template email similar to the below. Change the text so it is appropriate for your
store (store name, expiration period, etc) Be sure to assign the couponrd item to the items list of the
email template.
<mvt:if expr="l.settings:order:total">
<mvt:item name="couponrd" param="newpoints|l.all_settings:order" />
<mvt:if expr="l.settings:newpoints GT 0">
We have added &mvte:newpoints; award points to
your account. These points have no cash value. These points
expire if your account is dormant and no points are added or
redeemed for a period of six months. These points cannot be sold
or transferred to another account. Emporium Plus is not
responsible for lost or expired points. Emporium Plus reserves
the right to discontinue the award points program without prior
notice.
</mvt:if>
</mvt:if>