Airbnb(民泊)事業の経理効率化を考えてみた|クラウド会計の前に整理したいこと

民泊サービスのホストとして、Airbnbの経理に悩まれている方向けに書いてみます。

freeeやマネーフォワード クラウドを使っていても、
Airbnbの売上・手数料・入金額をそのまま自動で整理できるとは限りません。

特に、銀行口座の入金だけを見ていると、
売上総額や手数料の内訳が見えにくくなります。

そこで今回は、AirbnbのCSVデータを使って、
毎月の経理を効率化する方法を整理してみます。

Contents

銀行口座連携だけの問題点

「銀行明細だけ連携しておけばいい」

このように考える方もいるかもしれません。

しかし、銀行明細では売上の総額を把握することができません。
なぜなら、売上から手数料を引かれた金額が入金されるからです。

たとえば、「売上100、手数料10、入金90」といった場合

本来は、以下の仕訳です。

借方金額貸方金額
預金90売上高100
支払手数料10

これが銀行明細の連携だけだと、こうなります。

借方金額貸方金額
預金90売上高90

「利益は同じだから、問題ないのでは?」
と思われる方もいるかもしれません。

しかし、

  • 売上が過少に計上される(消費税の課税事業者判断に影響あり)
  • 売上の規模が分からなくなる
  • 計上のタイミングがずれる可能性がある(発生日≠入金日)

といった点で、問題があります。

仕組みを作っておく

ここからはサンプルデータをもとに、
Airbnbデータの経理処理の効率化を考えていきます。

マネーフォワードへの取り込みを前提にしていますが、
③の形式を変えれば他の会計ソフトでも使えます。

一度仕組みを作っておけば、毎月の作業はかなり短縮できます。
慣れれば、月に1回5分程度で取り込みまで進められるはずです。

①CSVデータのダウンロード

こちらの手順に沿って、CSVデータをダウンロードします。

するとこんなデータが吐き出せます。

▼サンプルデータはこちら

②ピボット解除

ダウンロードしたCSVデータは、1つの予約情報が横に広がった形になっています。
このままだと、仕訳データへ変換しにくいです。

  • Gross earnings(売上総額)
  • Service fee(手数料)
  • Amount(純額)

といった情報が1行に入っているため、一覧形式に変えていきます。

具体的にはパワークエリのピボット解除を使います。
(難しくないです)

まず、データをすべて選択してから、
「データタブ」の「テーブルまたは範囲から」をクリックします。

Power Queryエディターの画面になるので、行ごとに分離したい列(Gross earningsなど)を選択します。
(Ctrlキーを押しながら項目名を選択)

そして「変換タブ」の「ピボット解除」をクリックすればOKです。

こんな感じで行ごとに情報をもたせることができます。

「ホームタブ」の「閉じて読み込む」を押して、Excel画面に戻せます。

以下の動画も参考にしていただければと思います。

③仕訳データへの整形

次は、会計ソフトに取り込める仕訳データの形に整えていきます。
たとえば、マネーフォワードの場合は、次のような形にしておくとスムーズです。

Power Query上で少しコードを使いますが、
大切なのは、コードそのものよりも「最終的にどの形式で出力したいか」を決めておくことです。

出力したい形が決まっていれば、
コード部分はAIに相談しながら作ることもできます。

たとえば、上記の形式に落とし込むのであれば、次の手順を踏みます。
ただしコード(M言語)自体は、AIと壁打ちしながら作っています。

具体的には以下の手順で設定をしていきます。

「クエリタブ」から「編集」でクエリエディターへ戻ります。

クエリの名称を分かりやすく「Airbnb_縦持ち」に変更しておきます。
(クエリ名を選択してF2で編集できます)

このクエリを右クリックして「参照」を選択します。

するともう1つのクエリ「Airbnb_縦持ち (2)」が出てきます。
名称は「MF_売上仕訳」などに変えておきましょう。

ここで「詳細エディター」を開きます。

詳細エディターとは、パワークエリに関するプログラムを書いていく箇所です。
基本的にノーコードのパワークエリですが、少し柔軟なデータに加工したいときは、ここの機能を使うと良いです。

繰り返しになりますが、大切なのは加工結果です。
AIに相談しながらコードは作成していければいいと個人的には思います。
(もちろん、中身の理解や基礎は押さえておきましょう)

  • 日付単位で取引Noをまとめる
  • 取引先、税区分、摘要を正しく整理する
  • 取引日は昇順にする

といった基本的な部分もひととおり整理していきます。

詳細エディターはこのような画面です。

記載するコードはこのようなもの。
M言語と言います。

なお、以下のコードはあくまでサンプルです。
Airbnbから出力されるCSVの項目名や、会計ソフト側のインポート形式によって調整が必要になります。
まずは「どの列を、どの仕訳項目に対応させるか」を決めてから使うのがおすすめです。

コードはこちら
let
    Source = Airbnb_縦持ち,

    // 設定値
    PartnerName = "Airbnb, Inc.",
    SalesTaxCategory = "課税売上 10%",
    NonTaxCategory = "対象外",

    // null対策用
    ToTextSafe = (x as any) as text =>
        if x = null then "" else Text.From(x),

    ToDateSafe = (x as any) as nullable date =>
        if x = null then null else Date.From(x),

    ToDateTextSafe = (x as any) as text =>
        if x = null then "" else Date.ToText(Date.From(x), "yyyy/MM/dd"),

    // 仕訳化する行だけ残す
    FilteredRows = Table.SelectRows(
        Source,
        each
            (
                [Type] = "Reservation"
                and List.Contains({"Amount", "Service fee", "Gross earnings"}, [属性])
            )
            or
            (
                [Type] = "Resolution Adjustment"
                and List.Contains({"Amount", "Gross earnings"}, [属性])
            )
    ),

    // null・0円を除外
    FilteredAmount = Table.SelectRows(
        FilteredRows,
        each [値] <> null and [値] <> 0
    ),

    // 予約・調整単位のキーを作成
    AddedKey = Table.AddColumn(
        FilteredAmount,
        "仕訳キー",
        each
            ToDateTextSafe([Date])
            & "_"
            & ToTextSafe([Type])
            & "_"
            & ToTextSafe([Confirmation code]),
        type text
    ),

    // 取引Noを振るための日付キー
    AddedDateKey = Table.AddColumn(
        AddedKey,
        "取引日キー",
        each ToDateSafe([Date]),
        type date
    ),

    // 同じ日付内での種別順
    AddedTypeOrder = Table.AddColumn(
        AddedDateKey,
        "取引種別順",
        each
            if [Type] = "Reservation" then 1
            else if [Type] = "Resolution Adjustment" then 2
            else 9,
        Int64.Type
    ),

    // 仕訳内の行順
    AddedLineOrder = Table.AddColumn(
        AddedTypeOrder,
        "仕訳行順",
        each
            if [Type] = "Reservation" and [属性] = "Amount" then 1
            else if [Type] = "Reservation" and [属性] = "Service fee" then 2
            else if [Type] = "Reservation" and [属性] = "Gross earnings" then 3
            else if [Type] = "Resolution Adjustment" and [属性] = "Gross earnings" then 1
            else if [Type] = "Resolution Adjustment" and [属性] = "Amount" then 2
            else 9,
        Int64.Type
    ),

    // 取引No用のキー一覧を作成
    KeyBase = Table.Distinct(
        Table.SelectColumns(
            AddedLineOrder,
            {"仕訳キー", "取引日キー", "取引種別順", "Confirmation code"}
        )
    ),

    // 取引日昇順に並べてから取引Noを付す
    SortedKeyBase = Table.Sort(
        KeyBase,
        {
            {"取引日キー", Order.Ascending},
            {"取引種別順", Order.Ascending},
            {"Confirmation code", Order.Ascending}
        }
    ),

    KeyTable = Table.AddIndexColumn(
        SortedKeyBase,
        "取引No",
        1,
        1,
        Int64.Type
    ),

    // 取引Noを結合
    Merged = Table.NestedJoin(
        AddedLineOrder,
        {"仕訳キー"},
        KeyTable,
        {"仕訳キー"},
        "KeyTable",
        JoinKind.LeftOuter
    ),

    Expanded = Table.ExpandTableColumn(
        Merged,
        "KeyTable",
        {"取引No"},
        {"取引No"}
    ),

    // 取引日
    AddedDate = Table.AddColumn(
        Expanded,
        "取引日",
        each ToDateTextSafe([Date]),
        type text
    ),

    // 金額は絶対値で使う
    AddedAbsAmount = Table.AddColumn(
        AddedDate,
        "仕訳金額",
        each Number.Abs([値]),
        Int64.Type
    ),

    // 借方勘定科目
    AddedDebitAccount = Table.AddColumn(
        AddedAbsAmount,
        "借方勘定科目",
        each
            if [Type] = "Reservation" and [属性] = "Amount" then "売掛金"
            else if [Type] = "Reservation" and [属性] = "Service fee" then "支払手数料"
            else if [Type] = "Resolution Adjustment" and [属性] = "Gross earnings" then "売上高"
            else null,
        type text
    ),

    // 借方取引先
    AddedDebitPartner = Table.AddColumn(
        AddedDebitAccount,
        "借方取引先",
        each if [借方勘定科目] <> null then PartnerName else null,
        type text
    ),

    // 借方税区分
    AddedDebitTax = Table.AddColumn(
        AddedDebitPartner,
        "借方税区分",
        each
            if [借方勘定科目] = "売掛金" then NonTaxCategory
            else if [借方勘定科目] = "支払手数料" then NonTaxCategory
            else if [借方勘定科目] = "売上高" then SalesTaxCategory
            else null,
        type text
    ),

    // 借方金額
    AddedDebitAmount = Table.AddColumn(
        AddedDebitTax,
        "借方金額",
        each if [借方勘定科目] <> null then [仕訳金額] else null,
        Int64.Type
    ),

    // 借方税額
    AddedDebitTaxAmount = Table.AddColumn(
        AddedDebitAmount,
        "借方税額",
        each if [借方勘定科目] <> null then 0 else null,
        Int64.Type
    ),

    // 貸方勘定科目
    AddedCreditAccount = Table.AddColumn(
        AddedDebitTaxAmount,
        "貸方勘定科目",
        each
            if [Type] = "Reservation" and [属性] = "Gross earnings" then "売上高"
            else if [Type] = "Resolution Adjustment" and [属性] = "Amount" then "売掛金"
            else null,
        type text
    ),

    // 貸方取引先
    AddedCreditPartner = Table.AddColumn(
        AddedCreditAccount,
        "貸方取引先",
        each if [貸方勘定科目] <> null then PartnerName else null,
        type text
    ),

    // 貸方税区分
    AddedCreditTax = Table.AddColumn(
        AddedCreditPartner,
        "貸方税区分",
        each
            if [貸方勘定科目] = "売上高" then SalesTaxCategory
            else if [貸方勘定科目] = "売掛金" then NonTaxCategory
            else null,
        type text
    ),

    // 貸方金額
    AddedCreditAmount = Table.AddColumn(
        AddedCreditTax,
        "貸方金額",
        each if [貸方勘定科目] <> null then [仕訳金額] else null,
        Int64.Type
    ),

    // 貸方税額
    AddedCreditTaxAmount = Table.AddColumn(
        AddedCreditAmount,
        "貸方税額",
        each if [貸方勘定科目] <> null then 0 else null,
        Int64.Type
    ),

    // 摘要
    AddedDescription = Table.AddColumn(
        AddedCreditTaxAmount,
        "摘要",
        each
            if [Type] = "Resolution Adjustment" then
                "Airbnb Resolution Adjustment "
                & ToTextSafe([Confirmation code])
                & " "
                & ToTextSafe([Guest])
                & " "
                & ToDateTextSafe([Start date])
                & "-"
                & ToDateTextSafe([End date])
            else
                "Airbnb "
                & ToTextSafe([Confirmation code])
                & " "
                & ToTextSafe([Guest])
                & " "
                & ToDateTextSafe([Start date])
                & "-"
                & ToDateTextSafe([End date]),
        type text
    ),

    // 最終表示順
    SortedRows = Table.Sort(
        AddedDescription,
        {
            {"取引No", Order.Ascending},
            {"仕訳行順", Order.Ascending}
        }
    ),

    // 省略版の列順
    ReorderedColumns = Table.SelectColumns(
        SortedRows,
        {
            "取引No",
            "取引日",
            "借方勘定科目",
            "借方取引先",
            "借方税区分",
            "借方金額",
            "借方税額",
            "貸方勘定科目",
            "貸方取引先",
            "貸方税区分",
            "貸方金額",
            "貸方税額",
            "摘要"
        }
    )
in
    ReorderedColumns

記載したら「完了」をクリックします。

「MF_売上仕訳」の内容が仕訳形式に変換されます。
「閉じて読み込む」をクリックします。

このような形でインポート用データが完成しました。

なお、税区分は事業者の状況や取引内容によって変わる可能性があります。
この記事では、サンプルとして一般的な民泊売上を前提に整理しています。

税金の初回相談40分(通常9,800円/税込)

👇以下の方は初回相談無料
開業5年以内 + クラウド会計(freee / MF)利用中または導入予定


40分で「税務・経理の不安」と「次の一手」を整理

初回相談はこちら

毎月やること

さて、ここまでを設計フェイズとすれば、
この後は運用フェイズです。

①インポートデータの作成と出力

まず、Airbnbから出力したファイルを、
先ほど作ったクエリのあるファイルに入力します。
(値貼り付けなどで入れればOK)

その後、「MF_売上仕訳シート」の「クエリタブ」で「更新」をクリックします。

こうすると、最新のレポートに合わせて仕訳データが自動で作成されます。

次にVBAで自動化することもできますが、今回は「名前を付けて保存」で対応してみます。

F12を押して以下の画面になったら、ファイルの種類をCSVにして保存します。

CSV保存する際は、仕訳データがあるシートを対象にします。
不安な場合は、仕訳シートだけを別ブックにコピーしてからCSV保存する形だとより安全です。

②会計ソフトへの取り込み

マネーフォワードの場合で解説します。

「会計帳簿」→「仕訳帳」を選びます。

「インポート」→「仕訳帳」をさらに選びます。

先ほど出力したCSVデータを選択し、「インポート」を押します。

エラーが出ていないことを確認して、「確認」をクリックします。

勘定科目のマッチング等を行って、さらに先に進みインポート完了です。

③入金額と売掛金の相殺

さて、このインポートデータとは別にAirbnbからの入金があるはずです。

この入金額はAirbnbの「Amount(売上純額)」と一致するはずであり、
「Amount(売上純額)」の金額が「売掛金」として入力されるように設計しています。

あとは、銀行口座に入金された金額を、売掛金の回収として処理していきます。
こうすることで、Airbnb側の売上データと銀行入金の両方をつなげて整理できます。

最初に仕組みを作るのは多少の時間が必要ですが、
一度作れば効率的に経理を行えます。

まとめ

以上、Airbnbの経理を題材に経理効率化の具体例を書いてみました。

「クラウド会計を導入すれば効率化できる!」
と思われている方も多いですが、このように連携できないサービスもそれなりにあります。

そして、連携できるサービスであっても、
会計・税務の観点からは、売上総額・手数料・税区分などを別途整理する必要があるケースもあります。

今回の考え方は、他のサービスを整理していく際にも応用可能です。
ぜひ、ご自身のケースにも当てはめてご検討いただければと。

では、また次回。

編集後記

◇日記
 昨日はオフ。
 早朝にラン6.5km。長男とラン1.0km。
 妻は長男・次男を連れて、友人家族とお出かけ。
 私は三男と公園などへ。平和な1日でした。

◇ブログネタ経緯
 Airbnbの経理ネタを書きたいと思い。

◇1日1新
 透明ビニールテープ

税金の初回相談40分(通常9,800円/税込)

👇以下の方は初回相談無料
開業5年以内 + クラウド会計(freee / MF)利用中または導入予定


40分で「税務・経理の不安」と「次の一手」を整理

初回相談はこちら
よかったらシェアしてね!
  • URLをコピーしました!
Contents