How to set up Subscriptions in your v4 App and what works well

Why did we build this?

Subscriptions are increasingly popular and embraced by consumers in the mobile app space ecosystem.  A successful subscription business line requires good perceived value and a strong brand trust with your customers. 

We built this in v4 because many of clients have now built a significant user base and returning users, and our apps have been scoring an NPS in the high 50’s.  Analytics shows that users of our white label apps create at least 3-4 products year, with a 60% conversion for photobooks from start to add-to-cart.  These users are ready for something convenient and recurring.  Hence subscriptions are timely in the product evolution.

Most of the code for subscriptions are really in the back-end ecommerce, shopping cart flow and payment logic and all the ensuing supporting features like in-app messaging, emails and a new screen in the side pull-out menu which lists all subscriptions. 

This product post will outline all the features and subscription models you can sell through your white-label app.

FAQs

The Attribute: Subscription property called “Cycle” sets the frequency of adding product Entitlements to a user’s account.  A “book every month” means the “unit” is month, and “value” is 1.  Two types of time units are supported: Year & Month.  So you can even do Quarterly or Bi-monthly cadences, though that might be confusing for most users.  This is NOT to be confused with Payment Periods (see next)

The Payments cycle is how often the user’s credit card will be charged for this subscription.  Two units: Year and Month are supported. 

This cycle can be totally independent of the Product Cadence above.  So you can give out 30 prints monthly, but the user pays annually (auto-renews every year)

There is a CANCEL button on the Subscription Panel which lists all subscriptions past and present.  It requires a double confirmation, but takes immediate effect.  If you cancel in the middle of a Period, your entitlements remain intact until the end of the current period.

In it’s current iteration, the minimum “term” is ONE cycle of payment period. (since we want to avoid any refunds)

So a Monthly Book Plan paid monthly can be cancelled even in the 2nd month without any penalties.  So you can freely advertize “Cancel in-app anytime”.

For plans paid annually, then the “period” is one year, and hence that is the minimum.  So if you signed up for 50 prints every month, for a $30 annual fee, and cancelled on Day 2, you will continue to get the 50 prints every month (and all relevant notifications) until 12 periods is up, at which time, we will not auto-renew and charge your credit card.

“Rollover” credits is a popular mechanism in mobile phone data plans, where unused mobile data credits are accumulated and added onto the next month’s allowance.  We DO NOT support this.  This is a conscious decision after gathering feedback from the the Finance departments of our larger clients, who do not want to keep unused entitlements on the balance sheet as a Liability.

Whatever is paid and credited will remain.  The only effect of any Cancellation of an ongoing subscription is that the next payment cycle (and product crediting cadence) will no longer occur.  

Whatever credits you have will remain (until the current period, whether it’s a month or year) ends, by which time, all unused product entitlements will disappear.  (because no “rollover”)

Conversely, there is no “refund” of unused credits.  If you have a 30 prints per month, for an annual fee of $30, and you cancel in Month 2, you will continue to be entitled to 30 prints for 11 more months, whether you want it or not!

If the user has an active subscription (say 30 prints per month) and he goes to the Prints category to buy prints which are covered by this subscription, he will see it as a “Subscription Discount” in his shopping cart.  This will be applied first before any other promotional coupons (if applicable).

He can also go to his Subscriptions screen (from the side menu) and start from there.  Each subscription will be listed (even if cancelled mid-cycle) and it will detail what products are included in that subscription plan.  From the CTA in that screen, he will then go to select photos.

Examples of Possible Subscription Models

Pay $30 a year, and get 30 prints each month.  Users can redeem this value anytime during that month (like first order 20, then order another 20)  the 2nd 20-pcs he orders, he will only be charged for 10 (because 30 is “free”).  No “rollover”.  Account gets topped up to 30 prints each renewal cycle.  

Users will pay a flat rate of (say) $10 per month, which gets them a 24 page softcover 8×8 book.  (you need to define a particular product “model”).  Users will be billed monthly, and a new entitlement of the 24pp book is credited each month.  User it or lose it.

Inspired by Amazon Prime membership.  Customers pay a “annual membership fee” to get free shipping year round, and perhaps an extra X% discount off rack rates, including if they peruse any coupons in the cart.  The % is applied on the MSRP (not the balance after applying the coupons).  so a 30% coupon and a 20% prime membership gets you 50% off the product price. 

The system also allows you to define a range of products by naming the Category that they belong to. (like all Prints, which would include all your 4×6, 5×7…thru to 8×10 and retro prints) 

The “Free Prints” model gives out free prints (just pay shipping) without any committed recurring payment.  To achieve this, you can get users to sign up for a $0 subscription to receive 20 free prints every month.  You then set shipping price to reasonably cover your cost.  

Setting up a Subscription Plan in your Dashboard

A Subscription Plan is set up in OC as a “Product” in itself.  It will then be displayed like any other products, with its own SubCats, displayTypes etc.  You will add a new Attribute that was introduced in v4.0 named “subscription” (singular!) and the existing “prices” attribute now also has some new properties, namely a “cycle” which is defined by a few parameters.  

Within this subscription “product”, it’s “subscription” attribute, will then reference the actual SKU item or items (“model-id”) or array of applicable products included in this Plan. 

Pertinent attributes of the root product (“model”), for example, the price for each 4×6 print, or “extraCostPerPage” in the case of photobook are defined within those product’s JSON (as it has always been).

Hence if the Subscription plan calls for 100 4×6 prints that month, but user ordered 150 prints, then he will only be charged for the extra 50 prints at the prevailing per-print price defined in the print product.

The example below is for a 100 photos per month top-up cadence, with an annual payment of $50.

EXAMPLE: Pay $50/yr and get 100 prints every month

				
					// ATTRIBUTE: PRICES
// defines payment amt and cycle, 
// not necessarily in sync with 
// product delivery cadence

[
    {
    "name":"Default", 
    "amount":1,
    "thumbnail":"Default.jpg",
    "price":50,
    "cycle":
        {
        "value":1,          
          // defines billing cycle
        
        "interval":"year",  
          //"year" or "month"
        
        "text":"Annually"   
          //short-text for display
        }
    }
]
				
			
				
					// ATTRIBUTE: SUBSCRIPTION
// defines what product, 
// and its delivery cycle 

{
  "products":
  [
  "4x6 classic print"
    // "model-id" 
    // can be array
    // of multiple
    // or a category
  ],
  
  "expiry": 12,
    // how many repeats
    // of the "cycle:unit"
    // for each payment period
    // in "attribute:prices"
    
  "expiryText": "1 year",
    // text for display
  
  "value": 
    {
    "amount": 100,
    "type": "quantity",
      // "quantity"= units 
      // "percentage"= % discount
      // "fixed" = absolute $ amount off
      
    "freeShipping": [],
      // define what type of 
      // Shipping method is free
      // empty array [] means
      // no free shipping
      
    "cycle": 
        {
          "value": 1,
          "unit": "month",
          "text": "Monthly"
        }
    }
}
				
			

EXAMPLE: Join the Book Club and get a 24-pp A4 book (MSRP $14.99) for only $9.99 each month

Here we have a 24-page softcover A4 landscape book listed in its product JSON as $14.99 for the basic 24-page.  For a payment of $9.99 every month, you get this book with free standard untracked shipping.  (Premium Shipping, if available for this product, is payable with no deductions.  Payment cycle is monthly of $9.99.

The typical “prices” attribute for a book SKU already defines the base price of $12, and the extra page costs beyond 24 would be in the “extraCostPerPage”, (this book is set up (not shown below) as 50 cents per extra page ) which is then chargeable if actual book ordered in this subscription exceeds the 24-page basic SKU unit. (the 24 min. page is defined in the product SKU in GPS). 

Hence a 64-page book will check out at the cart at $20. ($0.50 x 40; initial 24 pages included in the subscription plan if untracked shipping is chosen).  The $9.99 subscription plan price is already charged to the credit card on file some days before user ordered the actual book, on a different cadence (as defined in “prices”), and is NEVER added as part of a product shopping cart.

P/S: in this example, the “expiry” of 12 really has no effect, since payment is monthly, and we do not define a minimum term of 12 months.  So this user can cancel on the 2nd month and is not forced to keeping paying for 12 months and be inundated with a product she no longer wants.  We added the “expiry” property in anticipation of future enhancements which may enable us to enforce a minimum term if desired.

				
					// ATTRIBUTE: PRICES

[
{
    "name":"Default",
    "amount":1,
    "thumbnail":"books-subscription.jpg",
    "price":9.99,
    "cycle":
    {
        "value":1,
        "interval":"month",
        "text":"Monthly"
    }
}
]
				
			
				
					// ATTRIBUTE: SUBSCRIPTION

{
  "products": 
  [
    "soft-a4-landscape-24pp"
  ],
  "expiry": 12,
  "expiryText": "1 year",
  "value": 
  {
    "amount": 14.99,
    "type": "fixed",
    "freeShipping": ["untracked"],
    "cycle": 
    {
        "value": 1,
        "unit": "month",
        "text": "Monthly"
    }
  }
}
				
			

The observant keen learner would have figured out that an alternative way of setting up this Book Club subcription plan would be to set “amount”: 1, “type”:”quantity”. (which means ONE base 24pp book is the value given free) instead of deducting a “fixed” “amount” of $14.99 from the cart price.  Both will give the same effect.

Important

Photobooks are perculiar in that it has a variable price due to variable pages.  Photobooks in our systems are defined with a “base” price for the first 20 or 24 pages (typically, but this is up to you).  And then there is a price property called “extraCostPerPage“.

In subscriptions, the stated discount will always ONLY apply to the base unit product (ie: the base Price)  and NOT to the value stated in “extraCostPerPage”.

EXAMPLE: if you create a subscription plan of $10 payable every month, and get a 20-page 6inch softcover, and $1 per page thereafter, then you would set it up with a 100% “discount” to that book.  

If the book is 30 pages, then user pays $10 (for the extra 10 pages).

So it does not matter if the “price du jour” is $25 or $19.99 (during promo weeks).  The Subscriber will always get the entire base book “FREE” and pay the prevailing “extraCostPerPage” for any additional pages.

EXAMPLE: Get 10 free prints each mth. Just pay shipping.

This model was made famous by the Free Prints app.  First (not shown below) you should define the 4×6 print SKU separately as one which is meant for the free-print plan.

In this product definition, you will define the fixed shipping as (say), “$4.99” untrack shipping and also the per page cost as $0.50 (say)

Then in the subscription plan, it’s a $0 plan (hence line 8 in attribute:prices is “price” = 0)

It never expires, hence “expiry” is 0 (line 8).  You are giving away 10 units of prints, so its “type”: “quantity” and “amount”: 10.

So on any given month, if the customer chooses 30 photos, he will have a cart value of $4.99 (shipping) + $10 for the extra 20 photos @ $0.50 ea.

				
					// ATTRIBUTE: PRICES

[
{
    "name":"Default",
    "amount":1,
    "thumbnail":"free-prints.jpg",
    "price":0,
    "cycle":
    {
        "value":1,
        "interval":"month",
        "text":"Monthly"
    }
}
]
				
			
				
					// ATTRIBUTE: SUBSCRIPTION

{
  "products": 
  [
    "free-print-4x6-gloss"
  ],
  "expiry": 0,
  "expiryText": "Always free",
  "value": 
  {
    "amount": 10,
    "type": "quantity",
    "freeShipping": [],
    "cycle": 
    {
        "value": 999,
        "unit": "month",
        "text": "Monthly"
    }
  }
}