tax-calculation について
tax-calculation は、米国の売上税や EU VAT に対応する EC チーム向けの実装ガイドです。プラットフォーム別の設定、チェックアウト時の税額計算、決済後の取引記録を説明します。
主な機能
- 01ネクサスに基づく課税地域の判断
- 02Shopify、WooCommerce などの設定手順
- 03TaxJar、Avalara、Stripe Tax の案内
- 04EU VAT とリバースチャージの説明
- 05決済後の取引確定と返金時の取消
活用シーン
- 01税務義務のある地域への販売拡大
- 02手動税率の更新作業の置き換え
- 03決済確定前の正確な税額表示
- 04EU 域内 B2B 取引の VAT 対応
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill tax-calculationインストール後、Claude Code で/tax-calculationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
tile.jsonevals/avalara-avatax-integration-with-estimate/criteria.jsontask.mdevals/eu-vat-b2b-reverse-charge-and-vies-valid/criteria.jsontask.mdevals/taxjar-us-checkout-integration-with-cach/criteria.jsontask.md詳細
税額計算
概要
チェックアウト時の正確な税額計算は、最適化ではなく法的要件です。米国には、13,000を超える課税管轄区域があります。EUのVAT規則では、顧客の居住国のVAT税率を適用する必要があります。計算を誤ると、税額の徴収不足(不足分を負担する義務が生じます)や徴収過剰(返金や顧客からの苦情につながります)が発生します。主要なプラットフォームにはすべて、税額計算機能が組み込まれているか、TaxJarやAvalaraとの直接連携機能があり、カスタムコードを使わずに正しく対応できます。
このスキルを使用するタイミング
- 税務上のネクサス義務がある州や国への販売を拡大するとき
- 手動で設定した税率がコンプライアンス上の問題を引き起こしたり、頻繁な更新が必要になったりしているとき
- EUのVATコンプライアンス(OSS/IOSS登録)を導入するとき
- 顧客が支払いを確定する前に正確な税額を表示するとき
主な手順
手順 1:税金を設定する前にネクサスを理解する
税金を徴収する必要があるのは、ネクサス(税務上の義務)がある管轄区域のみです。
米国の売上税におけるネクサス:
- 物理的ネクサス:州内に従業員、倉庫、またはオフィスがある
- 経済的ネクサス:ほとんどの州では、その州の顧客への売上が年間100,000ドルに達するか、取引件数が200件に達すると発生します(カリフォルニア州とテキサス州では500,000ドルです)
- 設定前に各州の最新の基準額を確認してください。基準額は変更されます
EUのVAT:
- EUを拠点とする販売者は、EU域内でのすべての販売に対し、顧客の居住国の税率でVATを課す必要があります
- EU域外の販売者は、EU域内の年間B2C売上が10,000ユーロを超えた時点で、OSS制度を通じてEUのVAT登録を行う必要があります
- EU域内のB2B販売にはリバースチャージが適用されます。購入者が自己申告によりVATを処理します
手順 2:プラットフォームで税額計算を設定する
Shopify
オプション A:Shopify組み込みの税額計算(米国のストアに推奨)
- Settings → Taxes and dutiesに移動します
- Tax regionsで、ネクサスがある地域を選択します
- 米国の場合:Shopifyは顧客の配送先住所に基づき、州、郡、市の正しい税率で税額を自動計算します。米国の基本的な税務コンプライアンスにサードパーティサービスは不要です
- 州で必要な場合は、Charge tax on shippingを有効にします(州によって異なります)
- 商品ごとの免税設定(例:ペンシルベニア州では衣料品が免税)の場合は、Products → [Product] → Taxに移動し、適切な税カテゴリを設定するか、カスタム税額の上書きを作成します
オプション B:Stripe Tax(ShopifyとStripe経由)
Shopifyの組み込み税額計算機能は米国を十分にカバーしています。国際的なVATコンプライアンスには、Shopifyアプリ連携を通じてStripe Taxをインストールしてください。
オプション C:TaxJarまたはAvalara(複雑な複数管轄区域の要件向け)
- Shopify App StoreからTaxJarまたはAvalara AvaTaxをインストールします
- アプリのセットアップウィザードに従い、Shopifyストアに接続して、ネクサスがある州を入力し、商品税カテゴリを設定します
- アプリはShopify組み込みの税額計算機能に代わり、チェックアウト時に独自のリアルタイム計算を行います
- 確定した取引データは、申告レポート作成のためTaxJar/Avalaraに自動送信されます
WooCommerce
オプション A:WooCommerce の組み込み税機能
- WooCommerce → Settings → Tax に移動し、税計算を有効にします
- ストアの基本住所を設定します(適用される税率に影響します)
- Tax → Standard rates に移動し、州/国ごとの税率を手動で入力します
- 制限事項:手動で設定した税率は自動更新されません。コンプライアンスを確保するには、TaxJar または Avalara を使用してください
オプション B:TaxJar(米国のコンプライアンスに推奨)
- taxjar.com で登録し、API トークンを取得します
- TaxJar for WooCommerce プラグイン(WordPress.org から無料で入手可能)をインストールします
- WooCommerce → TaxJar に移動し、API トークンを入力します
- Automatic tax calculation を有効にします。TaxJar は、ネクサス州と顧客の住所に基づき、チェックアウト時にリアルタイムで適切な税率を計算します
- Transaction sync を有効にします。完了した注文は、申告レポート作成のため TaxJar に自動送信されます
オプション C:Avalara AvaTax
- avalara.com で登録し、AvaTax で会社を作成します
- Avalara AvaTax for WooCommerce プラグインをインストールします
- Avalara ダッシュボードに表示されるアカウント ID、ライセンスキー、会社コードを入力します
- 税計算と取引記録を有効にします
BigCommerce
- Store Setup → Tax に移動します
- BigCommerce には、米国の基本税率を計算する組み込み機能があります
- コンプライアンスを完全に確保するには、Store Setup → Tax → Tax Provider に移動し、Avalara AvaTax または TaxJar に接続します
- プロバイダーの BigCommerce セットアップガイドに従います。どちらも、組み込みの税計算エンジンをコンプライアンスに準拠したリアルタイム計算に置き換えるネイティブ連携を備えています
BigCommerce での EU VAT: EU VAT のコンプライアンスを確保するには、Store Setup → Tax → VAT で VAT by country を有効にします。OSS に完全準拠するには、Avalara の EU VAT モジュールを使用してください。
カスタム/ヘッドレス
Stripe Tax(最も簡単)を使用するか、TaxJar/Avalara API を直接使用します。
オプション A:Stripe Tax(Stripe ベースのストアに推奨)
// Enable Stripe Tax on the PaymentIntent — Stripe calculates and collects tax automatically
const paymentIntent = await stripe.paymentIntents.create({
amount: orderSubtotalCents, // Subtotal only — Stripe adds tax
currency: 'usd',
automatic_payment_methods: { enabled: true },
// Stripe Tax configuration
// See: https://stripe.com/docs/tax/integration
});
// Or use Stripe Checkout with automatic_tax enabled:
const session = await stripe.checkout.sessions.create({
line_items: lineItems,
mode: 'payment',
automatic_tax: { enabled: true }, // Stripe Tax handles calculation
customer_details: { address: { country: customerCountry }, address_source: 'shipping' },
success_url: `${domain}/success`,
cancel_url: `${domain}/cart`,
});
Stripe Dashboard → Tax → Configure で Stripe Tax を設定し、税登録番号と商品カテゴリごとの税の扱いを指定します。
オプション B:TaxJar API
const Taxjar = require('taxjar');
const taxjar = new Taxjar({ apiKey: process.env.TAXJAR_API_KEY });
async function calculateTaxForOrder({ fromAddress, toAddress, lineItems, shippingCost }) {
const response = await taxjar.taxForOrder({
from_country: fromAddress.country,
from_zip: fromAddress.zip,
from_state: fromAddress.state,
to_country: toAddress.country,
to_zip: toAddress.zip,
to_state: toAddress.state,
to_city: toAddress.city,
amount: lineItems.reduce((sum, i) => sum + i.unit_price * i.quantity, 0),
shipping: shippingCost,
line_items: lineItems.map(item => ({
id: item.id,
quantity: item.quantity,
unit_price: item.unit_price,
product_tax_code: item.tax_code ?? null, // e.g., '20010' for general goods
})),
});
return {
totalTax: response.tax.amount_to_collect,
taxRate: response.tax.rate,
hasNexus: response.tax.has_nexus, // false = no tax to collect
breakdown: response.tax.breakdown,
};
}
// After order is confirmed, commit the transaction for filing reports
async function commitTaxTransaction(order) {
await taxjar.createOrder({
transaction_id: order.id,
transaction_date: new Date().toISOString().split('T')[0],
from_country: WAREHOUSE_ADDRESS.country,
from_zip: WAREHOUSE_ADDRESS.zip,
from_state: WAREHOUSE_ADDRESS.state,
to_country: order.shippingAddress.country,
to_zip: order.shippingAddress.zip,
to_state: order.shippingAddress.state,
amount: order.subtotal,
shipping: order.shippingCost,
sales_tax: order.taxAmount,
line_items: order.lineItems.map(item => ({
id: item.id,
quantity: item.quantity,
unit_price: item.price,
sales_tax: item.taxAmount,
})),
});
}
EU VAT のリバースチャージ(EU 域内の B2B 越境取引):
EU の B2B 取引でゼロ税率を適用する前に、EU VIES サービスを通じて購入者の VAT 番号を検証してください。
async function validateEUVATNumber(vatNumber) {
const countryCode = vatNumber.slice(0, 2);
const number = vatNumber.slice(2);
const res = await fetch(
`https://ec.europa.eu/taxation_customs/vies/rest-api/ms/${countryCode}/vat/${number}`
);
const data = await res.json();
return data.isValid === true;
}
ステップ 3:注文完了後に税取引を確定する
税計算サービスでは、支払い確認後に各取引を「確定」する必要があります。これにより、その取引が申告レポートに記録されます。Shopify/WooCommerce 向けの TaxJar および Avalara アプリでは、これが自動的に行われます。カスタム連携の場合は、注文確認後(支払い前ではなく)に作成/確定 API を呼び出してください。
ベストプラクティス
- 税率をハードコードしない — 税率は頻繁に変更されるため、TaxJar、Avalara、Stripe Tax、またはプラットフォームの組み込み税計算エンジンを使用してください
- チェックアウト時にリアルタイムで税額を計算する — 顧客が支払いを確定する前に正確な税額を表示してください。支払い時に変わる推定税額は不信感を招き、カート放棄につながります
- 支払い前ではなく、支払い後に取引を確定する — 申告レポートに反映されるのは確定済みの取引のみです。支払いが確認された時点で確定してください
- 返金時に税取引を無効化する — 返金を行う際は、申告時の過大報告を避けるため、TaxJar/Avalara で対応する税取引を無効化してください
- 税 API のエラーを適切に処理する — 税 API が利用できない場合は、チェックアウトを停止するのではなく、代替税率(米国平均で約 8.5%)を適用してください
よくある問題と対処法
| 問題 | 解決策 |
|---|---|
| 税額は計算されるが、申告 API に確定されない | 注文完了時に自動確定されるよう、プラットフォーム連携(TaxJar プラグイン、Avalara プラグイン)が設定されていることを確認します。プロバイダーの取引ダッシュボードで確認してください |
| EU 域内の国境を越えた B2B 販売で VAT が課税される | リバースチャージを適用する前に、VIES で VAT 番号を検証します。検証に失敗した場合は、B2C として VAT を課税します |
| 税務 API によってチェックアウトが 500ms 遅くなる | TaxJar と Avalara の Shopify/WooCommerce プラグインには、どちらもキャッシュ機能が組み込まれています。独自に構築する場合は、配送先の郵便番号とカート合計額をキーとして、税額の見積もりを 1 時間キャッシュします |
| Shopify で州の税率が誤って適用される | Settings → Taxes でネクサス州のリストが正しく、最新であることを確認します。誤って設定されている可能性がある、商品単位の税設定も確認してください |
| TaxJar のインストール後、WooCommerce で「0 tax」と表示される | TaxJar API キーが正しいことを確認します。プラグインのステータスページで API エラーを確認し、倉庫の住所とネクサス州が TaxJar ダッシュボードで設定されていることを確認してください |
関連スキル
- @checkout-flow-optimization
- @multi-currency
- @order-processing-pipeline
- @stripe-integration
- @tax-compliance-automation