نرمافزارهای ایدهپو
بستر مارکتپلیس چندفروشندگی: آمادهی بهرهبرداری، نه آمادهی شروع
یک پلتفرم کامل با سه محصول در دل آن — فروشگاه، پنل فروشنده و پنل اپراتور — با تسویهی چندفروشنده، فاکتور قانونی، جستوجوی وجهی روی Elasticsearch و پنج زبان که دو تای آنها راستبهچپاند. در حال بهرهبرداری در بازار آلمان.
چرا ساختن مارکتپلیس از صفر، اشتباه گرانی است
سبد خرید سخت نیست. آنچه یک مارکتپلیس را سخت میکند، چیزهایی است که فقط وقتی پول واقعی جابهجا میشود خودشان را نشان میدهند: سفارشی که بین چهار فروشنده تقسیم شده و هر بخش ارسال و مرجوعی مستقل دارد؛ کمیسیونی که باید در لحظهی درست محاسبه و تا زمان پایان مهلت مرجوع نگه داشته شود؛ فاکتوری که شمارهاش نباید حفره داشته باشد؛ و دفتری که ممیز مالیاتی باید بتواند دنبالش کند و هیچ کدی نباید بتواند بیصدا بازنویسیاش کند.
این بستر آنها را دارد، چون در یک بازار واقعی و سختگیر — آلمان — ساخته و در بهرهبرداری آزموده شده است. عددها از خود مخزن کد شمرده شدهاند: 62,275 خط C# در 486 فایل، 36,426 خط TypeScript، 238 نقطهی پایانی در 19 ماژول، 15 زمینهی محدود با دادهی مستقل، 74 اگریگیت دامنه، 49 مایگریشن و 845 تست خودکار.
اگر بهجای خرید بستر، یک مارکتپلیس اختصاصی از پایه میخواهید، خدمات طراحی مارکتپلیس همان کار را انجام میدهد؛ این صفحه دربارهی خریدِ بستری است که از قبل ساخته شده.
سه محصول در یک پلتفرم
فروشگاه (Storefront)
جستوجوی وجهی روی Elasticsearch با برند، دسته، مبدأ، ارگانیک و قیمت — و خانوادههای تنوع کالا که در یک کارت جمع میشوند. صفحهی کالا با گالری، محورهای تنوع، ویژگیهای تایپدار، نظرات و پرسش خریدار. پرداخت مهمان و عضو، ارسال به تفکیک فروشنده، پرداخت میزبانیشده. پلکان عمدهفروشی، مقایسه، فهرست علاقهمندی و ریل پیشنهاد هفتگی.
پنل فروشنده
ثبتنام با احراز هویت کسبوکار: هویت حقوقی، شمارهی ثبت، شناسهی مالیاتی، اطلاعات بانکی و بررسی مدارک. درج کالا روی کاتالوگ مشترک یا پیشنهاد کالای جدید برای بررسی. ورود گروهی با CSV. کمپین و کوپن، قیمت عمده، تغییر قیمت زمانبندیشده. بستهبندی، تحویل به پست، رهگیری، مرجوعی و تصمیم RMA. کمیسیون، نگهداشت ذخیره تا پایان مهلت مرجوع، بدهی و صورتحساب تسویه.
پنل اپراتور
حاکمیت کاتالوگ: نوع کالا، مجموعهی ویژگیها، درخت دسته، خانوادهی تنوع و صف تأیید. تأیید فروشگاه و بررسی مدارک. مدیریت نظرات و پرسشها و رسیدگی به گزارش تخلف. صف فاکتور — فاکتور فروشنده پیش از صدور و شمارهگذاری تأیید میشود. مالیات به تفکیک نرخ و نوع سند، نظارت بر تسویه و اجرای پرداخت. رد حسابرسی، قواعد نگهداشت داده و کارتابل انطباق برای نقصهای کاتالوگ.
آنچه این بستر را از یک قالب فروشگاهی جدا میکند
قیمت، حساب است — نه یک عدد تایپشده. قیمت واحد از قیمتی که خریدار امروز واقعاً میپردازد محاسبه میشود، پس شروع یک کمپین، رقم هر کیلو را هم با خودش جابهجا میکند. ودیعهی ظرف یک مؤلفهی جداست با رفتار مالیاتی خودش، از پیشفاکتور سبد تا سطر فاکتور و بازپرداخت؛ هیچوقت در قیمت کالا حل نمیشود. تاریخچهی قیمت هر پیشنهاد ثبت میشود تا «کمترین قیمت 30 روز گذشته» از قیمتِ در جریانِ ابتدای بازه خوانده شود، نه فقط از تغییرهای داخل آن.
پول یک شیء ارزشی است، نه یک اعشار. در سراسر سامانه Money است و نه decimal، با یک قاعدهی گِرد کردن که یک بار روی هر سطر اعمال میشود. جمعها از پیشفاکتور به سفارش، به فاکتور و به تسویه منتقل میشوند، نه اینکه در هر مرحله دوباره حساب شوند — چون دو بار محاسبهی یک عدد، دیر یا زود با هم اختلاف پیدا میکنند.
سیاست در لحظهی فروش عکس گرفته میشود. مهلت مرجوعی از ردهی سیاستی میآید که در لحظهی خرید به پیشنهاد چسبیده است، پس تغییر بعدی سیاست نمیتواند آنچه به خریدار قول داده شده را بازنویسی کند.
انطباق، بهشکل قاعدهی دامنه — نه یک تیک
قیمت واحد
قیمت هر کیلو/لیتر از قیمت قابل پرداخت محاسبه میشود و در کارت فهرست و صفحهی کالا یکی است. (PAngV § 4)
ودیعهی جداگانه
ودیعه از پیشفاکتور تا سطر فاکتور و بازپرداخت، مؤلفهی مستقل خودش را دارد. (PAngV § 7)
کمترین قیمت 30 روز
تاریخچهی قیمت بهازای هر پیشنهاد نگه داشته میشود و رقم بازه درست خوانده میشود. (PAngV § 11)
فاکتور بدون حفره
شمارهگذاری پیوسته بهازای هر صادرکننده، زیر قفل سطر. فاکتوری که فیلد الزامی کم دارد، اصلاً شماره نمیگیرد. (§ 14 UStG)
سند اصلاحی
اصلاحیه مشخصات فاکتور مرجع را تکرار میکند و مالیات را با همان نرخی که رفته برمیگرداند، به تفکیک نرخ. (§ 17 UStG)
دفتر غیرقابل تغییر
دفتر تسویه در سطح پایگاه داده UPDATE و DELETE را رد میکند؛ اصلاح فقط با سند متقابل. (GoBD)
اطلاعات مواد غذایی
حساسیتزاها، مبدأ و مقدار خالص فیلدهای تایپدار کاتالوگاند، نه متن آزاد — پس قابل فیلتر و اعتبارسنجیاند. (LMIV)
حریم خصوصی
خط لولهی درخواست دادهی کاربر روی همهی زمینهها پخش میشود، با تأیید هویت ایمیلی، ساعت SLA و شفافیت دستههای نگهداشتهشده. (GDPR)
هویت فروشنده و گزارش تخلف
هویت حقوقی فروشنده روی صفحهی فروشگاه عمومی است؛ گزارش تخلف به کارشناس ارجاع میشود، نه حذف خودکار. (DSA)
هر ردیف بالا یک قاعده در لایهی دامنه است با تستی که اگر آن قاعده برداشته شود، شکست میخورد. این مهم است: انطباقی که فقط در رابط کاربری اجرا شده باشد، اولین باری که کسی از راه API سفارش ثبت کند از بین میرود.
اگر بازار هدف شما آلمان یا اتحادیهی اروپا نیست، همین ساختار قابل تنظیم است: قواعد در لایهی دامنهاند و بهازای بازار تعویض میشوند.
معماری: پانزده زمینهی محدود، هرکدام با دادهی خودش
مرزهای واقعی
هویت، کاتالوگ، فروشندگان، پیشنهاد، قیمتگذاری، سبد، پرداخت، سفارش، فاکتور، تسویه، مرجوعی، نظرات، اعلان، انطباق و مدیریت — هر زمینه اسکیمای خودش و DbContext خودش را دارد. هیچ کوئریای با join از مرز رد نمیشود.
ارتباط با رویداد و Outbox
زمینهها با رویدادهای دامنه حرف میزنند که با outbox تراکنشی تحویل داده میشوند؛ خطا در یکی، دیگری را برنمیگرداند و هیچ رویدادی گم نمیشود.
درستی زیر بار
هرچه دربارهی پول تصمیم میگیرد — مصرف کوپن، پرداخت به فروشنده، شمارهگذاری فاکتور — قفل سطر در تراکنش صریح میگیرد، با تستهای همروندی که درخواستهای موازی واقعی را روی پایگاه دادهی واقعی اجرا میکنند.
یک تعریف برای هر قاعده
وقتی دو صفحه به یک جواب نیاز دارند — تعداد بسته، قیمت مؤثر، کلید کش — هر دو یک تابع را صدا میزنند. و همین ثابت مستقیم تست میشود: عددی که فهرست میگوید با عددی که صفحهی کالا میگوید یکی است.
کارهای پسزمینه
ده سرویس میزبان برای آنچه شکل درخواست ندارد: توزیع outbox، ارسال ایمیل، جاروی انقضای پرداخت و رزرو موجودی، آزادسازی ذخیره، اعمال نگهداشت داده، و زمانبند قیمت که کمپینها را شروع و تمام میکند.
845 تست
تستهای یکپارچگی اپلیکیشن واقعی را روی PostgreSQL و Redis در کانتینر بالا میآورند. معیار در سراسر پروژه یکی بوده: تستی جا دارد که اگر اصلاحِ زیر آن را برگردانی، شکست بخورد.
پشتهی فناوری
- بکاند — .NET 10 با MediatR، EF Core و FluentValidation؛ هشدارها بهعنوان خطا، تحلیلگر API ممنوعه، 49 مایگریشن نسخهدار.
- داده — PostgreSQL 17 برای وضعیت، Redis 7 برای کش و محدودیت نرخ توزیعشده، Elasticsearch 8.15 برای جستوجو و وجهها.
- فروشگاه — Next.js 15 با App Router و کامپوننتهای سمت سرور، next-intl روی پنج زبان، متای سئو و نقشهی سایت.
- پنلها — React با Vite، TanStack Query و react-router، روی یک کلاینت API تایپدار مشترک و یک سیستم طراحی 20 کامپوننتی.
- پرداخت— درگاه میزبانیشده با وبهوک و صندوق ورودی برای ایمنی در برابر تکرار، بازپرداخت و مدیریت چارجبک.
- استقرار — Docker Compose، پروکسی nginx، CDN، و سرور ایمیل با SPF و DKIM و DMARC.
پنج زبان، دو تا راستبهچپ
فارسی و عربی یک لایهی ترجمه روی طراحی چپبهراست نیستند. کل رابط آینه میشود: چیدمان با ویژگیهای منطقی CSS ساخته شده، پس فاصله، حاشیه و آیکون بدون یک شیوهنامهی دوم برمیگردند. تاریخ و عدد از دادهی محلی خود مرورگر میآید — یعنی خریدار فارسیزبان تاریخ تحویل را با تقویم جلالی و ارقام فارسی میبیند و خریدار عربزبان معادل هجری را، نه چون برایشان استثنا نوشته شده، بلکه چون معنای آن زبان همین است.
نوزده قالب ایمیل تراکنشی در هر پنج زبان نوشته شدهاند و با جهت نوشتار خود گیرنده و از دامنهی ایمیل احراز شده ارسال میشوند.
چه چیزی تحویل میگیرید
بستر، مستقر و کارکن
استقرار روی زیرساخت شما با Docker Compose، همراه مایگریشنها و دادهی اولیه.
برند و پوستهی شما
رنگ، لوگو، تایپوگرافی و صفحهی نخست روی سیستم طراحی موجود — اینها در قیمت پایه هستند. طراحی کاملاً اختصاصی از صفر، جداگانه برآورد میشود.
زبانها و بازار شما
پنج زبان آماده است؛ افزودن زبان و تنظیم قواعد انطباق برای بازار مقصد کار مشخصی است با برآورد جدا.
کاتالوگ و انتقال داده
ورود کاتالوگ، فروشندگان و کاربران از سیستم فعلی؛ ورود گروهی پیشنهادها و موجودی با CSV در خود پنل فروشنده هست.
آموزش و مستندات
آموزش تیم اپراتور و تیم پشتیبانی فروشندگان.
پشتیبانی و بهروزرسانی
رفع اشکال، بهروزرسانی امنیتی و نسخههای جدید بستر. پشتیبانی سالانه 20٪ مبلغ راهاندازی است.
بستر آماده یا طراحی مارکتپلیس از صفر؟
دو مسیر داریم و مرزشان روشن است:
- بستر آماده (این صفحه): فروشگاه، پنل فروشنده و پنل اپراتور از قبل ساخته و در حال بهرهبرداریاند؛ روی مدل کسبوکار شما تنظیم میشود. سریعتر و ارزانتر، وقتی مدل شما مارکتپلیس کلاسیک است.
- [طراحی مارکتپلیس از صفر](/services/marketplace): وقتی تسویه، نقشها یا جریان سفارش شما با هیچ بستری نمیخواند — از 450 میلیون تا 1.2 میلیارد تومان.
پلازمارکت نمونهی زندهی همین بستر در آلمان است. مقالهی تسویه با فروشنده در مارکتپلیس توضیح میدهد چرا کمیسیون و نگهداشت ذخیره باید در مدل دامنه باشد، نه در یک اکسل.
پرسشهای متداول
کد مال ما میشود؟
سه شکل ممکن است: لایسنس بهرهبرداری برای استفادهی خودتان، واگذاری سورسکد در چارچوب قرارداد با تعهد عدم انتشار، و انحصار در یک بازار جغرافیایی یا یک دستهی کالایی. هر سه ارائه میشوند و انتخاب بینشان روی قیمت اثر میگذارد؛ شکل نهایی در قرارداد مشخص میشود.
چقدر طول میکشد تا راه بیفتد؟
بستر آماده است؛ زمان صرف برند و پوسته، کاتالوگ، درگاه پرداخت و تنظیم قواعد بازار مقصد میشود. بازهی معمول 4 تا 8 هفته بسته به دامنه.
فقط مواد غذایی است؟
خیر. مدل کاتالوگ با نوع کالا، مجموعهی ویژگیها و خانوادهی تنوع عمومی است؛ آنچه مخصوص غذاست — حساسیتزا، مبدأ، مقدار خالص، ودیعه — یک مجموعهی ویژگی است که برای دستهی دیگر عوض میشود. پوشاک با سایز و رنگ، قطعات با کد فنی، همه روی همان مدل مینشینند.
قواعد مالیاتی و فاکتور ایران را پشتیبانی میکند؟
ساختار برای این کار درست است — فاکتور، شمارهگذاری، اصلاحیه و دفتر تسویه همه در لایهی دامنهاند و بهازای بازار تعویض میشوند — ولی قواعد فعلی آلمان و اتحادیهی اروپا پیاده شدهاند.
چند فروشنده و چند کالا را میکشد؟
جستوجو روی Elasticsearch است و وضعیت روی PostgreSQL با کش Redis؛ محدودیت عملی از زیرساختی میآید که رویش مستقر میشود، نه از معماری.
قیمت چقدر است؟
راهاندازی از 450 میلیون تومان و پشتیبانی سالانه 20٪ مبلغ راهاندازی. شکل واگذاری — لایسنس بهرهبرداری، واگذاری سورسکد، یا انحصار در یک بازار یا دستهی کالایی — در قرارداد مشخص میشود و روی رقم اثر دارد. عدد نهایی بعد از یک جلسهی دمو و روشنشدن بازار مقصد، زبانها و درگاهها اعلام میشود.
بستر را در حال کار ببینید
یک دموی زنده روی نسخهی مستقر: سفارش چندفروشندهای بدهید، تقسیم پول را ببینید، فاکتور و سند اصلاحی را نگاه کنید.
بازار هدف، زبانهای مورد نیاز و دستهی کالایی — همین سه پاسخ برای تنظیم دمو و یک برآورد اولیه کافی است.

