Zoho CampaignsのSMSが届かない原因の多くは、携帯番号が「090…」のままで、E.164形式になっていないことです。E.164形式とは、電話番号を国番号から始まる国際的な表記にそろえる番号計画のことです。日本の携帯番号なら、先頭の0を取って +81 を付けます。たとえば 090-1234-5678 は +819012345678 になります。

Zoho CampaignsからSMS(ショートメッセージ)を配信するとき、連絡先の携帯番号がこの形式になっていないと、配信対象として扱われません。この記事では、当社が支援している福岡の不動産仲介会社A社で、Zoho CRMの連絡先にSMSを送ろうとしたときに調べた内容をもとに、原因と対処の考え方をまとめます。対処は現在設計の段階なので、ここでは「調べて分かったこと」と「設計の考え方」として紹介します。Zoho CRMからSMSを送る仕組みそのものは「ZohoからSMS(ショートメール)送信を日本で実装できるようになりました!」や「CM.comを使ってCRMからSMS送信」で紹介しています。

起きたこと:CRMの携帯番号が090のままだと配信対象にならない

A社では、Zoho CRMの連絡先をZoho Campaignsに同期し、Campaignsから国内のSMS配信サービスと連携してSMSを送る構成を検討していました。

ところが、CRMから同期された連絡先の携帯番号は 090xxxxxxxx の形で、この状態ではSMSの配信対象として認識されませんでした。試しに1件を +8190xxxxxxxx の形に書き換えたところ、配信対象として反応しました。原因は番号の書き方にあると分かりました。

なぜ090のままだと送れないのか:Campaignsの仕様でE.164形式以外は送れない

Zoho Campaignsの公式ヘルプ(SMSキャンペーンの説明とFAQ)と、実機の設定画面を確かめたところ、次の3点が分かりました。

項目 内容 根拠
番号の形式 E.164形式で保存されていない連絡先は、無視されるか無効として扱われ、SMSキャンペーンを送れない 公式ヘルプ
宛先の項目 国や番号の項目は選べず、標準の「Mobile Number」項目から取得される 公式ヘルプ
国番号の補完 デフォルトの国番号を補うような設定は見当たらない 当社が2026年8月に実機の画面で確認

公式ヘルプでは、E.164形式の番号は最大15桁で、国番号(1〜3桁)と、市外局番を含む加入者番号(最大12桁)で構成すると説明されています。

つまり、090形式のままSMSが届かないのは、Campaignsの仕様上の制約です。不具合ではないので、設定をどこか変えれば直るというものではありません。番号そのものをE.164形式で持つ必要があります。

検討した2つの案

番号をE.164形式にする方法として、2つの案を比べました。

案A:CRM本体の携帯番号をE.164形式にそろえる

CRMの連絡先の「携帯電話」項目(API名 Mobile)そのものを、+81 から始まる形に書き換える案です。

  • よい点:公式にサポートされた形式にデータ自体をそろえるので、確実です。CRMからの同期でそのままCampaignsにも+81形式が届きます
  • 気をつける点:CRMのデータの形式が変わるので、電話番号を使っている別の仕組みへの影響を確かめる必要があります

案B:CRMは090のまま、Campaigns側だけAPIで+81形式に書き込む

CRMの携帯番号には手を付けず、Zoho CampaignsのAPIで、Campaigns側の「Mobile Number」にだけ+81形式の値を書き込む案です。CRMの画面では見慣れた090形式のまま使えるので、一見すると影響が小さく見えます。

Campaigns側だけ+81に直せないのか:同期のたびに090で上書きされる

案Bを詳しく調べると、当社が確認した時点の画面では成り立たないことが分かりました。

Zoho Campaignsの公式ヘルプでは、Zoho CRMとの同期(新しいバージョン)は「変更が発生するたびにすぐに実行されます」と説明されています。CRMの携帯番号が090のまま残っていると、連絡先のどこかの項目が更新されるたびに、同期が090形式の値をCampaignsへ送り直します。APIで書き込んだ+81の値は、そのたびに上書きされてしまいます。

この上書きを避ける方法として、次の2つも確認しました。

  • 関連付けの差し替え:同期の項目の関連付けで、携帯番号の代わりに+81形式を入れた別の項目を「Mobile Number」に結び付ける方法です。公式ヘルプでは関連付けは同期開始後も編集できるとされていますが、当社が2026年8月に確認した画面では、「Mobile Number」の関連付け先を別項目に差し替えることはできませんでした。標準項目の関連付け先は固定されている可能性があります(公式に明記された記載は見つけられていません)
  • 携帯番号だけ同期から外す:携帯番号の項目だけを同期の対象外にする方法です。当社が確認した時点の同期設定画面には、そのような切り替えはありませんでした

どちらも、当社が確認した時点の画面では成立しなかったため、案Bは見送りと判断しました。画面の仕様は変わることがあるので、案Bを検討する場合は、最新の同期設定画面で関連付けを一度確かめてください。CRMと同期している限り、正しい形式はCRM側で持つしかないというのが結論です。

電話番号を+81形式に変換するには:CRMの携帯番号をE.164形式にそろえる(案Aの設計)

CRMの携帯番号を国内形式から国際形式に変換してそろえ、その番号が同期されてSMS配信の宛先として使われるまでの流れを示した図。

案Aは、次の3つの作業に分かれます。

  1. 影響の洗い出し:電話番号を使う仕組みを一覧にし、+81形式になっても動くかを確かめます
  2. 新規・更新時の自動変換:携帯番号が入力・更新されたら、ワークフローで自動的にE.164形式にします
  3. 既存データの一括変換:すでに入っている連絡先の携帯番号をまとめて変換します

1. 影響の洗い出し

A社の場合、電話番号を使う仕組みが複数ありました。

  • 電話システムとの連携:連携処理の中で、090 形式でも +81 形式でも同じ +81 形式に変換してから送る作りでした。CRMの値が+81形式になっても影響はない、と確認できました
  • 電話番号で連絡先を照合する仕組み:照合用に番号を整えた項目が090形式を前提にしている可能性があり、追加の調査が必要と分かりました

このように、電話番号の文字列で照合している処理がいちばん影響を受けやすい箇所です。CRMの関数、ウィジェット、外部ツール連携、レポートの条件などから、電話番号を比べている箇所を探してから変換に進みます。

2. 新規・更新時の自動変換(Deluge)

変換のルールは、A社の電話システム連携で使っている正規化の考え方をもとに、SMSの宛先となる携帯番号に絞って組み直しました。

  • 数字以外の文字(ハイフン、スペース、+ など)をすべて取り除く
  • 先頭が 070・080・090 で11桁なら、先頭の0を +81 に置き換える
  • 先頭が 8170・8180・8190 で12桁なら、先頭に + を付ける(+81 90-… のように区切りが入っていた値も、ここで +8190… にそろう)
  • それ以外の値(空、桁が合わない、海外の番号など)は変換しない

最後の「変換しない」が大切です。判断できない値を無理に書き換えると、元の番号が分からなくなります。たとえば米国の番号 +1 415 555 1234 に一律で +81 を付けると、+8114155551234 という存在しない番号になります。形が合わない値はそのまま残し、あとで人が確認します。海外の番号はこの関数の対象外なので、海外の番号を持つ連絡先がいる場合は、入力時に + 付きの国際表記で入れてもらう運用にします。

次は、連絡先の「携帯電話」が作成・更新されたときに動かす関数の例です。ワークフロールールで、連絡先の作成時と携帯電話の項目の更新時に、この関数を呼び出す設定にします。引数には連絡先のIDを渡します。

void automation.normalize_mobile_e164(String contactId)
{
	rec = zoho.crm.getRecordById("Contacts", contactId.toLong());
	raw = rec.get("Mobile");
	if(raw == null || raw.toString() == "")
	{
		return;
	}
	digits = raw.toString().replaceAll("[^0-9]", "");
	if(digits.length() == 11 && (digits.startsWith("070") || digits.startsWith("080") || digits.startsWith("090")))
	{
		// 国内の携帯形式(090xxxxxxxx):先頭の0を+81に置き換える
		e164 = "+81" + digits.subString(1);
	}
	else if(digits.length() == 12 && (digits.startsWith("8170") || digits.startsWith("8180") || digits.startsWith("8190")))
	{
		// 国番号付きで + が欠けている、または区切りが入っている形(81 90 xxxx xxxx など)
		e164 = "+" + digits;
	}
	else
	{
		// 国内の携帯形式と判断できない値(海外の番号・桁違いなど)は書き換えない
		return;
	}
	if(e164 == raw.toString())
	{
		// すでにE.164形式なら更新しない
		return;
	}
	updateMap = Map();
	updateMap.put("Mobile", e164);
	zoho.crm.updateRecord("Contacts", contactId.toLong(), updateMap);
}

Delugeの公式ドキュメントでは、zoho.crm.updateRecord は trigger を指定しない場合、ワークフローは実行されない(承認・ブループリント・オーケストレーションのみ実行)とされています。そのため、この更新で同じワークフローがもう一度動くことは想定していません。仮に再発火した場合でも、2回目は値が同じなので更新されず、そこで止まります。見込み客(Leads)など、ほかのモジュールでSMSを送る場合は、モジュール名を差し替えて同じ関数を用意します。

3. 既存データの一括変換

ワークフローは、更新があった連絡先にしか動きません。すでに登録されている連絡先は、別に一括で変換します。方法は、連絡先を順に取得して上の関数と同じルールで書き換える一回限りの処理を作るか、データを書き出して変換し、取り込み直すかのどちらかです。

どちらの場合も、次の順番で進めると安全です。

  1. 変換前の連絡先データを書き出して保管する
  2. 少数の連絡先で試し、CRMの値と、同期後のCampaigns側の「Mobile Number」の両方を確かめる
  3. 形が合わずに変換されなかった番号を一覧にし、人が確認する
  4. 全件に適用する

固定電話の番号はどうするか:ハイフンを取るだけにした

携帯番号をE.164形式にするついでに、固定電話の項目(API名 Phone)もそろえるかどうかを検討しました。A社では、もともと「電話番号の書き方がばらばら」という課題があったためです。結論は、ハイフンとスペースを取り除くだけにしました。

案 内容 判断
ハイフンを付け直す 0312345678 を 03-1234-5678 の形にそろえる 採用しない。市外局番の桁数が地域で違い、ハイフンの位置を機械的に決められない
ハイフンを取るだけ 03-1234-5678 を 0312345678 にする 採用。すべての番号の種類に使え、副作用がない

あわせて、桁数のチェックはしないことにしました。桁数で弾くと、内線番号などの特殊な書き方まで入力できなくなるためです。

固定電話の項目向けの関数は、次のようにシンプルにしています。

void automation.normalize_phone_digits(String contactId)
{
	rec = zoho.crm.getRecordById("Contacts", contactId.toLong());
	phone = rec.get("Phone");
	if(phone == null || phone.toString() == "")
	{
		return;
	}
	normalized = phone.toString().replaceAll("-", "").replaceAll(" ", "").replaceAll(" ", "");
	if(normalized == phone.toString())
	{
		return;
	}
	updateMap = Map();
	updateMap.put("Phone", normalized);
	zoho.crm.updateRecord("Contacts", contactId.toLong(), updateMap);
}

全角のスペースも取り除いているのは、手入力で混ざりやすいためです。携帯番号の項目にはこの関数ではなく、前の節のE.164変換を使います。2つの関数を同じ項目に重ねないように、ワークフローのトリガーは項目ごとに分けておきます。

まとめ

Zoho CampaignsのSMSが090形式の番号に届かないのは、仕様による制約です。

  • SMSの宛先は標準の「Mobile Number」項目に固定で、E.164形式でないと送れない
  • 当社が確認した時点では、国番号を補う設定はなかった
  • CRMと同期しているなら、Campaigns側だけ直しても同期で上書きされる
  • CRM本体の携帯番号をE.164形式にそろえる。その前に、電話番号で照合している仕組みを洗い出す

SMS配信を始める前に、CRMの携帯番号の形式を一度確かめておくことをおすすめします。メール配信で届かない宛先をCRMに戻す仕組みは「Zoho CRMでメール不達(ハードバウンス)を検知し、連絡先へ自動反映する方法」で解説しています。

SMS配信の設計は、Zoho導入支援・コンサルティングでご相談いただけます。

よくある質問

Zoho CampaignsのSMSで、090から始まる番号に送れないのはバグですか?

バグではなく仕様です。Zoho Campaignsのヘルプには、E.164形式で保存されていない連絡先は無視されるか無効として扱われ、SMSキャンペーンを送れないと書かれています。日本の携帯番号なら、090-1234-5678を+819012345678の形にする必要があります。

Campaignsの設定で、国番号を自動で付けることはできませんか?

当社が2026年8月に実機のSMS設定画面を確認した時点では、デフォルトの国番号を補うような設定はありませんでした。番号そのものをE.164形式で保存しておく必要があります。

CRMは090のままにして、Campaigns側の番号だけ+81に変えられませんか?

CRMと同期している場合は現実的ではありません。新しいバージョンの同期は、CRM側で変更が起きるたびにすぐ実行されます。CRMの連絡先が更新されるたびに090形式の値が送られ、Campaigns側の+81の値が上書きされます。当社が確認した時点では、携帯番号の関連付け先を別項目に差し替えることも、携帯番号だけを同期から外すこともできませんでした。

固定電話の番号もE.164形式にそろえるべきですか?

SMSの宛先になるのは携帯番号の項目だけなので、必須ではありません。当社の設計では、固定電話の項目はハイフンとスペースを取り除くだけにとどめています。市外局番の桁数が地域で違うため、ハイフンを正しい位置に入れ直すのは難しく、桁数のチェックも内線番号などを弾いてしまうためです。