03 · 売上
Lemon Squeezy を接続し、注文を訪問に紐づける
Tally はストアの注文とサブスクリプションの請求書を読み取り、専用の Webhook を追加します。
01Lemon Squeezy を接続する
Lemon Squeezy で API キーを作成する
Lemon Squeezy の API キーは権限を制限できないため、Tally 専用のキーを作成してください。Tally が行うのはストアの注文の読み取りと専用の Webhook の追加だけで、キーはいつでも削除できます。Lemon Squeezy で Settings, API を開き、キーを作成します。Tally がこのキーで行うのは次のことだけです。
権限 アクセス 用途 Orders 読み取り すべての売上:金額、税額、返金、顧客のメールアドレス(すぐにハッシュ化し、保存はしません)。 Subscription invoices 読み取り 更新とプラン変更。 Webhooks 書き込み Tally がストアに専用の Webhook を追加するので、支払いは数秒で届きます。 テストモードで作成したキーには、テストの注文しか見えません。まず試すときに使ってください。
API キーを貼り付ける
サイトの Integrations ページ(またはサイト追加時の Payments の手順)で Lemon Squeezy を開き、次を入力します。
- API key:Tally は暗号化して保管し、二度と表示しません。
- Store (optional):キーから複数のストアが見える場合のみ。ストアのアドレス、名前、ID のいずれか。
続いて Connect Lemon Squeezy を押します。
Tally が確認し、過去 1 年分を取り込む
キーをストアで確認し、新しい注文を発生と同時に受け取れるよう専用の Webhook を追加して、過去 365 日分を取り込みます。Lemon Squeezy はチェックアウトのカスタムデータを Webhook でしか送らないため、取り込んだ注文は顧客のメールアドレスで紐づけます。これからの注文には訪問者 ID が付きます。
02訪問者 ID をカスタムデータとして渡す
購入リンクのあるページでは、数行のコードで、すべての Lemon Squeezy のチェックアウトリンクに _tally_vid Cookie の値を checkout[custom][tally_visitor_id] として追加します。サーバーで作成するチェックアウトでは、checkout_data.custom に入れます。
// On pages with Lemon Squeezy buy links: add the visitor id as custom data.
const visitorId = (document.cookie.match(/(?:^|; )_tally_vid=([\w-]+)/) || [])[1];
for (const link of document.querySelectorAll('a[href*=".lemonsqueezy.com/checkout/buy/"]')) {
const url = new URL(link.href);
if (visitorId && !url.searchParams.has('checkout[custom][tally_visitor_id]')) {
url.searchParams.set('checkout[custom][tally_visitor_id]', visitorId);
link.href = url.href;
}
}
// Express with cookie-parser, where you create a Lemon Squeezy checkout.
app.post('/checkout', async (req, res) => {
const visitorId = req.cookies['_tally_vid'];
const response = await fetch('https://api.lemonsqueezy.com/v1/checkouts', {
method: 'POST',
headers: {
Accept: 'application/vnd.api+json',
'Content-Type': 'application/vnd.api+json',
Authorization: 'Bearer ' + process.env.LEMONSQUEEZY_API_KEY,
},
body: JSON.stringify({
data: {
type: 'checkouts',
attributes: { checkout_data: { custom: visitorId ? { 'tally_visitor_id': visitorId } : {} } },
relationships: {
store: { data: { type: 'stores', id: '1' } },
variant: { data: { type: 'variants', id: '1' } },
},
},
}),
});
const { data } = await response.json();
res.redirect(303, data.attributes.url);
});
04うまくいったか確認する
05読み取らないもの
足りない情報や、実際の画面と違う点はありませんか? どのページかを添えて support@tallybyoutpost.com までお知らせください。