Overview of promotions
Promotions are a key tool for e-commerce marketers to engage customers, drive sales, and incentivize actions through promo codes. The promotions feature simplifies creating and allocating promo codes, enabling seamless integration into your campaigns.
Blueshift manages promo code distribution and redemption. However, validation will remain the responsibility of your e-commerce system.
To effectively use promotions in your campaigns, follow these steps:
- Prepare CSV of promo codes
- Create promotion code bucket
- Use promo codes in your templates
- Assign promo codes for your campaigns
- Track promo code distribution
- Monitor alerts for promo bucket statuses
- Promo codes in customer profile
- Add more promo codes to existing buckets
Important considerations
- Template integration: Ensure the promo code syntax is correctly added to your campaign templates.
- Campaign association: Always link the promotion bucket to the trigger in your campaign.
- Promo code availability: Segment backed campaigns will stop running if the promo bucket runs out of codes or the promotion bucket expires.
- Testing promo codes: Promo codes can only be tested in live campaigns. For test sends, a dummy code is generated for preview purposes but it does not actually allocate a promo code.
Prepare CSV of promo codes
Create a CSV file with the required promo codes and structure it as shown in the example below. Ensure the header row matches the required format.
Make sure the codes are unique to prevent any overlap or reuse.
Click here to download a sample CSV file.
Create promotion code bucket
- Navigate to Promotions in the left-hand menu under Data.
- Click the +PROMOTION button on the top right corner of the screen.
Fill in the following fields:
- Promotion name: Provide a meaningful name for the promo bucket.
-
End date:
- Specify the end date for the promo bucket, or leave it as None.
- Campaigns using codes from buckets with an End Date will pause automatically after 11:59:59 PM on the specified date.
-
If a promotion bucket is set to expire, a notification email will be sent within 72 hours before the expiration.
- The email is sent to the campaign owners and the promotion creator.
- Additional recipients specified in the notification field will also receive the email if notifications are enabled.
- For buckets with expiry dates shorter than 72 hours, the reminder will still be sent before the bucket expires.
-
Type:
- Choose between multi-use and single-use promo codes:
- Multi-use (selected by default): Multi-use promo codes assign a maximum of one sticky code per user from the promotion bucket. The allocated code will be the same even if the promotion bucket is used across multiple campaigns.
- Single-use: Single-use promo codes ensure that each user receives a unique promo code every time a trigger in the campaign needs to allocate one. Each code is designed to only be used once.
- Discount value: Enter the discount value (e.g., 20) for the promotion.
-
Discount format: Choose one of the following:
- Percent off: Discount is a percentage (e.g., 20% off).
- Amount off: Discount is a fixed amount (e.g., $20 off).
- Choose between multi-use and single-use promo codes:
Allocation behavior
The promo code allocation behavior does not take into account the triggers and campaigns it is associated with. The only factors are whether the user has previously been allocated a promo code and whether it is a multi-use or single-use promotion.
Multi-use
Whenever a request is made to allocate a multi-use promo code for the user, it checks to see if the user has already been allocated one in the past. If the user has, it returns the same promo code the was previously allocated. Otherwise, it allocates a promo code for the user. This same promo code will be returned again if the you attempt to allocate another one for the same user in the future, which is what makes them sticky.
Single-use
For single-use promo codes, a new unique promo code is allocated for the same user each time. It doesn't matter if the allocation is happening from within the same trigger, different triggers, or different campaigns. Every request to allocate one for the user will return a new promo code each time.
You are allowed to associate multiple promotion buckets with a single trigger but campaign execution will only allocate at most one promo code for the user at each trigger. The purpose of having multiple promotion buckets for a trigger is so that campaign execution can use other buckets in case one of the buckets is out of promo codes. Campaign execution does not allocate a promo code from each associated promotion bucket!
To better understand how multi-use and single-use promo codes behave, let’s consider the following examples:
Promo code allocation example: multi-use vs. single-use
To better understand how multi-use and single-use promo codes behave, let’s consider the following example:
Jane Doe creates a promotion called "Festive Offers" with three coupon codes: AB, CD, and EF. She associates this promotion with the "Festive Season" campaign, which sends an email notification to customers when they view a product on the website.
Case 1: Multi-use promo codes
If "Festive Offers" is set as multi-use:
- A customer, Alice, qualifies for the campaign by viewing a product and is assigned the coupon code "AB."
- If Alice views a product again and re-qualifies for the campaign, she will continue to receive the same coupon code "AB."
Case 2: Single-use promo codes
If "Festive Offers" is set as single-use:
- A customer, Bob, qualifies for the campaign by viewing a product and is assigned the coupon code "AB."
- If Bob receives another message from the campaign, he will be assigned a new coupon code, "CD," when a different trigger sends a message, even if he has not exited or re-qualified.
- If Bob re-qualifies for the campaign at a later date, he will be assigned a new coupon code, "EF".
-
Enable notification: By default, this checkbox is unselected. Select this option to enable notifications related to promotion activity and expiration reminders.
-
When enabled:
- Enter the threshold for notifications in the Notify when field. You can choose between:
- Percent of total coupons: Receive notifications when the percentage of remaining coupons falls below the specified value (e.g., 10%).
- Number of coupons: Receive notifications when the total number of remaining coupons falls below the specified value (e.g., 50 codes).
- Add additional recipients in the Notify emails field, separated by commas. These recipients will receive notifications along with the campaign owner and promotion creator.
- Enter the threshold for notifications in the Notify when field. You can choose between:
-
Notification highlights
- Expiration reminders are sent to the promotion creator and campaign owners even if the Enable notification checkbox is not selected.
- If the checkbox is selected and additional recipients are specified, they will also receive the expiration reminder email.
- For promotions with an expiration date shorter than 72 hours, the expiration email will still be sent before the bucket expires.
- Upload CSV: Upload the CSV file created earlier.
-
Preview uploaded codes: Once you upload the CSV file, the system will automatically show a preview of the first 10 rows under a Sample Data section. This helps you confirm the structure and values of the uploaded file before submitting the promotion.
- The preview may render incorrectly if the file contains structural issues (e.g., extra columns).
- You can click Fetch Again to refresh the preview if you reupload a different file.
- Click Submit to save the promotion bucket.
Use promo codes in your templates
Promo codes can be dynamically added to your email, push, or SMS templates to personalize content for each customer. Follow these steps to use promo codes effectively:
-
Basic syntax:
Use the generic syntax {{ user.promo_code }} to dynamically populate the promo code in your template. When the message is sent, this placeholder is replaced with the promo code assigned to the customer from the associated promotion bucket. -
Advanced syntax (optional):
Alternatively, you can use the following syntax to reference a specific promotion bucket:
{{ user.promotions.'promotion_id' }}
Replace 'promotion_id' with the UUID of the promotion bucket.
-
Important consideration:
- The advanced syntax works only if the promotion_id in the campaign matches the promotion_id in the template.
- The message will be sent without any promo code if there's a mismatch.
Recommendation
To avoid errors and ensure seamless integration, we recommend using the generic syntax {{ user.promo_code }} instead of specifying a promotion_id in your templates.
Assign promo codes for your campaigns
You must assign a promotion bucket to the trigger during setup to ensure your messages include the correct promo codes. This is done in the Send Settings on the Messaging tab for each applicable trigger.
Trigger-based code assignment
For single-use promo codes, a new code is issued at each trigger within the same campaign, even if the user has not exited and requalified. To maintain the same code across touchpoints, consider using multi-use promo codes.
- Multi-use promo codes: Customers receive the same sticky code for all triggers across campaigns using the same promotion bucket.
- Single-use promo codes: Customers will receive a new code at each trigger within a campaign, even if they do not requalify.
Sticky promo code assignment across campaigns
If multiple campaigns use the same multi-use promotion bucket, each user gets one sticky promo code. This code stays the same for that user across all campaigns using that promotion bucket.
Important: Promo codes are assigned based only on the user and the promotion bucket. The logic does not consider which campaign or trigger the bucket is used in. Because of this, some codes may stay unused even if all campaigns are delivered.
Promo code delivery & assignment rules
- If a promotion bucket is not assigned to the trigger, the campaign message will not include a promo code, and the placeholder will remain blank.
-
Promo code allocation behavior:
- For multi-use promo codes, allocation is sticky. Customers receive the same code across triggers in all campaigns where the same promotion bucket is used.
- For single-use promo codes, allocation is not "sticky." Customers will receive a new code each time they requalify for the campaign, even if the trigger and promotion bucket remain the same.
Track promo code distribution
View the details of each promo bucket under Promotions. The table includes:
- Total codes: The total number of codes uploaded.
- Available codes: The number of codes remaining.
You can view the campaigns where the promotion bucket is used from within the promotion editor.
Monitor alerts for promo bucket statuses
Alerts will be sent if the Enable notification checkbox is selected for the promotion bucket. These notifications include:
- A 72-hour reminder before the promo bucket expires.
- Campaigns that will pause due to expired promo buckets.
Here is an example:
Promo codes in the customer profile
The Promotions section on the customer profile provides visibility into the promo codes assigned to a specific customer. This section displays:
- The name of the promotion bucket from which the coupons were dispensed.
- The promo codes sent to the customer to date are displayed, showing up to 10 codes per promotion, with the most recent codes listed.
Add more promo codes to existing buckets
If you're running low on promo codes or need to add additional codes to an existing bucket:
- Edit the bucket in the Promotions section.
- Upload a new CSV file containing the additional codes.
- Ensure the format matches the original file used during bucket creation.
- New codes will be appended to the existing bucket.
Promo code allocation behavior
- Multi-use promo codes - Adding new codes ensures availability for new customers or scenarios where additional codes are needed. Existing customers will continue to use the same codes already allocated to them.
- Single-use promo codes - The campaign cannot allocate new codes without enough available codes in the bucket, since a new one is issued at each trigger. Therefore, adding new codes ensures that the campaign can issue unique codes to each customer who requalifies.
- Avoid duplicate codes in the new file to prevent allocation errors.
Frequently asked questions
1. Will a user receive the same promo code for multiple touchpoints in a given campaign?
The promo code sent to a user at different touchpoints in a campaign journey depends on the following criteria. If any of the below differ, a different code will be sent:
- User
- Campaign
- Promotion bucket
Additionally, here is an important note about the promo code behavior:
- Multi-use promo codes: Allocation is sticky. The user receives the same promo code for every touchpoint across multiple campaigns using the same promotion bucket.
- Single-use promo codes: Allocation is not "sticky." The user will receive a new promo code at each trigger within the same campaign, even if the user has not exited and requalified.
2. Can I include multiple promotions in a single trigger?
Yes, but the user will only be allocated at most one code from one of the promotions. If a promotion bucket runs out of codes, the system will try the next promotion bucket in the sequence.
For example, if the trigger includes Bucket A and Bucket B:
- The system will first attempt to allocate a code from Bucket A.
- If Bucket A runs out of codes, it will then allocate a code from Bucket B.
This behavior applies regardless of whether you use {{user.promo_code}} or {{user.promotions.'promotion_id'}} in your templates. However, for multiple promotions, we recommend using {{user.promo_code}} to avoid potential mismatches.
3. Why did a user receive a different single-use promo code at each trigger within the same campaign?
Single-use promo codes are not “sticky.” A new code is issued at each trigger within the campaign, even if the user has not exited or requalified. This ensures that each message delivers a unique code.
If you want the same code to be used across all touchpoints, use a multi-use promotion bucket instead.
Comments
0 comments