Skip to content
  1. Extras
  2. msPromoCode2
  3. Cases
  4. Generate promo code in email for next order

Generate promo code in email for next order ​

Since 1.1.12 there is method mspc2Manager::generateCoupon that generates a promo code with a given format and parameters. This simplifies generating coupons with unique codes.

Step 1 ​

Create snippet generateCoupon with this code:

php
$mspc2 = $modx->getService('mspromocode2', 'msPromoCode2',
    MODX_CORE_PATH . 'components/mspromocode2/model/mspromocode2/');
$mspc2->initialize($modx->context->key);
$manager = $mspc2->getManager();

$order_id = (int)$modx->getOption('order', $scriptProperties) ?: 0;
if (empty($order_id)) {
  return 'Specify order id.';
}

// First try to find an already generated promo code for this order
if ($couponObj = $modx->getObject('mspc2Coupon', ['properties LIKE "%\"prev-order\":' . $order_id . '%"'])) {
  $coupon = $manager->getCoupon((int)$couponObj->get('id'));
}

// Promo code not found
if (empty($coupon) || !is_array($coupon)) {
  // Promo code format as regex-like syntax
  $format = '[a-zA-Z0-9]{12}';

  // Promo code parameters
  $data = [
    'list' => 'for-next-order', // Promo code "List" field
    'count' => 1, // How many times the generated promo code can be applied
    'discount' => '10%', // Discount for generated promo code
    'description' => 'Discount on next order', // Promo code description

    // Config
    'showinfo' => true, // Show warnings
    'oneunit' => false, // Per product unit
    'onlycart' => true, // Only in cart
    'unsetifnull' => false, // Don't apply without discount
    'unsetifnull_msg' => '', // Unset message
    'oldprice' => false, // Without old price

    // Validity
    'lifetime' => strtotime('1 month'), // +1 month in seconds

    // Save order id in properties
    'properties' => [
      'prev-order' => $order_id,
    ],
  ];
  $coupon = $manager->generateCoupon($format, $data);
}

return $coupon;

Step 2 ​

In the email chunk where you want to generate a promo code for the customer (e.g. tpl.msEmail.paid.user), call the snippet and output the coupon data:

fenom
{extends 'tpl.msEmail'}

{block 'title'}
  {'ms2_email_subject_paid_user' | lexicon : $order}
{/block}

{block 'products'}
  {var $newCoupon = ('!generateCoupon' | snippet: [
    'order' => $order.id,
  ])}
  {if ($newCoupon is not empty) && is_array($newCoupon)}
    <div style="margin: -10px 20px 40px;">
      We've generated a special promo code -{$newCoupon.discount} for your next purchase:
      <span style="display: inline-block;background: #ffecec;padding: 4px 4px;border: 2px solid #ff4f50;border-radius: 4px;font-size: 18px;line-height: 1;">
        {$newCoupon.code}
      </span>.
      Enter it in the cart on your next order to get a personal discount.
      {if $newCoupon.stoppedon?}
        <br>Valid until {$newCoupon.stoppedon | date : 'd.m.Y H:i'}
      {/if}
    </div>
  {/if}

  {parent}
{/block}

It will look like this: