スマレジ取引データとレシートローラー取引データのマッピング
レシートローラーはスマレジを含む複数の POS ベンダーと連携しています。どのベンダーから取り込まれた取引でも、内部的には共通の取引データモデル(PosTransactionDto)で扱えるよう、ベンダー固有のフィールドを正規化しています。本記事ではスマレジ Platform API の取引データを、レシートローラーの内部モデルにどう対応付けているかを技術的に解説します。
この記事は POS 連携の内部仕様を理解したい開発者・運用担当者向けの参考資料です。日常的な連携の設定手順は スマレジの POS 連携設定 をご覧ください。フィールド単位の正規モデル仕様は PosTransactionDto 仕様(フィールドリファレンス) を参照してください。
階層構造の対応
スマレジ Platform API は契約・店舗・端末・取引という 4 階層を持ちます。レシートローラー側はビジネスアカウント・店舗・POS 端末・取引という 4 階層で、設計上は 1 対 1 で対応します。
- 契約(contractId) ↔ レシートローラーのビジネスアカウント。スマレジで「レシートローラーリンク」アプリをインストールすると、その契約はレシートローラーの 1 ビジネスアカウントに紐付けられます(
SmaregiContract.OrganizationId)。 - スマレジ店舗(storeId) ↔ レシートローラー店舗。
PosTerminal.SmaregiStoreIdでレシートローラー側 POS 端末に紐付けます。 - スマレジ端末(terminalId) ↔ レシートローラーの POS 端末。
PosTerminal.SmaregiTerminalIdに保持し、1 つの レシートローラー POS 端末は 1 つのスマレジ端末(レジ)に対応します。 - 取引(transactionHeadId) ↔ レシートローラーの取引。同 ID を
PosTransaction.TransactionIdおよびExternalTransactionIdとして保存します。
取引ヘッダーのフィールドマッピング
スマレジ /pos/transactions のレスポンス(SmaregiTransaction)と、レシートローラーの PosTransactionDto の対応です。
| スマレジ | レシートローラー | 備考 |
|---|---|---|
transactionHeadId | TransactionId / ExternalTransactionId | 同じ値を 2 つのフィールドに保存。冪等な upsert キー。 |
transactionDateTime | TransactionDateTime | JST 文字列を UTC へ変換して保存。 |
storeId | (直接保存しない) | 連携時に PosTerminal.SmaregiStoreId として保存済み。取引側では PosTerminal.StoreId(レシートローラー店舗 ID)に置き換え。 |
terminalId | (直接保存しない) | 連携時に PosTerminal.SmaregiTerminalId として保存済み。取引側では PosTerminal.TerminalId(レシートローラー端末 ID)に置き換え。 |
customerId / customerCode | (CRM 解決へ) | 顧客マッチキー(後述)として CRM 解決ロジックに渡し、CRM 顧客との紐付けに利用。 |
staffId | StaffId | そのまま保存。 |
staffName | StaffName | 空の場合は /pos/staffs/{staffId} から取得して補完。 |
total | TotalAmount | スマレジは数値も文字列で返すため decimal.TryParse。 |
subtotal | SubtotalAmount | 0 の場合は total - tax から計算。 |
tax | TaxAmount | 同上の文字列パース。 |
discount | DiscountAmount | 同上。 |
status / cancelDivision | Status | 後述のステータス変換表を参照。 |
receiptNumber / terminalTransactionId | ReceiptNumber | 端末で発行されたレシート番号。 |
paymentMethods[] | PaymentMethod | 複数決済の場合は金額最大の方法を採用(後述)。 |
ステータスコードの変換
スマレジのステータス値は数値文字列で返ります。レシートローラー内では文字列ラベルに正規化します。
| スマレジ値 | 意味 | レシートローラー Status |
|---|---|---|
"1" | 完了 | Completed |
"2" | 取消 | Voided |
"3" | 返金 | Refunded |
| 不明値・空文字 | — | Pending(フォールバック) |
フィールド名は仕様により status と cancelDivision を併用するケースがあります。両方の値を見て判定するため、いずれかが取れれば正しく分類されます。
支払い方法の正規化
スマレジの paymentMethods は配列で返り、各要素に支払い方法名と金額が入っています(分割決済の場合は複数要素)。レシートローラーは「主たる支払い方法」を 1 つだけ持つため、配列の中から金額が最大の要素を採用し、その日本語表記を内部コードに正規化します。
| スマレジの表記 | レシートローラー内部コード |
|---|---|
| 「現金」を含む | Cash |
| 「クレジット」を含む | CreditCard |
| 「QR」を含む | QR |
| 「電子マネー」または「IC」を含む | IC |
| 配列が空・該当なし | Other |
スマレジの取引一覧 API では支払い方法が含まれない場合があり、その際は別エンドポイントから補完取得を行います。実装の最新状況はソースコード(SmaregiTransactionMapper)を参照してください。
明細(行アイテム)のマッピング
取引ヘッダーとは別に、/pos/transactions/{id}/details から明細データを取得し、PosTransactionLineItemDto の配列に変換して LineItemsJson へシリアライズ保存します。
スマレジ SmaregiTransactionDetail | レシートローラー PosTransactionLineItemDto | 備考 |
|---|---|---|
productName | ProductName | そのまま。 |
quantity | Quantity | 文字列を整数に丸め。0 以下は 1 に補正。 |
price | UnitPrice | 文字列パース。 |
subtotal | Subtotal | 文字列パース。 |
taxRate | TaxRate | 文字列パース。 |
categoryName | Category | そのまま。 |
ItemCount(取引全体の購入点数)は、明細の Quantity の合計として算出します。
顧客情報の解決(CRM 連携)
スマレジから取得した customerId / customerCode は、取引データの直接フィールドとしては保存せず、顧客マッチキーとして CRM 解決サービス(IPosCustomerMatchService)に渡します。マッチが成立すれば、レシートローラーの CRM 顧客プロファイルに取引が自動でひも付き、顧客別の購入履歴や離反予兆スコアの算出に利用されます。
マッチキーの主な種類は次のとおりです(実装の PosCustomerMatchDto 参照)。
- 会員番号(メンバーシップコード)— スマレジの
customerCode等 - 外部顧客 ID — スマレジの
customerId - メールアドレス・電話番号 — スマレジから取得できる場合のみ
マッチが成立しない取引は、店舗端末 QR スキャン経由で顧客が後から自分でひも付けることもできます。
スタッフ情報の補完
取引ヘッダーには staffId しか入らないケースがあります。その場合は別途 /pos/staffs/{staffId} を呼び出して displayName を取得し、StaffName に保存します。スタッフ名の取得に失敗しても取引取り込み自体は失敗とせず、空のまま保存します(取引データの欠損を防ぐため)。
取得経路(Source)の区別
同じ取引でも、どの経路で取り込まれたかを Source フィールドで区別します。
Webhook— スマレジからリアルタイムにプッシュされた経路Sync— 店舗オーナーが「スマレジと同期」ボタンを押した手動同期経路API— その他の Platform API 経由の取得(QR スキャン時の即時取得など)
同じ transactionHeadId が複数経路で届いても、同 ID をキーとして upsert するため取引が重複することはありません。Source 値は最後に取り込んだ経路を反映します。
タイムゾーンの扱い
スマレジ Platform API は JST(+09:00)の ISO 8601 形式で日時を返します。レシートローラー側はすべて UTC で保存し、表示時に JST へ変換します。Platform API への日時フィルタ送信時も、UTC を JST へ変換し、URL エンコードして送信します(+09:00 の + 記号が空白として解釈されないように)。
冪等性
取引の upsert は transactionHeadId をキーに行います。同じ取引が Webhook と手動同期の両方で届いても、結果として 1 件のレコードに収束します。UpdatedAt は最新の取り込み時刻に更新されますが、TransactionDateTime(取引発生時刻)は不変です。
取り込みパイプラインの全体像
- スマレジ側で取引が発生 → スマレジ Platform から Webhook がレシートローラーへ送信される
- レシートローラーの Webhook 受信エンドポイントがカスタムヘッダー認証を実施
- ペイロードから
transactionHeadIds(複数の場合あり)を抽出 - 各 ID について Platform API から取引ヘッダー+明細+スタッフを取得
SmaregiTransactionMapperでPosTransactionDtoに変換- 顧客マッチキーを
IPosCustomerMatchServiceに渡し、CRM 解決を実行 PosTransactionService.UpsertAsyncで保存(重複は上書き)PosTerminal.LastTransactionAtを更新(QR スキャン経由の最新取引表示用)- 顧客が判明している場合は自動配信サービスに引き渡し(電子レシート配信)
関連記事
- PosTransactionDto 仕様(フィールドリファレンス) — 各フィールドの詳細仕様
- Square 取引データとのマッピング — Square 版
- スマレジの POS 連携設定 — 連携手順
- POS との連携
- Square の POS 連携設定
- スマレジ・Square との会員情報双方向同期
- 顧客別の購入履歴(POS 連携)
-
スマレジ商品データとレシートローラー商品データのマッピングスマレジの商品マスタがレシートローラーの商品マスタ(ProductDto)にどう変換されるかをフィールド単位で説明します。商品コード・商品名・カテゴリ・価格・原価・税率の対応関係と、Smaregi 固有の挙動をまとめています。
-
スマレジ連携 — 全体像と始め方スマレジとレシートローラーの連携の全体像、必要なもの、3 ステップの概要、次に読むべき詳細記事をまとめた最初の 1 枚です。
-
スマレジ・Square との会員情報双方向同期レシートローラーの会員情報は、連携している POS(スマレジ・Square など)と双方向で同期されます。本記事では、双方向同期の仕組み、同期される項目、同期のタイミング、競合時の優先順位、対応 POS、設定方法、トラブルシューティングをご案内します。
-
POSとの連携レシートローラーと連携できるPOSシステムの概要と、接続方法を説明します。Square・スマレジに対応しています。
-
スマレジ会員データとレシートローラー顧客データのマッピングスマレジの会員マスタがレシートローラーの顧客データ(CrmCustomerDto)にどう変換されるかをフィールド単位で説明します。会員番号・氏名・連絡先・住所・誕生日の対応関係、電話番号の優先順位、Webhook 経由の同期タイミングまでまとめています。