医療クリニック、学習塾、自動車整備工場などのローカルサービスビジネスを運営している場合、顧客が実際にメッセージを確認したかどうかを把握することは極めて重要です。このチュートリアルでは、SMSゲートウェイからSMSが既読か未読かのステータスを取得する方法を説明し、SMSプロトコルの技術的な制限を明確にした上で、送信メッセージの確実な配信と既読追跡を実装する方法を紹介します。
ステップ 1:SMSの「配信完了」と「既読」ステータスの違いを理解する
APIの統合に進む前に、SMSの配信完了(Delivered)と既読(Read)ステータスの技術的な違いを理解しておくことが重要です。従来のSMS技術は、数十年前に設計された携帯電話プロトコルに基づいています。この環境では、"ユーザーは160文字以下の短いステータス更新を使用して通信できる"ようになっています。このレガシーなインフラストラクチャのため、グローバルな通信ネットワークは「配信確認(デリバリーレシート)」のみをサポートしており、「開封」や「既読」の確認はサポートしていません。
これは、ネイティブの入力中表示や青い「既読」チェックマークを備え、"メッセージ、写真、ビデオを誰にでも送信できる自由な対話"が可能な現代のインスタントメッセージングアプリ(WhatsApp、iMessage、RCSなど)とは大きく異なります。標準的なキャリアSMSには、ユーザーがテキストメッセージをタップして開封したことをゲートウェイに通知するネイティブなネットワークパケットが存在しません。
そのため、代わりにゲートウェイプロバイダーによって定義されたSMSゲートウェイのステータスの意味(smsgate status meaning)に頼ることになります。以下は、SMSゲートウェイのログにおける一般的なステータスの意味です。
| ステータス | 技術的な意味 | 「既読」を意味するか? |
|---|---|---|
| Sent(送信済み) | メッセージがゲートウェイを離れ、携帯キャリアのネットワークに受け入れられました。 | いいえ。端末の電源が切れている可能性もあります。 |
| Delivered(配信完了) | 受信者の携帯端末が、受信を確認する応答をキャリアに返しました。これがSMS受信ステータス(sms receipts status)です。 | 必ずしもそうとは限りません。端末には届いていますが、まだ開封されていない可能性があります。 |
| Failed(送信失敗) | メッセージが端末に届きませんでした(例:使われていない電話番号、ネットワークのルーティングエラーなど)。 | いいえ。 |
メッセージが実際に読まれたかどうかを正確に追跡するために、企業はキャリアレベルの配信レポートと、アプリケーションレベルのスマート追跡リンクを組み合わせて使用します。これらについては、以降のステップで設定していきます。
ステップ 2:Android SMSゲートウェイをセットアップしてSMS配信ステータスを確認する
メッセージの追跡を開始するには、高額な法人契約に縛られることなく、配信レポートをネイティブに提供してくれるSMSゲートウェイが必要です。Twilioのような従来のゲートウェイでは、複雑なA2P 10DLC登録やキャリアの承認が必要で、セグメントごとにかかる費用も高額です。小規模ビジネスにとって、よりシンプルでコスト効率の高い代替手段となるのがMySMSGateです。
MySMSGateは、お使いのAndroidスマートフォンとSIMカードをSMSゲートウェイに変換します。ご自身のローカルの電話番号から送信するため、キャリアによる登録ブロックを回避でき、ダッシュボードやAPIから直接SMSの配信ステータスを簡単に確認(check sms delivery status)できます。
ゲートウェイをセットアップし、配信ステータスの追跡を開始するには、以下の手順に従ってください。
- MySMSGate登録ページにアクセスし、無料アカウントを作成します。
- スマートフォンにMySMSGateのAndroidアプリケーションをダウンロードしてインストールします。
- モバイルアプリを使用してWebダッシュボードに表示されるQRコードをスキャンし、スマートフォンを即座に連携します。APIキーを手動で入力する必要はありません。
- WebダッシュボードからテストSMSを送信します。
メッセージが送信されると、Androidスマートフォンはキャリアグレードの配信レポートをリアルタイムでMySMSGateダッシュボードに返します。メッセージの送信が失敗した場合、MySMSGateは自動的に残高を返金するため、運用コストを抑えることができます。
ステップ 3:Android SMSゲートウェイの配信レポート・ステータスコールバックWebhookを設定する
自社のCRM、予約エンジン、またはカスタムソフトウェアにSMS通知を統合する開発者にとって、配信ステータスを確認するためにAPIエンドポイントをポーリングすることは非効率的です。代わりに、Webhookを使用してAndroid SMSゲートウェイの配信レポート・ステータスコールバック(android-sms-gateway delivery reports status callback)を設定する必要があります。
このセクションでは、Webhook設定を使用してAPI WebhookからSMS配信ステータスを取得する方法(how to get sms delivery status from api webhook)を説明します。連携したAndroidスマートフォンが受信者の端末にメッセージを配信すると、ローカルキャリアから内部配信レポートを受信します。MySMSGateはこのイベントをキャプチャし、ステータスの更新を即座にサーバーにPOSTします。
以下は、PythonのFlaskアプリケーションでAndroid SMSゲートウェイの配信レポート・ステータスコールバックSMS(android-sms-gateway delivery reports status callback sms)のペイロードを処理する方法の例です。
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/webhooks/sms-status', methods=['POST'])
def handle_sms_status_callback():
data = request.json
# Extract key parameters from the MySMSGate webhook payload
message_id = data.get('message_id')
status = data.get('status') # e.g., 'delivered', 'failed', 'sent'
recipient = data.get('to')
error_code = data.get('error_code')
print(f"Message {message_id} to {recipient} updated to status: {status}")
if status == 'delivered':
# Update your database to mark notification as delivered
# update_booking_notification_status(message_id, 'Delivered')
pass
elif status == 'failed':
# Handle failed delivery (e.g., alert staff, retry via alternative channel)
# log_failed_delivery(message_id, error_code)
pass
return jsonify({"status": "success"}), 200
if __name__ == '__main__':
app.run(port=5000)このコールバックを実装することで、バックエンドアプリケーションは常に送信メッセージのリアルタイムステータスと同期されるため、配信に失敗した場合の自動フォローアップワークフローを構築できるようになります。
ステップ 4:スマートリンク追跡を使用して実際の「既読」ステータスを追跡する
標準のSMSプロトコルはネイティブの「既読」確認をサポートしていませんが、スマートなサービスビジネスを展開する企業は、顧客がメッセージを開封して読んだかどうかをどのように追跡しているのでしょうか?業界標準のソリューションは、スマートリンク追跡(Smart Link Tracking)です。
プレーンテキストのみを送信するのではなく、SMS内に固有の短縮追跡リンクを含めます。受信者がそのリンクをタップすると、追跡サーバーを一時的に経由してから、本来の遷移先(請求書、予約確認、予約詳細ページなど)にリダイレクトされます。このリダイレクトはミリ秒単位で行われ、これが「既読確認」の役割を果たします。
これを実装するためのステップバイステップのワークフローは以下の通りです。
- 一意のトークンを生成する: 送信するすべてのSMSに対して、短い一意の識別子(例:
myshop.co/r/x89D2)を生成します。 - データベースでトークンをマッピングする:
x89D2を受信者の電話番号、送信された特定のメッセージ、およびFalseに初期化された「既読」ステータスに関連付けます。 - SMSを送信する: MySMSGateのAPIまたはダッシュボードを介して、短縮URLを含むメッセージを送信します。
- リダイレクトをログに記録する: ユーザーがリンクをタップすると、サーバーは
x89D2へのリクエストを記録し、タイムスタンプとともにデータベースのレコードをRead = Trueに更新して、ユーザーを即座に実際のランディングページにリダイレクトします。
この方法により、100%正確な既読追跡が可能になり、ユーザーエンゲージメントに関する貴重なデータが得られるため、コミュニケーションテンプレートの最適化に役立ちます。
ステップ 5:ゲートウェイ間でのSMSステータス追跡の比較
ビジネス用のプラットフォームを選択する際、さまざまなゲートウェイが配信追跡、価格、システムの複雑さをどのように処理しているかを確認することが役立ちます。多くの開発者がTwilioのSMS配信ステータスコールバックチュートリアル(twilio sms delivery status callback tutorial)を検索しますが、基本的なローカル通知のためにTwilioのクラウドインフラを設定・維持することは、過度に複雑でコストがかかることに気づく場合が多いです。
以下は、MySMSGateと従来のクラウドゲートウェイの追跡機能と特徴の直接比較です。
| 機能 | MySMSGate | 従来のクラウドゲートウェイ(Twilio / Plivo) |
|---|---|---|
| 配信ステータスの追跡 | Webhookおよびダッシュボード経由でリアルタイム | Webhook経由でリアルタイム |
| 料金体系 | SMS1通あたり一律0.02ドル。月額料金なし。 | 従量制(SMS1通あたり0.05〜0.08ドル以上)+月額の番号レンタル料 |
| メッセージ長による課金 | 長さに関係なくメッセージ1通あたり一律料金 | 160文字のセグメントごとに課金(連結されたメッセージは2倍/3倍のコスト) |
| 送信元ID(Sender ID)& 10DLC登録 | 不要。ご自身のAndroid SIMから送信。 | 登録必須、キャリア手数料、厳格な承認による遅延あり |
| 送信失敗時の返金 | 配信失敗時は自動返金 | 返金なし。失敗した送信に対しても支払いが必要。 |
| セットアップの複雑さ | AndroidスマートフォンでQRコードをスキャンするだけ | 高度な技術的APIセットアップと規制上の検証が必要 |
米国国外で運営されているローカルサービスビジネスにとって、MySMSGateははるかに実用的なアプローチを提供します。代替オプションの詳細については、当社の包括的なガイドTwilioの代替サービス比較をご覧いただくか、コミュニケーション予算を最適化するために最安のSMS APIガイドをチェックしてください。
よくある質問
SMSの配信および既読ステータス追跡に関する最も一般的な質問への回答は以下の通りです。
SMSが既読または開封されたかどうかを確認することはできますか?
いいえ、標準的な携帯電話のSMSプロトコルはネイティブの既読確認をサポートしていません。SMSが読まれたかどうかを追跡するには、メッセージ本文に一意の短縮追跡リンクを含め、受信者がそのリンクをタップしたタイミングを監視する必要があります。
配信完了(Delivered)と既読(Read)ステータスの違いは何ですか?
配信完了ステータスは、キャリアネットワークが受信者の携帯端末にテキストメッセージを正常に転送したことを意味します。既読ステータスは、ユーザーがメッセージを実際に開いて閲覧したことを意味します。標準のSMSは配信のみを追跡するため、既読ステータスを追跡するにはアプリケーションレベルの追跡リンクが必要です。
MySMSGateを使用してリアルタイムの配信レポートを取得するにはどうすればよいですか?
MySMSGateは、お使いのAndroidスマートフォンのキャリアネットワークから配信レポートを直接アカウントに転送します。これらの配信ステータスは、Webダッシュボードでリアルタイムに確認するか、ステータスコールバックWebhookを設定してサーバーで即座にPOSTリクエストを受信することができます。
配信ステータスを追跡するために、キャリアの承認や10DLC登録は必要ですか?
いいえ。MySMSGateを使用する場合、ご自身のAndroidスマートフォンとSIMカードを介してメッセージを送信します。ご自身の個人用またはビジネス用の携帯電話回線を使用するため、メッセージの送信や追跡に10DLC登録、ブランド検証、キャリアの承認は必要ありません。
Comments (0)
Be the first to comment!