> For the complete documentation index, see [llms.txt](https://docs.roadmap.so/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roadmap.so/loyalty-and-rewards/points-and-ways-to-earn/award-points-for-subscription-purchases.md).

# Award points for subscription purchases

Award bonus points every few subscription products a customer buys, counted across all of their subscriptions.

The **Subscription Rewards** way to earn pays points each time a customer's subscription product count reaches the next multiple, for example 100 points at 3 products, again at 6, and again at 9.

It counts **products, not orders**. A customer who takes three products in one delivery reaches the reward just as fast as one who takes three deliveries, so there is nothing to gain from splitting an order into several shipments.

{% hint style="info" %}
Only subscription products count. Anything bought outside a subscription is ignored, no matter how much of it there is.
{% endhint %}

### Set it up

In **Loyalty Program → Points**, click **Add way to earn** and choose **Subscription Rewards**.

{% hint style="warning" %}
You can configure one Subscription Rewards earner per program. Once you have one, the type appears dimmed in the **Add way to earn** list.
{% endhint %}

<figure><img src="https://393112916-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJ8asLD4FVCFagK40xEr4%2Fuploads%2FkaE2w5MboUYagNDAbF5n%2FScreenshot%202026-10-16%20at%201.21.58%E2%80%AFPM.png?alt=media&amp;token=41e60628-7423-4c1f-ad9d-33efba5bcbb8" alt="" width="563"><figcaption></figcaption></figure>

{% stepper %}
{% step %}

#### Reward

Set **Subscription products per reward** to the number of products that earns a reward, and **Points awarded** to the points paid each time.

For 100 points on every third product, that is `3` products and `100` points.

Then set the **Display name** and **Description** customers see in the storefront loyalty widgets, for example *Loyal subscriber reward* and *Earn 100 points for every 3 subscription products ordered*.
{% endstep %}

{% step %}

#### Counting

**Count orders placed on or after** sets the date counting begins. Orders placed before it are never counted.

You can choose today or a future date. An existing rule keeps whatever date it was saved with, but once you change that date you cannot set it back to an earlier one.
{% endstep %}

{% step %}

<figure><img src="https://393112916-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJ8asLD4FVCFagK40xEr4%2Fuploads%2F8XgcF2prbaMWESsFu89u%2FScreenshot%202026-10-16%20at%201.11.20%E2%80%AFPM.png?alt=media&amp;token=cc2c081e-522b-4890-bb55-ee34ceab207d" alt="" width="563"><figcaption></figcaption></figure>

#### Icon

Choose **Use default icon**, or **Upload your own icon** for the storefront tile.
{% endstep %}

{% step %}

#### Membership tier eligibility

Leave this empty to allow all customers, or select tiers to restrict the reward to those members only.

Read the tier rule below before you use it, because it behaves differently from the other ways to earn.
{% endstep %}

{% step %}

#### Check the Summary and activate

The **Summary** panel on the right restates the rule in plain English, including the counting date and the refund behaviour. Read it back before you go live, it is the quickest way to catch a reward you did not mean to configure.

Set **Status** to **Active**, and **Storefront widget display** to **Visible** or **Hidden**. A hidden earner still awards points.
{% endstep %}
{% endstepper %}

### How the count works

The count is the total number of subscription product units a customer has bought since the counting date, added up across every subscription they hold.

A reward is paid each time that count reaches the next multiple of your **Subscription products per reward** setting. At `3`, that is 3, 6, 9 and onward.

Two things follow from counting this way:

* **Extra products carry forward.** The count never resets. A customer who buys 4 products is paid once, at 3, and starts the next reward one product in.
* **One order can pay more than one reward.** A count that goes from 2 to 8 passes 3 and 6, and both rewards are paid on that order.

On the customer's loyalty record you will see both their lifetime subscription product count and the count since the rule's counting date. For a customer who joined after you switched the rule on, these are the same number.

### Tier eligibility is judged before the order

If you restrict this reward by tier, eligibility is decided on the tier the customer held **before** the order was placed, not the tier they end up in afterwards.

So an order that promotes someone into an eligible tier does not itself earn the reward. Their next qualifying purchase does.

{% hint style="info" %}
Products bought while the customer was in an ineligible tier **still count** toward their total. They are not earning yet, but they are not starting from zero either.
{% endhint %}

This is worth explaining to customers if you run a tier-restricted version, because it is the one part that reliably generates a support ticket.

### Refunds and cancellations

Refunded and cancelled products do not count, so a refund or cancellation reduces the customer's count.

If that takes the count back below a reward you have already paid, those points are taken back. If no reward had been paid at that point, nothing is taken back.

### What the loyalty timeline shows

Every outcome is written to the customer's loyalty timeline, with the counts spelt out so you can see exactly what happened:

* **Earned** — the points paid and the products that triggered them, with the order and the count before and after, for example *Order #2406 took subscription products purchased from 4 to 7. Rewarded every 3 purchased.*
* **Not earned** — when the customer's tier was not eligible, the entry says so and confirms the purchases still counted.
* **Reward removed** — names the refund or cancellation, the count before and after, and the reward the points had been paid for.
* **Nothing to remove** — logged when a refund drops the count but no reward had been paid at that point.

Point History shows the same thing in the **Details** column, as a reward against a product count, and as a reversal where points were taken back.

### Related guides

* [Ways to earn points: overview](/loyalty-and-rewards/points-and-ways-to-earn/ways-to-earn-points-overview.md)
* [Reward subscribers with loyalty points](/loyalty-and-rewards/points-and-ways-to-earn/reward-subscribers-with-loyalty-points.md): the tag-based alternative, for rewards this earner cannot express
* [Award points for placing an order](/loyalty-and-rewards/points-and-ways-to-earn/award-points-for-placing-an-order.md)
* [Understanding a customer's loyalty timeline](/loyalty-and-rewards/customer-management/understanding-a-customers-loyalty-timeline.md)
* [Managing point adjustments post-fulfilment](/loyalty-and-rewards/points-and-ways-to-earn/managing-point-adjustments-post-fulfilment.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.roadmap.so/loyalty-and-rewards/points-and-ways-to-earn/award-points-for-subscription-purchases.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
