1. وبلاگ
  2. تجربه ها

تجربه پیاده سازی سامانه پیام کوتاه

روایت ساختن یک سامانه‌ی ارسال پیام کوتاه انبوه در سال‌های ۹۲ تا ۹۴: بررسی رقبا و اپراتورها، نوشتن پنل با PHP، پنل وایت‌لیبل، صف ارسال و مدل فروش.

سلام! می‌خوام از یکی از تجربه‌هام براتون بگم: راه‌اندازی یک سامانه‌ی ارسال پیام کوتاه انبوه و تبلیغاتی، با وب‌سرویس و کلی امکانات دیگه؛ چیزهایی مثل بانک مشاغل، ارسال انبوه، ارسال زمان‌بندی‌شده، پاسخ‌گویی هوشمند، دریافت پیامک و خیلی از امکاناتی که احتمالاً تو بازار دیدید.

یه نکته هم قبل از شروع: خیلی از موضوع‌هایی که اینجا بهشون اشاره می‌کنم جای ساعت‌ها حرف زدن دارن، ولی اینجا بیشترشون رو کوتاه و سطحی رد می‌شم. اگه یه بخش براتون جذاب بود، شاید بعداً جداگونه و عمیق‌تر درباره‌ش نوشتم.

قبل از هر چیز: رقبا رو بشناس

قبل از اینکه ارسال پیامک رو شروع کنیم یا حتی یک خط از پلتفرم رو بنویسیم، رفتیم بازار رو بررسی کردیم ببینیم چه رقبایی هستن و چه شرکت‌هایی دارن تو این حوزه کار می‌کنن. شرکت‌هایی مثل فراپیامک و مدیانا و ... اون موقع حسابی فعال بودن و مشتری‌های خیلی زیادی داشتن.

کنار این شرکت‌ها، کلی آدم هم بودن که خودشون ارسال پیامک انجام می‌دادن. اینا معمولاً از همین شرکت‌ها نمایندگی می‌گرفتن و خدمات رو توی محدوده‌ی جغرافیایی شهرشون، یا کنار کارهای دیگه‌شون، به مشتری می‌فروختن.

چرا این بررسی مهم بود؟ چون وقتی می‌خوای چیزی بسازی، باید رقیبت رو دقیق بشناسی. فرض کن یه شرکت قدیمی و شناخته‌شده با کلی مشتری، یه سری امکانات رو تو پنل پیامکش ارائه داده. تو اگه می‌خوای وارد این بازار بشی:

  • باید حداقل همون امکانات رو داشته باشی تا بتونی باهاش رقابت کنی.
  • باید مزیت‌ها و امکانات تازه‌ای هم بسازی که سیستمت رو متمایز و بهتر کنه.

همین مزیت‌های رقابتی بعداً تو تبلیغات و مخصوصاً تو جذب نماینده حسابی به کارمون اومد.

کاربرها دنبال چی بودن؟

وقتی می‌خوای یه سامانه‌ی ارسال پیامک بسازی، کلی فاکتور هست که برای کاربرها مهمه. اینا مهم‌ترین‌هاش بودن:

هزینه

مهم‌ترین چیز برای کاربر، پولیه که پرداخت می‌کنه. این هزینه چند بخش داشت:

  • قیمت هر پیامک: که بین اپراتورهای مختلف ارسال پیام کوتاه فرق داشت.
  • هزینه‌ی خود پنل: مبلغ سالانه یا ماهانه‌ای که شرکت بابت پنل می‌گرفت.
  • قیمت خطوط: یه سری خطوط عمومی بودن که رایگان در اختیار کاربر قرار می‌گرفتن، مخصوص ارسال پیامک تبلیغاتی. یه سری خطوط هم اختصاصی بودن که قابلیت دریافت داشتن؛ یعنی کاربری که خط اختصاصی می‌خرید می‌تونست با همون خط پیامک هم دریافت کنه. قیمت این خط‌ها هم بسته به اینکه شماره رُند باشه یا نه فرق می‌کرد.

پیام صوتی

اینکه پنل امکان ارسال پیام صوتی تبلیغاتی داره یا نه هم مهم بود. حتماً براتون پیش اومده که از یه شماره‌ای بهتون زنگ می‌زنن و یه پیام ضبط‌شده پخش می‌شه؛ این هم برای خیلی از کاربرها یه امتیاز حساب می‌شد.

پیامک خدماتی و لیست سیاه

خیلی‌ها پیامک تبلیغاتی رو مسدود کرده بودن و شماره‌شون تو لیست سیاه بود. برای ارسال به این شماره‌ها، باید خطوطی داشته باشی که بشه باهاشون پیامک خدماتی فرستاد. پیامک خدماتی معمولاً به درخواست خود کاربر ارسال می‌شه، مثل کدهای OTP، و جنبه‌ی تبلیغاتی نداره.

امکانات نرم‌افزاری

خود امکانات پنل هم خیلی مهم بود:

  • داشتن یا نداشتن وب‌سرویس
  • قابلیت دریافت پیامک
  • بانک شماره‌ها و اینکه چقدر به‌روز و دقیق باشن
  • بانک مشاغل کامل
  • ارسال زمان‌بندی‌شده
  • ارسال زمان‌دار

اپراتورها و پیش‌شماره‌ها

پشت تقریباً همه‌ی پنل‌های پیامک، شرکت‌هایی بودن که اپراتور پیامک حساب می‌شدن. شرکت‌هایی که پنل می‌ساختن، خدمات و وب‌سرویس‌شون رو بسته به سرشماره‌ی خطوطی که می‌خواستن، از این اپراتورها می‌گرفتن. اون زمان پیش‌شماره‌ها این‌طوری تقسیم شده بودن:

پیش‌شماره اپراتور
۱۰۰۰ رهیاب رایانه گستر
۲۰۰۰ آتیه داده پرداز
۳۰۰۰ مگفا
۵۰۰۰۱ و ۵۰۰۰۹ رهیاب پیام گستران
۵۰۰۰۲ و ۵۰۰۰۵ راهکار سرزمین هوشمند
۵۰۰۰۴ ارمغان راه طلایی

یه اپراتور دیگه هم بود به اسم آسانک که روی خطوط شخصی خودتون کار می‌کرد. مثلاً یه خط ثابت ۰۲۱ که مال کسب‌وکار یا شرکتتون بود رو معرفی می‌کردید و یه خط متناظرش در اختیارتون قرار می‌گرفت که می‌تونستید باهاش پیامک ارسال و دریافت کنید.

برای پیام صوتی (همون تماسی که برقرار می‌شه و پیام ضبط‌شده رو پخش می‌کنه) هم شرکت‌هایی بودن که توی مشهد خیلی قوی کار می‌کردن؛ مثل آوانک و آموت.

چرا تعرفه‌ها فرق داشت؟

قیمت خطوط و پیامک‌ها بین این شرکت‌ها یکی نبود. هر شرکتی که پنل ارائه می‌داد، بسته به حجم ارسال و خرید انبوهش از اپراتور، می‌تونست تخفیف بیشتر یا تعرفه‌ی پایین‌تری بگیره. برای همین بود که یه شرکت می‌تونست روی خطوط ۱۰۰۰، ۲۰۰۰، ۳۰۰۰ یا ۵۰۰۰ تعرفه‌های متفاوتی بده. این موضوع اون موقع مهم بود و هنوز هم هست.

ساختن پنل: از صفر یا سورس آماده؟

از نظر فنی دو تا راه داشتیم:

  1. خودمون کد رو بنویسیم: که کار زمان‌بری بود. یادتون باشه اون موقع خبری از هوش مصنوعی و ابزارهای امروزی نبود.
  2. از کد آماده‌ای که یکی دیگه نوشته استفاده کنیم: که اون هم هزینه‌ی خودش رو داشت. شرکت‌هایی که پنل پیامک ساخته بودن، سورسش رو با قیمت بالایی به رقبا می‌فروختن.

ما رفتیم سراغ نوشتنش با PHP، و ماه‌ها طول کشید تا کدهای پنل رو بنویسیم. باید وب‌سرویس‌های ارسال رو از اپراتورها می‌گرفتیم، مستنداتشون رو می‌خوندیم، محدودیت نرخ ارسال (Rate Limit) هر کدوم رو رعایت می‌کردیم و هر چیزی که تو مستنداتشون اومده بود رو پیاده می‌کردیم. فرایند خیلی زمان‌بری بود و چند ماه طول کشید.

ظاهر به‌روز و پیشنهاد مشتری‌ها

سعی کردیم پنل ظاهر به‌روزی داشته باشه. اون موقع تازه متریال دیزاین اومده بود و پنلی که با این سبک طراحی شده بود، چیز جذاب و به‌روزی حساب می‌شد. شاید الان که بهش نگاه کنید خیلی قدیمی به نظر بیاد، ولی همین ظاهر اون زمان می‌تونست ما رو از رقبا متمایز کنه.

مشتری‌ها و نماینده‌هامون هم خیلی کمکمون می‌کردن. کلی امکانات و ویژگی پیشنهاد می‌دادن برای بهتر شدن نرم‌افزار، و همین باعث می‌شد پنل هر روز در حال پیشرفت باشه. ویژگی‌هایی بهش اضافه شد که شاید تو پنل‌های دیگه پیدا نمی‌شد.

پنل پیام کوتاه
ظاهر کاملا بروز و زیبا اون زمان 😁

پنل وایت‌لیبل برای نماینده‌ها

یکی از ویژگی‌های جذاب پنل این بود که هر کسی می‌تونست یه نسخه‌ی وایت‌لیبل و شخصی‌سازی‌شده ازش داشته باشه. این قابلیت مخصوص نماینده‌هایی بود که پنل نمایندگی می‌گرفتن و می‌خواستن با دامنه و برند خودشون فروش کنن.

کارشون خیلی ساده بود: فقط یه رکورد A برای دامنه‌شون تعریف می‌کردن که به IP سرور ما اشاره کنه، بعد از داخل پنل رنگ‌بندی، تم، لوگو و بقیه‌ی جزئیات رو خودشون مدیریت می‌کردن. ساختن پنلی که این‌قدر قابل شخصی‌سازی بود و هر کسی می‌تونست به سلیقه‌ی خودش درش بیاره، تجربه‌ی خیلی خوبی بود.

زیر کاپوت

کار رو با PHP شروع کردیم. همه‌چیز کامل سمت سرور رندر می‌شد (Full SSR)؛ قالب‌ها داخل همون بک‌اند بودن و صفحه‌ها همون‌جا ساخته می‌شدن. با چیزهایی که این روزها می‌بینیم شاید قدیمی به نظر بیاد، ولی اون زمان روال کار همین بود و خوب هم جواب می‌داد؛ به‌خصوص که چندین نماینده‌ی ارسال پیام کوتاه داشتیم که توی جذب مشتری خیلی قوی بودن.

امکانات اصلی پنل
  • ارسال سریع پیامک
  • دفترچه تلفن: کاربرها می‌تونستن مخاطب‌هاشون رو وارد کنن یا فایل اکسل آپلود کنن.
  • کارت ویزیت درست کنن.
  • پاسخ‌گوی خودکار در بخش دریافت: پنل به یه کلمه‌ی خاص حساس می‌شد و با دیدنش جواب از پیش تعیین‌شده رو می‌فرستاد.
  • گزارش تحویل: اینکه پیامک به دست هر شماره رسیده یا نه.

هر کدوم از این‌ها جدا نوشته شده بود و تجربه‌ی فنی خیلی جذابی بود.

یه فیچر دوست‌داشتنی: ارسال تدریجی

یه بار یکی از مشتری‌ها ازمون خواست ارسال رو با تأخیر و مرحله‌ای انجام بدیم. مثلاً صد تا پیامک بفرسته، پونزده یا بیست دقیقه صبر کنه، بعد دوباره صد تای بعدی رو بفرسته.

این ویژگی به درد کال‌سنترها و کسب‌وکارهایی می‌خورد که پشتیبانی تلفنی دارن. وقتی پیام تبلیغاتی رو می‌فرستن، ممکنه همون لحظه کلی آدم زنگ بزنن، و چون تعداد پشتیبان‌هاشون محدوده، نمی‌خواستن همه‌ی پیامک‌ها یک‌جا ارسال بشه و خطوط ورودی تماس‌هاشون اشباع بشه.

چالش‌ها

قوانین اپراتورها و محدودیت های اعمالی

اپراتورها به الزام قانونی یه سری قوانین رو از ما می‌خواستن که باید تو کد پیاده می‌شد. مثلاً ارسال پیامکی که کلمات غیرمجاز، رکیک یا توهین‌آمیز داشت باید جلوش گرفته می‌شد.

جالبش اینجا بود که بعضی‌ها شیطنت می‌کردن و برای دور زدن محدودیت، وسط کلمه‌ها کاراکترهای اضافه می‌ذاشتن. حل کردن این مسئله برای من یه چالش جذاب بود.

صف ارسال و اولویت‌ها

چالش بعدی مدیریت صف‌های ارسال بود. فرض کنید یه کاربر داره ارسال انبوه تبلیغاتی انجام می‌ده و چند ده هزار یا چند صد هزار پیامک رو هم‌زمان می‌فرسته. همون لحظه یه کاربر دیگه می‌خواد یه پیامک خدماتی یا اطلاع‌رسانی رو فوری ارسال کنه که اصلاً نباید پشت اون صف بزرگ بمونه. از طرف دیگه، اپراتوری که داری باهاش ارسال می‌کنی هم برای خودش محدودیت نرخ ارسال داره.

اینا چالش‌های خیلی جذابی بودن که توی کار باهاشون روبه‌رو شدیم. راه‌حلش هم برنامه‌نویسی با صف‌ها (Queue) و مدیریت درستشون بود.

صف ارسال به صورت لحظه ای اقدام به کسر اعتبار کاربر میکرد و در گزارش های مالی کاربر هم اینو درج میکرد. و اگر کاربر چندین ارسال همزمان را اجرا میکرد اعتبار کافی برای ارسال نداشت. داخل دیتابیس های SQL اتمیک بودن کوئری های آپدیت وجود دارد ولی اگر همین مورد ساده (پیاده سازی یک قفل ساده با هر روشی) به درستی انجام نشه احتمال اینکه اعتبار کاربر منفی بشه وجود داره.

فروش و مدل درآمدی

نماینده‌ها موتور فروش بودن

بازاریابی و فروش پیامک بیشتر دست نماینده‌ها بود. یه نماینده توی یه شهر یا شهرستان، مشتری‌های محلی و مغازه‌دارها رو جذب می‌کرد. بیشترشون هم آژانس‌های تبلیغاتی یا کافی‌نت‌ها بودن، و خیلی وقت‌ها می‌دیدی عمده‌ی ارسال‌های یه شهر رو یه نفر انجام می‌ده.

اون زمان این‌طوری نبود که خود کسب‌وکارها با پنل پیامک آشنا باشن و مستقیم بیان خرید کنن. از نظر فنی براشون پیچیده بود و ترجیح می‌دادن کسی که کار رو بلده براشون انجام بده.

عمده‌ی فروش هم مربوط به پیامک تبلیغاتی بود و معمولاً دست کسایی بود که بازاریابی بلد بودن، پنل نمایندگی داشتن، تعرفه‌های خیلی پایینی می‌گرفتن و ارسال‌های انبوه انجام می‌دادن.

پنل رایگان، سود از هر پیامک

فروش خود پنل هم کار خیلی سودآوری بود و کسایی که پنل می‌فروختن و برای راه‌اندازی اولیه پول می‌گرفتن، سود خوبی می‌بردن. ولی تیم ما این‌طوری کار نمی‌کرد. ما کل مدل درآمدی رو گذاشته بودیم روی اینکه پنل رایگان داده بشه و سودمون از هر پیامک دربیاد.

تعدادی از نماینده ها پنل میفروختن و سود خوبی کسب میکردن.

اون موقع هزینه‌ی سرور و نگهداری خیلی پایین بود و این مدل جواب می‌داد و آدم‌ها می‌تونستن سود خیلی خوبی ازش ببرن. الان هزینه‌ها خیلی بالاتره و این مدل ممکنه دیگه توجیه اقتصادی نداشته باشه.

پلاگین‌ها و وب‌سرویس

یکی دیگه از مزیت‌های فنی که یه پنل پیامک می‌تونست داشته باشه، پلاگین‌های آماده بود؛ مخصوصاً برای وردپرس و ووکامرس که خیلی از فروشگاه‌ها باهاش ساخته شده بودن. صاحب سایت با یه کلیک حساب پنلش رو به سایتش وصل می‌کرد و شروع به استفاده می‌کرد.

این پلاگین‌ها از طریق وب‌سرویس به پنل وصل می‌شدن، و همین سرعت و پایداری وب‌سرویس یکی از معیارهای مهم بود برای اینکه کاربر تشخیص بده کدوم شرکت سرویس بهتری می‌ده.

جمع‌بندی

ساختن سامانه‌ی پیام کوتاه برای من فقط کدنویسی نبود؛ از شناخت بازار و رقبا و اپراتورها شروع شد، به طراحی پنل و قابلیت‌هایی مثل وایت‌لیبل و ارسال تدریجی رسید، و با چالش‌های واقعی مثل صف ارسال و محدودیت کلمات ادامه پیدا کرد. خیلی از ابزارها و شرایط اون زمان امروز عوض شده، ولی درس اصلیش هنوز سر جاشه: رقیبت رو بشناس، به حرف مشتری گوش بده و چیزی بساز که واقعاً مشکلش رو حل کنه.