生地を 10cm 刻みで売りたい、床材を必要な面積ぶんだけ売りたい、コーヒー豆をグラムで売りたい。実店舗では当たり前の「量り売り」も、Shopify のネットショップでやろうとすると、とたんに難しくなります。Shopify の商品は、バリエーション 1 つにつき価格を 1 つしか持てないからです。
この記事では、当社 UnReact が開発した Shopify アプリ「シンプル量り売り|入力寸法・重量での価格自動計算・追加料金」を、管理画面の画面・タブ・設定項目を 1 つずつたどりながら解説します。インストールの手順だけでなく、設定を変えると商品ページの何が変わるのか、画面には出てこない制約は何か、といった運用で効いてくる部分まで書いています。
導入を検討している方は「メリット」「デメリット」「料金プラン」を、すでに使っている方は「各画面の説明」から読み進めてください。
シンプル量り売りを一言でいえば、「量を入力する欄」と「その量から決まる請求額」を商品ページとチェックアウトの両方に用意するアプリです。サイズ違いのバリエーションを並べる代わりに、計算のルールを 1 本持たせます。
動き方を、マーチャント側とお客様側に分けて見ると分かりやすくなります。
肝心なのは 3 つ目です。商品ページの金額は、お客様に見せるための試算にすぎません。請求に使う額は、ブラウザから届いた数字を信じず、Shopify の側で毎回作り直しています。お客様が動かせるのはサイズの値だけなので、金額だけを書き換えて安く買う、ということはできない作りです。

相性がよいのは、長さや面積に比例して値段が決まる商品です。たとえば次のような売り方が当てはまります。
サイズごとの価格をバリエーションで表すと、「1m」「1.1m」「1.2m」…と組み合わせが膨らみ、価格改定のたびに全部を書き換えることになります。シンプル量り売りでは、商品にはルールを 1 本割り当てるだけです。単価を変えたいときはルールを 1 か所直せば、割り当てた全商品に反映されます。
「単価 × 量」の単純な計算だけでなく、たくさん買うほど単価が下がる「数量帯別の単価」、幅と丈の組み合わせで値段が決まっている「価格表」も選べます。オーダーカーテンのように、すでに紙のサイズ表で値段を決めているストアは、その表を貼り付けるだけで移行できます。
前の章で書いたとおり、請求額はチェックアウトの時点で Shopify 上で計算し直されます。テーマの JavaScript だけで価格を作る方法では、この保証は得られません。量り売りの価格を自作しようとしてつまずくのは、たいていここです(後半の「コードで自作する場合」で詳しく説明します)。
管理画面は日本語を含む 20 言語に対応しています。商品ページに出る案内文(合計、カートに追加、入力範囲の表示など)も、お客様が見ている言語に合わせて 20 言語で表示されます。坪や匁のような日本の単位も選べます。
導入前に知っておいてほしい制約も、正直に書いておきます。どれも Shopify 側の仕様に由来するもので、アプリの設定では回避できません。
料金は 1 プランだけです。
計算ルールの数や、割り当てられる商品の数による追加料金はありません。プランは Shopify App Store の掲載ページから確認できます。

インストールは、ほかの Shopify アプリと同じ流れです。



インストールが終わると、価格を計算し直すための Shopify Functions がストアに自動で登録されます。マーチャントが操作する必要はありません。
アプリの管理画面は、大きく 2 つに分かれています。
商品ページに入力欄を出すまでの流れは、「計算ルールを作る → 適用する商品を選ぶ → テーマに入力欄を置く」の 3 手順です。インストールしただけでは、ストアの見た目は何も変わりません。

ここからが本題です。管理画面の画面とタブを、1 つずつ説明します。
アプリを開くと最初に出る画面です。作ったルールが 1 行ずつ並び、次の列で中身を見比べられます。
右上の「計算ルールを作る」から、新しいルールの作成画面に進みます。
一覧の上には、状況に応じて案内のバナーが出ます。これは見落とすと売上に響くものばかりなので、出ていたら必ず目を通してください。
一覧の各行の右端にある「…」を押すと、3 つの操作が出ます。

「商品に反映し直す」があるのは、ルールの中身が商品 1 つずつに書き込まれる作りだからです。チェックアウトで価格を計算する Shopify Functions は、計算に使うルールを商品から直接読みます。そのため、コレクションに商品を足しただけでは、その商品にはまだルールが届いていません。
ルールの編集画面は「基本設定」「価格の決め方」「入力できる範囲」「適用する商品」の 4 タブ構成です。どのタブにいても、画面の右側にはプレビューが出ています。

プレビューには、いま入力している設定のまま、お客様に見える入力欄と金額が出ます。保存する前に金額を確かめられるので、数量帯の境目や最低金額の効き方は、ここで数字を変えて試すのがいちばん早い方法です。
新しく作る画面には、生地を想定した初期値(長さ・cm で入力・m 単価)が最初から入っています。ルール名と単価を直せば、そのまま生地用のルールとして使えます。
何を、どの単位で、どう測るかを決めるタブです。

本数の入力欄を表示するをオンにすると、同じサイズをまとめて買うための「本数」の欄が出ます。初期状態はオフです。

本数の欄を出さない場合、カートでは数量ボタンが隠れるので、お客様は同じサイズを買い足すときにもう一度カートに入れることになります。本数は購入数を制限する機能ではありません。
いくらで売るかを決めるタブです。「計算方式」で 3 つから選び、選んだ方式によって画面が変わります。最初は、いちばん基本の「単価 × 量 + 基本料金」です。

「単価」の出どころを 2 つから選べます。
「商品の価格を使う」は、柄や色ごとに単価が違う商品を大量に扱うストアのための選択肢です。生地を 200 柄扱っていても、各商品の価格に 1m あたりの単価を入れておけば、ルールは 1 本で済みます。

この方式を選ぶと、単価の欄が消えて「プレビュー用の商品価格」の欄が出ます。試算のための金額で、ルールには保存されません。
ひとつ注意があります。この方式では、テーマが商品ページに表示する価格は「1m あたり」の額になります。お客様が合計と取り違えないよう、後で説明する「テーマ標準の価格・購入ボタンを隠す」設定を必ず入れてください。また、価格が 0 のバリエーションがある商品に割り当てると、0 円で買えてしまいます。アプリは割り当てたときと保存したときに、該当する商品を名指しで知らせます。
量が多いほど単価が下がる売り方です。「この量まで」と「単価」の組を、量の小さい順に並べます。

保存できない並びのときは、表の下に赤字で理由が出ます。「上限なしの区間は 1 つだけにしてください」「区間の上限は昇順にしてください」のように、何を直せばよいかがそのまま書かれています。
幅と丈の組み合わせごとに価格が決まっている商品向けの方式です。基本設定タブで、量の種類を面積、入力のさせ方を「寸法を入力して掛け合わせる」にしたルールでだけ選べます。

9,500 バイトという上限は、画面からは理由が見えにくい制約です。ルールは商品に書き込まれ、チェックアウトの計算はそれを読みます。Shopify Functions が読める商品のデータは 1 件 10,000 バイト未満と決まっているため、そこから逆算した上限になっています。行と列が多すぎるときは、刻みを粗くするか、商品を分けてください。
3 つのどの方式を選んでも、タブの下に次の 3 項目が並びます。
計算は「量を販売単位に合わせる → 単価を掛ける → 基本料金を足す → 最低金額と比べる → 通貨の最小単位に丸める」の順に進みます。Shopify のディスカウントコードや自動割引は、こうして決まった金額に対して普段どおり効きます。
お客様が入力できる値を絞るタブです。単位はすべて「買い手が入力する単位」です。


お客様が入力欄から離れた時点(Enter やカートに追加を押したときも含みます)で、入力欄の値は丸めた後の値に書き換わります。注文に残るのも丸めた後の値なので、「123cm と入れたのに 130cm で届いた」という食い違いは起きません。商品ページの入力欄の下には「50 cm〜3000 cm / 10 cm 単位」のように、範囲と販売単位が自動で表示されます。
販売単位を入数として、個数で販売するは、床材やタイルを箱で売るための設定です。

この設定は、「量をそのまま入力してもらう」・販売単位の設定・「単価 × 量 + 基本料金」の 3 つがそろったときだけ表示されます。

どの商品にルールを効かせるかを決めるタブです。


一覧は最初の 10 件だけが表示され、残りは「すべて表示」で開きます。削除された商品は「見つからない商品」として残るので、✕ で外しておきます。外す操作も、追加と同じく「保存する」を押すまで反映されません。
コレクションで割り当てたときは、保存した時点でそのコレクションに入っている商品にだけ設定が書き込まれます。あとからコレクションに足した商品には自動で届かないので、編集画面に「設定が反映されていない商品が ◯件あります」と出たら、一覧の「商品に反映し直す」を押してください。反映されていない商品には入力欄が出ず、通常の価格で買われてしまいます。
このタブでは、価格が 0 の商品(商品の価格を使うルールのとき)と、定期購入が設定された商品にも警告が出ます。
入力に不備があると、保存を押しても「入力内容を確認してください」と出て保存されません。このとき、不備のある最初のタブに画面が自動で切り替わり、不備のあるタブの名前には件数が付きます。

4 つのタブのうちどこに問題があるかが件数で分かるので、タブを 1 つずつ開いて探す必要はありません。
テーマへの追加と、管理画面の表示言語を決める画面です。

画面の下には、アプリを削除するときの注意も書かれています。アプリを削除すると価格の計算が止まり、お客様のカートに残っている商品は通常の価格に戻ります。削除するなら、注文の少ない時間帯を選んでください。テーマに置いた入力欄はテーマ側に残るので、テーマエディタから外します。
テーマエディタで設定するものは 3 つあります。
設定画面の「テーマに追加」が置くのは、商品ページのブロックだけです。「デフォルトの商品」テンプレートに、新しいアプリのセクションとして追加されます。購入ボタンのすぐ近くに置きたい場合や、商品によって別のテンプレートを使っている場合は、テーマエディタで手動で置きます。
このブロックは、ルールを割り当てていない商品では何も表示しません。テンプレートに 1 つ置いておけば、ルールを割り当てた商品にだけ入力欄が出ます。
カートページのブロックは、カートテンプレートで「ブロックを追加」から置きます。


カートドロワー(カートアイコンを押すと横から開くカート)にはブロックを置けません。そこで埋め込みアプリの「共通スクリプト」をオンにしておくと、ドロワーの量り売りの行では数量ボタンの代わりに「サイズを変更」リンクが出て、カートページの入力欄へ案内します。


カートページにブロックが置かれていないストアでは、共通スクリプトはドロワーに何も足さず、数量ボタンもそのまま残します。リンクを出しても、飛んだ先でサイズを変えられないからです。
商品ページのブロックを選ぶと、テーマエディタの左側に設定が並びます。

表示に関わる設定は次のとおりです。
最後の項目は、量り売りでは必ず入れてほしい設定です。テーマの購入ボタンが残っていると、お客様がサイズを入れずにカートへ入れてしまうことがあります(その場合はチェックアウトで止まり、商品ページで入れ直すよう案内が出ます)。Horizon テーマなら、価格・購入ボタン・追従する購入ボタンをまとめて隠すセレクタは次のとおりです。
main product-price, main .buy-buttons-block, sticky-add-to-cart
テーマによってクラス名は違うので、ほかのテーマではブラウザの検証機能で価格と購入ボタンの要素を確かめて書き換えてください。隠れるのはルールを割り当てた商品だけで、ほかの商品ページはそのままです。

デザイン設定は次のとおりです。
テーマに合わせたいなら、背景色と文字色は空欄のまま試し、ボタンの色と強調色だけをブランドカラーに寄せるのが手早い方法です。

追加のCSS には、デザイン設定で足りない部分を CSS で書けます。書いた CSS はこのブロックの中だけに効くので、テーマのほかの部分は崩れません。
設定を終えた商品ページは、次のように見えます。幅と丈を入力するカーテンでは、「価格表を見る」を開くと、入力したサイズのセルが強調されます。

アプリストアの掲載画像でも、設定ごとの見え方を確認できます。




アプリを使わずに量り売りを作ることもできます。ただし、どこまでをテーマのコードで書けて、どこからが書けないのかを知っておくと、判断を誤りません。
まずは、長さを入力すると金額が出て、そのサイズを注文の明細に残す部分です。商品テンプレートに次のような Liquid を足すと、入力欄と金額の表示ができます。単価は商品のメタフィールド(ここでは custom.price_per_meter)に入れておく想定です。
{% assign unit_price = product.metafields.custom.price_per_meter.value | default: 0 %}
<div class="measure-box" data-unit-price="{{ unit_price }}">
<label for="measure-length">長さ (cm)</label>
<input id="measure-length" type="number" min="50" step="10" value="100">
<p>合計: <span class="measure-total"></span></p>
<input type="hidden" form="{{ 'product-form-' | append: section.id }}"
name="properties[長さ (cm)]" class="measure-property">
</div>
ここでは、入力欄のほかに、フォームと結び付けた hidden の入力を置いています。properties[...] という名前の値は、カートに入れたときに明細の項目として残るので、注文管理の画面で「長さ (cm): 250」と確認できます。
次の JavaScript は、入力のたびに金額を計算し、hidden の入力にも同じ値を写します。
document.querySelectorAll('.measure-box').forEach((box) => {
const unitPrice = Number(box.dataset.unitPrice);
const input = box.querySelector('#measure-length');
const total = box.querySelector('.measure-total');
const property = box.querySelector('.measure-property');
const update = () => {
const meters = Number(input.value) / 100;
total.textContent = (unitPrice * meters).toFixed(2);
property.value = input.value;
};
input.addEventListener('input', update);
update();
});
cm で入れてもらった値を 100 で割って m に直し、単価を掛けています。ここまでで、見た目は量り売りの商品ページになります。
問題はここからです。上のコードは金額を表示しているだけで、カートに入る価格は商品の元の価格のままです。JavaScript からカートの価格を書き換える方法はなく、表示と請求が食い違います。
請求額を変えるには、Shopify Functions の Cart Transform を書いて、アプリとしてストアに登録する必要があります。考え方を最小限のコードにすると、次のようになります。カートの行ごとに明細の長さを読み、1 行をその価格の行として置き換えます。
export function cartTransformRun(input) {
const operations = [];
for (const line of input.cart.lines) {
const length = Number(line.lengthCm?.value);
const unitPrice = Number(line.merchandise.product?.pricePerMeter?.value);
if (!length || !unitPrice) continue;
operations.push({
lineExpand: {
cartLineId: line.id,
expandedCartItems: [{
merchandiseId: line.merchandise.id,
quantity: 1,
price: { adjustment: { fixedPricePerUnit: { amount: (unitPrice * length / 100).toFixed(2) } } },
}],
},
});
}
return { operations };
}
Function は、カートの中身を読むための問い合わせ(入力の定義)と組み合わせて動きます。上のコードでは、明細の「長さ」と、商品の単価のメタフィールドを入力として受け取り、lineExpand でその行を計算した価格に置き換えています。
ただし、これは考え方を示すための骨組みです。実際に運用するには、少なくとも次のことが必要になります。
テーマのコードは数十行で書けますが、請求額を正しくするところから先は、アプリの開発そのものです。シンプル量り売りは、ここに挙げた検査と制約への対応をすべて組み込んだうえで、管理画面から設定できるようにしています。量り売りを始めたいだけなら、自作の保守を抱えるより、アプリを入れるほうが早くて安全です。
量り売りのアプリを探していると、Ex Custom Price Calculator、EC Price Calculator by Measure、Apippa‑Custom Price Calculator、M Custom Size Price Calculator といった、サイズ入力付きの価格計算アプリも候補に挙がります。ここでは、それらを含む「カートの価格を変えるアプリ」とシンプル量り売りを同じストアで使うときの考え方を書きます。
カートの価格を変えるアプリの多くは、シンプル量り売りと同じ Cart Transform を使います。Shopify は、同じカートの行を複数のアプリが変えようとすると、先に登録したアプリの結果だけを採用し、残りは捨てます。どちらが先かはインストールした順で決まり、後から入れたアプリは負け続けます。
そのため、併用するなら「商品ごとに担当のアプリを分ける」のが基本です。
同じ商品に 2 つのアプリを効かせないかぎり、両方を入れていても問題は起きません。
シンプル量り売りは、同じ仕組みを使う別のアプリがストアに入っていると、計算ルールの一覧に「カートの価格を変更する別のアプリが入っています」と表示します。この案内が出ていたら、ルールを割り当てている商品が、もう一方のアプリでも設定されていないかを確かめてください。
ほかの価格計算アプリからシンプル量り売りに乗り換えるときは、次の順で進めると、価格が付かない時間を作らずに済みます。
旧アプリを先にアンインストールすると、Cart Transform の登録順が繰り上がり、シンプル量り売りが優先されるようになります。逆に、旧アプリを残したまま同じ商品に両方を割り当てると、旧アプリの価格が使われ続けます。
迷ったら、商品の価格が何で決まるかで選びます。値段が長さ・面積・重さにほぼ比例するなら、量り売りに絞ったシンプル量り売りのほうが、ルールの数も設定の手間も少なく済みます。選択肢やチェックボックスを組み合わせて値段が決まる「カスタム商品」が中心なら、オプション型の計算アプリのほうが向いています。
シンプル量り売りは、お客様が入力した長さ・面積・体積・重さから、その場で価格を出してカートに入れられるようにするアプリです。
在庫が量で減らない点や、定期購入・注文編集に使えない点は、Shopify の仕様による制約です。そこを理解したうえで運用すれば、サイズの数だけバリエーションを作る手間も、注文後に金額を訂正する手間もなくなります。料金は月額 $5.99 で、7 日間は無料で試せます。
Shopify App Storeから、まずは手元の商品でプレビューの金額を確かめてみてください。
UnReact が開発している、在庫や価格表示に関わるアプリも紹介します。