Magentoにはいろいろな条件式を組み合わせて、オリジナルのクーポンや値引きを行うことができる機能が備わっています。
英文だと、「Catalog Price Rule」「Shopping Cart Price Rule」で、日本語訳では「カタログ価格ルール」「クーポン」としています(注:時期・訳者によって訳が異なる事があります)。

さて、今回はこの2つの機能のうち、「Shopping Cart Price Rule」つまりはクーポンについてです。

2種類のクーポン

クーポンには2種類あります。「自動適用クーポン」と「特定クーポン」です。
使用できる条件式はどちらも同じで、実施できる値引き施策も以下のものが使用できます。

  • カートの中にある商品すべて、または所定のルールに基づいた対象商品に対する値引き
  • 送料の無料化
  • 送料に対する値引き

自動適用クーポン

自動適用クーポンは、カートの中にある商品の組み合わせ、あるいは小計額が所定の基準を満たした場合に適用されます。
自動的に適用されるため、顧客はわざわざクーポンコードを入力する必要がなく、条件が満たされた際に自動的に値引きが行われます。 

特定クーポン

特定クーポンは、サイトの管理者がクーポンのコードを決めます。
自動適用クーポンと異なる点としては、ショッピングカートでクーポンコードを入力して、明示的に顧客が使用するアクションをしなければならないところが自動適用クーポンとは異なります。 

クーポンコードの自動生成

Magento Community Edition 1.7およびEnterprise Edition 1.12以降では、1つの特定クーポンに対して複数のクーポンコードを枝番として生成することができます。

自動生成の例

紙媒体やフラッシュマーケティングサービスでクーポンを配布する際には、この機能は重宝すると思いますので、うまく活用していただきたいと思います。

1つの注文に対してクーポンはいくつまで利用できるか

1つの注文に対して適用できるクーポンは、原則1つです(Magento標準の状態です。エクステンションを入れると変わります)。
これはクーポンコードを入力すると、他のクーポンコードはすでに適用しているクーポンコードを解除しない限り使用できないからです。
ですがこれはクーポンコードを入力する、つまり特定クーポンの場合に限られます。

自動適用クーポンと特定クーポンの併用

自動適用クーポンと特定クーポンは併用ができます。
自動適用クーポンにはクーポンコードが存在しないので、自動適用クーポンを適用しながら、クーポンコードを適用するということができるのです。

データベース上の構造

データベース上では、クーポンコードはsales_flat_quoteテーブルの、coupon_code列に格納されます。
ここからsales_flat_orderテーブルなどにデータのコピーが行われます。この列はvarchar(255)で定義されているので、255文字まで格納できます(裏を返せばクーポンコードは255文字まで、ということになります)が、前述のとおり、標準の状態では1注文につき、1クーポンコードしか使用できません。

これとは別に、sales_flat_quoteテーブルにはapplied_rule_ids列が用意されていて、ここにはカート情報に対して適用されている、全てのクーポンのIDが格納されます。

この仕組みによって、自動適用クーポンと特定クーポンの併用は実現されているのです。

注意すべきこと

自動適用クーポンと特定クーポンが併用できることはわかりました。
ここで併用する際に注意するべきことについて説明します。

クーポンには「ラベル」という設定項目があります。ラベルを設定しておくと、クーポンコードの代わりに合計行に表示されます。

クーポンのラベル

上の例では、特定クーポンと自動適用クーポンを併用しています。
どちらにもラベルを設定してあるので、適用されている両方のクーポンのラベルが表示されています。

ここで自動適用クーポンが適用されていることを顧客に知らせないようにするために、自動適用クーポンのラベルを消去してみます。

自動適用クーポンのラベルを空白に

そうすると、奇妙な現象が起きます。

正しくない適用結果

自動適用クーポンは確かに表示されなくなったのですが、表示が正しくありません。
テストクーポンのクーポンコードである「testcoupon」が画面に出ています。

この現象は、Magento Community Edition 1.8で確認しました。Magento Enterprise Edition 1.11でも観測しているので、少なくともMagento Community Edition 1.6以降(Enterprise Editionは1.11)の全てのバージョンにある問題です。

原因としては、

  • 自動適用クーポンにクーポンコードがない
  • 自動適用クーポンにラベルがない
  • 特定クーポンが適用されている

ことが挙げられます。

Magentoはsales_flat_quoteテーブルにあるapplied_coupon_idsのデータと、coupon_codeを比較しながら、クーポン割引行を生成していくのですが、ラベルが空欄の場合は、sales_flat_quoteに入っているcoupon_codeのデータを使用するのです。

そのため、自動適用クーポンと特定クーポンを併用し、かつ自動適用クーポンのラベルが空欄の場合はこのような現象が発生します。
今回の例では1つの自動適用クーポンと特定クーポンの組み合わせによる結果を紹介しましたが、自動適用クーポンは複数同時に適用することができるので、2つの自動適用クーポンと特定クーポンの組み合わせの場合は更に変な結果になる可能性があります。

終わりに

Magentoのプロモーション機能は非常に強力で、かつ柔軟な機能です。
ですが、クーポン機能においては、このエントリで説明したような現象が起こることがあります。
プロモーション担当の方のご要望や、現場でどうしても、ということであればこの問題の改修は可能です。
将来的には改修されると思いますが、未対応バージョンをお使いの方は、お問い合わせいただければにて対応ができます。