শুধু একটা POS নয় — এটি একটি সম্পূর্ণ Retail Operating System। এই ডকুমেন্টে পুরো প্রজেক্টের build order, ৭৮টি পেজের ইনভেন্টরি, টেক স্ট্যাক এবং প্রথম sprint-এর deliverable একসাথে সাজানো আছে, যাতে ধাপে ধাপে production-quality আকারে তৈরি করা যায়।
RetailOS-কে সাধারণ POS সফটওয়্যার থেকে আলাদা করে তুলবে এই তিনটি বিষয় — প্রতিটি design ও দেcision এই তিনটির উপর ভিত্তি করে নেওয়া উচিত।
বিক্রি সম্পূর্ণ করতে ৫–১০ সেকেন্ডের বেশি না লাগে — barcode scan থেকে invoice print পর্যন্ত পুরো flow অপ্টিমাইজড হতে হবে।
কাস্টমার কী কিনছে, কখন আবার লাগবে — Smart Consumption Engine স্বয়ংক্রিয়ভাবে হিসাব করে reminder পাঠাবে (Call / WhatsApp / Delivery)।
হাজার হাজার দোকান একই কোডবেস ব্যবহার করবে, কিন্তু প্রত্যেকের ডেটা সম্পূর্ণ isolated ও secure থাকবে।
প্রতিটি ধাপ আগেরটির উপর নির্ভরশীল — আগে architecture ও business rules ঠিক হলে, তারপর UI Kit শক্ত হলে বাকি সব module সহজে বসে যাবে। নিচের প্রতিটি ধাপের পাশে যে সপ্তাহ-সংখ্যা দেওয়া আছে, সেটা মূলত UI prototype / বেসিক flow বসানোর ধারণাগত সময় — পুরো production-ready SaaS বানাতে এর চেয়ে অনেক বেশি সময় লাগবে, যেটা নিচের বাস্তবসম্মত টেবিলে ভাঙা হলো।
| Target | Estimated time |
|---|---|
| UI prototype | 8–12 weeks |
| Functional MVP | 4–6 months |
| Production SaaS | 8–12 months |
নিচের ৬টি ধাপ ও সপ্তাহ-সংখ্যা মূলত UI prototype ধাপের ব্রেকডাউন — প্রতিটি ফিচার পুরোপুরি কাজ করা, টেস্ট করা, বাগ-ফ্রি ও প্রোডাকশনে ডিপ্লয় করার মতো অবস্থায় আনতে সময় স্বাভাবিকভাবেই আরও বাড়বে।
প্রতিটি module কার্ডে ক্লিক করলে সেই module-এর সব পেজের তালিকা দেখা যাবে।
প্রতিটি core feature-এর জন্য User, Actions, Business Rules, Permissions ও Acceptance Criteria — যাতে Laravel port করার সময় প্রতিটি behavior স্পষ্টভাবে define করা থাকে এবং কোনো edge-case বাদ না যায়।
শুধু POS page বানালেই হবে না — sale-এর প্রতিটা state change (draft → complete → return/cancel)-এ stock ও ledger ঠিকভাবে move করতে হবে। এই নিয়মগুলো Phase 0-এর business rules doc-এ চূড়ান্ত করে, POS development শুরুর আগেই সবার জানা থাকতে হবে।
Negative stock policy — stock শূন্য বা তার নিচে নেমে গেলে sale allow করা হবে কিনা, সেটা POS coding শুরুর আগেই নির্ধারণ করতে হবে। সাধারণত তিনটি অপশন থাকে:
দোকানে internet সমস্যা হতে পারে জেনেও, scope অস্পষ্ট রাখলে customer expectation ও development effort দুটোই অনিয়ন্ত্রিতভাবে বেড়ে যায় — তাই এই সিদ্ধান্ত Phase 0-তেই লিখিতভাবে চূড়ান্ত:
AdminLTE-ধাঁচের আধুনিক Bootstrap 5 dashboard — পরে Laravel/PHP-এ সহজে যুক্ত করার জন্য প্রতিটি HTML পেজ modular partial (header/sidebar/footer) দিয়ে বানানো হবে।
প্রথম ধাপের ১০টি deliverable — production-quality আকারে, একটি একটি করে।
চারটি স্তর — প্রতিটি স্তরে এমন feature যোগ করা আছে যা পরবর্তী স্তরে upgrade করার একটা স্পষ্ট কারণ তৈরি করে।
| Feature | Starter | Business | Premium | Enterprise |
|---|---|---|---|---|
| দোকানের সংখ্যা | 1 | 1 | 1 | Unlimited |
| Users / Employees | 2 | 10 | Unlimited | Unlimited |
| POS Sales | ✓ | ✓ | ✓ | ✓ |
| Product Management | ✓ | ✓ | ✓ | ✓ |
| Inventory | ✓ | ✓ | ✓ | ✓ |
| Barcode | — | ✓ | ✓ | ✓ |
| Purchase Management | ✓ | ✓ | ✓ | ✓ |
| Supplier Management | ✓ | ✓ | ✓ | ✓ |
| Customer Management | ✓ | ✓ | ✓ | ✓ |
| Due Management | ✓ | ✓ | ✓ | ✓ |
| Expense Management | ✓ | ✓ | ✓ | ✓ |
| Profit & Loss | Daily | Daily+Monthly | Full | Full |
| GST Balance Sheet (Optional) | — | Optional | Optional | Optional |
| Reports | Basic | Advanced | All | All |
| Low Stock Alert | ✓ | ✓ | ✓ | ✓ |
| Online Shop | — | Basic | Full | Full |
| Custom Domain | — | — | ✓ | ✓ |
| CRM | — | Basic | Advanced | Advanced |
| Lead Management | — | ✓ | ✓ | ✓ |
| Smart Reminder | — | — | ✓ | ✓ |
| Customer Consumption Prediction | — | — | ✓ | ✓ |
| WhatsApp Integration | — | — | ✓ | ✓ |
| SMS Notification | — | Add-on | ✓ | ✓ |
| Mobile App | — | View Only | Full | Full |
| Multi Branch | — | — | 3 Branch | Unlimited |
| API Access | — | — | Limited | Full |
| Backup | Weekly | Daily | Real-time | Real-time |
| Priority Support | — | Dedicated |
বাজারে অনেক POS আছে, কিন্তু এমন সফটওয়্যার খুব কম আছে যা দোকানদারকে আগে থেকেই বলে দেয় — কোন কাস্টমারের কোন পণ্য শেষ হতে যাচ্ছে, এবং সেখান থেকেই সরাসরি Call, WhatsApp বা Delivery শুরু করার সুযোগ দেয়। Smart CRM + Smart Consumption Engine-কে RetailOS-এর প্রধান USP (Unique Selling Point) হিসেবে তুলে ধরা উচিত।
Setup + Training fee-এর কাঠামো ভালো, কিন্তু recurring মূল্য টিকিয়ে রাখতে হলে জানতে হবে প্রতি সক্রিয় দোকানের পেছনে মাসে কত খরচ যাচ্ছে। নিচের সংখ্যাগুলো একটা illustrative cost model — লাইভ হওয়ার পর real usage data দিয়ে প্রতি quarter-এ আপডেট করতে হবে।
| খরচের খাত (প্রতি active shop / মাস) | আনুমানিক |
|---|---|
| Server & Hosting (shared infra, amortized) | ₹35 |
| Database (managed, indexing overhead) | ₹20 |
| Backup (daily + 6-hourly, object storage) | ₹10 |
| SMS / WhatsApp (গড় ব্যবহার অনুযায়ী) | ₹45 |
| Support (agent time, amortized) | ₹70 |
| Payment Gateway Fee (~2% billing amount) | ₹15 |
| GST / Compliance (accounting, filing tools) | ₹15 |
| = Cost per Active Shop / মাস | ₹210 |
| Plan | ARPU / মাস | Cost / মাস | Gross Margin | 70%+ Target |
|---|---|---|---|---|
| Starter | ₹499 | ₹210 | ~58% | ❌ Miss |
| Business | ₹999 | ₹210 | ~79% | ✅ Meets |
| Premium | ₹1,999 | ₹210 | ~89% | ✅ Meets |
| Enterprise | Custom | Custom-scoped | Negotiated | Case-by-case |
মার্কেটিং, সেলস effort ও onboarding সময় মিলিয়ে প্রতি নতুন shop-এ আনুমানিক খরচ — one-time Setup Fee (₹1,999–4,999) দিয়ে অনেকটাই cover হয়ে যায়।
Setup Fee প্রথম মাসেই বেশিরভাগ CAC রিকভার করে; বাকিটা Business/Premium প্ল্যানের মাসিক margin দিয়ে ২–৩ মাসের মধ্যে পুরোপুরি পুষিয়ে যায়।
গড় গ্রাহক-আয়ু ~২০ মাস ধরে হিসাব — ₹789 মাসিক margin × ২০ মাস। Starter-only গ্রাহকের LTV উল্লেখযোগ্যভাবে কম, তাই upgrade path জরুরি।
সাধারণ SaaS benchmark ৩:১ বা তার বেশি হলে স্বাস্থ্যকর ধরা হয় — Business/Premium মিশ্রণে এই অনুপাত যথেষ্ট ভালো, কিন্তু শুধু Starter-নির্ভর হলে এই ratio অনেক নেমে যাবে।
মূল সাবস্ক্রিপশনের বাইরে আলাদাভাবে বিক্রি করার মতো অতিরিক্ত আয়ের সুযোগ।
Plan & Pricing স্তরটা ঠিক আছে, কিন্তু "টাকা না দিলে কী হবে" — এই operational rules-গুলো Phase 0-তেই নির্ধারণ করে রাখতে হবে, নাহলে প্রথম failed-payment কেসেই ম্যানুয়ালি সিদ্ধান্ত নিতে হবে।
| Plan | Monthly | Yearly |
|---|---|---|
| Starter | ₹499/mo | ₹4,990/yr |
| Business | ₹999/mo | ₹9,990/yr |
| Premium | ₹1,999/mo | ₹19,990/yr |
| Enterprise | Custom | Custom (yearly-only discount নেগোশিয়েবল) |
নিয়ম: বার্ষিক প্ল্যানের দাম সবসময় মাসিক দামের ১০ গুণ (অর্থাৎ ১২ মাসের মধ্যে ২ মাস ফ্রি) — নতুন প্ল্যান যোগ হলেও এই সূত্র অনুসরণ করা হবে।
১৪ দিন — কোনো কার্ড/পেমেন্ট তথ্য ছাড়াই Business প্ল্যানের ফিচার unlock করে দেখা যাবে। ট্রায়াল শেষে পেমেন্ট না করলে স্বয়ংক্রিয়ভাবে সবচেয়ে সীমিত (Starter) স্তরে নেমে আসবে, ডেটা মুছে যাবে না।
নির্ধারিত তারিখে পেমেন্ট না হলে ৭ দিনের grace period — এই সময়ে সফটওয়্যার স্বাভাবিকভাবে কাজ করবে, শুধু একটা reminder banner দেখাবে।
Grace period শেষ হলে অ্যাকাউন্ট Read-only mode-এ যাবে — বিদ্যমান ডেটা দেখা/এক্সপোর্ট করা যাবে, কিন্তু নতুন Sale/Purchase এন্ট্রি বন্ধ থাকবে।
মাসের মাঝপথে upgrade করলে বাকি দিনগুলোর জন্য pro-rata হিসেবে extra amount চার্জ হবে — পরের বিলিং সাইকেল থেকে নতুন প্ল্যানের পূর্ণ দাম কার্যকর হবে।
Downgrade সবসময় চলতি বিলিং সাইকেল শেষে কার্যকর হবে (তাৎক্ষণিক না) — এবং higher plan-এর কোনো ডেটা (যেমন Extra Branch, Extra Employee) লিমিট অতিক্রম করলে আগে সেটা কমাতে হবে।
সব সাবস্ক্রিপশন প্রাইস GST-exclusive হিসেবে দেখানো হবে; ইনভয়েসে প্রযোজ্য GST% আলাদাভাবে যোগ হবে এবং গ্রাহকের GSTIN (থাকলে) ইনভয়েসে উল্লেখ থাকবে।
প্রতিটা সফল পেমেন্টের পর স্বয়ংক্রিয়ভাবে একটা GST-compliant invoice তৈরি ও গ্রাহকের ইমেইলে পাঠানো হবে, এবং Dashboard থেকে ডাউনলোড/reprint করা যাবে।
পেমেন্ট মিস হলে ঠিক কী ঘটবে, কোন দিনে কী স্টেট বদলাবে — এই timeline প্রতিটা subscription-এর জন্য অটোমেটেড থাকবে।
শুধু মাসিক সাবস্ক্রিপশন না — প্রথম ব্যবহারেই গ্রাহককে confident করে তোলার জন্য একটি One-time Setup + Training কাঠামো, যা ব্যবসা বাড়ার সাথে সাথে ধাপে ধাপে বাড়ানো যাবে।
| খরচের ধরন | মূল্য |
|---|---|
| Setup + Training Fee (One-time) | ₹2,999 – ₹4,999 |
| Starter Plan | ₹499/মাস |
| Business Plan | ₹999/মাস |
| Premium Plan | ₹1,999/মাস |
প্রতিটি গ্রাহককে নিজে ৭ দিন ধরে শেখালে ১০০–২০০ জন গ্রাহক হলে সময় সামলানো কঠিন হবে। তাই শুরু থেকেই তৈরি রাখুন:
তাহলে আপনাকে শুধু জটিল সমস্যাগুলোতে সাহায্য করতে হবে।
উপরের ৭ দিনের training একজন মানুষ চালালে ভালো লাগে, কিন্তু স্কেল করে না। তাই মূল onboarding journey-টা একটা automated trigger sequence হিসেবে বানানো হবে — সিস্টেম নিজেই সঠিক সময়ে সঠিক নাজ (in-app checklist + email/WhatsApp) পাঠাবে, মানুষ শুধু যেখানে আটকে আছে সেখানেই ঢুকবে।
Dashboard-এ একটা persistent progress checklist থাকবে ("৩/৬ ধাপ সম্পন্ন") — গ্রাহক নিজে দেখতে পারবে কোথায় আছেন, সাপোর্টকে জিজ্ঞেস না করেই।
প্রতিটা Day-milestone অনুযায়ী নির্দিষ্ট সময়ে email + WhatsApp reminder স্বয়ংক্রিয়ভাবে যাবে — কোনো human trigger লাগবে না।
নির্ধারিত Day-এ প্রত্যাশিত অ্যাকশন (যেমন প্রথম Sale) না হলে সেটা "stuck" হিসেবে চিহ্নিত হবে ও পরদিন একটা follow-up নাজ যাবে।
Day 7-এর completion check-এ checklist অসম্পূর্ণ থাকলে সেই অ্যাকাউন্ট স্বয়ংক্রিয়ভাবে support queue-তে flag হবে — শুধু তখনই মানুষ ম্যানুয়ালি ফোন/WhatsApp করবে।
কোন ধাপে সবচেয়ে বেশি গ্রাহক আটকে যাচ্ছে (drop-off point) তা ড্যাশবোর্ডে ট্র্যাক হবে — যাতে নাজ/tutorial নিয়মিত উন্নত করা যায়।
Day 7-এ সব ধাপ সম্পন্ন হলে অ্যাকাউন্ট "Onboarded" ট্যাগ পাবে — CRM/support-এর কাছে এটা একটা সংকেত যে এই গ্রাহকের basic হ্যান্ডহোল্ডিং লাগবে না।
একটাই কোডবেস, একটাই সার্ভার — কিন্তু প্রতিটা দোকানের ডেটা সম্পূর্ণ আলাদা, সুরক্ষিত ও strict নিয়মে isolated। সোর্স কোড আলাদাভাবে কাউকে দেওয়ার দরকার নেই।
সাইনআপ করলেই স্বয়ংক্রিয়ভাবে একটা subdomain তৈরি হবে — কোনো এক্সট্রা কনফিগারেশন লাগে না।
নিজস্ব ডোমেইন (DNS-এ CNAME পয়েন্ট করানো) কানেক্ট করা যাবে — নতুন সার্ভার লাগে না, শুধু কনফিগারেশন।
Shared database মডেলে একটা মাত্র query-র ভুল পুরো tenant isolation ভেঙে দিতে পারে। তাই এই নিয়মগুলো কোনো module-এর জন্যই optional নয় — Phase 0 architecture doc-এর অংশ হিসেবে দিন থেকেই enforce করতে হবে।
ORM / query builder লেভেলে একটা default global scope থাকবে যা প্রতিটা মডেল query-তে স্বয়ংক্রিয়ভাবে tenant_id ফিল্টার যোগ করে দেয় — কেউ ভুলে বাদ দিলেও ডেটা leak হবে না।
প্রতিটা incoming request-এ domain/subdomain থেকে tenant resolve করে request context-এ inject করা হবে — বাকি পুরো অ্যাপ ওই context থেকেই tenant জানবে।
শুধু role/permission চেক করলেই হবে না — ইউজার আসলেই ওই নির্দিষ্ট tenant-এর সদস্য কিনা, সেটাও প্রতিটা authorization check-এ যাচাই হবে।
প্রতিটা রিলিজের আগে একটা automated test suite চলবে যা এক tenant-এর session/token দিয়ে অন্য tenant-এর ডেটা access করার চেষ্টা করে — এবং সেটা fail (blocked) হওয়া বাধ্যতামূলক।
প্রতিটা shop-এর ডেটা আলাদাভাবে export/backup ও restore করা যাবে — পুরো ডাটাবেস না ছুঁয়ে একটা নির্দিষ্ট tenant-এর ডেটা নিয়েই কাজ করা সম্ভব হবে।
Shop cancel/close হলে সাথে সাথে hard delete না — নির্দিষ্ট grace period-এর জন্য soft delete + archive, তারপর নীতি অনুযায়ী permanent delete।
Phase 0-তে কোন কোন সিদ্ধান্ত নেওয়া হবে সেটা আগেই ঠিক আছে — কিন্তু কেন নেওয়া হলো, কী বিকল্প বাদ দেওয়া হলো, আর কোন ঝুঁকি জেনে-শুনে নেওয়া হলো, সেটার লিখিত রেকর্ড না থাকলে ৬ মাস পর কেউ প্রশ্ন তুললে জবাব দেওয়া কঠিন হয়ে যায়। এই সেকশন সেই "কেন"-এর দলিল।
এক ডাটাবেস, প্রতিটা tenant-owned টেবিলে tenant_id কলাম দিয়ে data আলাদা রাখা হবে — আলাদা ডাটাবেস বা schema-per-tenant নয়।
কম infra খরচ, সহজ migration/deployment (একবারে সব tenant আপডেট হয়), নতুন দোকান সাইনআপে সাথে সাথে সার্ভার provisioning লাগে না।
একটা ভুল query-তে cross-tenant data leak হওয়ার সম্ভাবনা — shared model-এর সবচেয়ে বড় দুর্বলতা।
ORM-লেভেলে global tenant scope, tenant middleware, ও প্রতিটা রিলিজের আগে বাধ্যতামূলক automated cross-tenant access test (বিস্তারিত: Tenancy সেকশন)।
Laravel Queue ব্যবহার হবে — শুরুতে database driver, ট্রাফিক বাড়লে Redis driver-এ migrate করা হবে। Invoice generation, WhatsApp/SMS পাঠানো, report export — সব async job হিসেবে চলবে।
শুরুতে আলাদা Redis সার্ভার maintain না করে দ্রুত launch করা যায়; কোড একই থাকে, শুধু .env-এ driver বদলালেই migration হয়ে যায়।
Database driver উচ্চ concurrency-তে ধীর ও DB-তে অতিরিক্ত লোড তৈরি করে — অনেক tenant একসাথে সক্রিয় হলে bottleneck হতে পারে।
Job table-এ index, queue-ভিত্তিক worker আলাদা রাখা (notifications আলাদা queue, reports আলাদা queue), এবং একটা নির্দিষ্ট active-tenant থ্রেশহোল্ডে Redis-এ পূর্বনির্ধারিতভাবে সুইচ করার প্ল্যান রাখা।
Dashboard KPI, product/category list, permission matrix-এর মতো ঘন ঘন-পড়া কিন্তু কম-পরিবর্তনশীল ডেটা Redis-এ cache হবে, tenant-scoped cache key দিয়ে।
Multi-tenant dashboard-এ একই ধরনের aggregate query বারবার চলে — cache ছাড়া DB-তে অপ্রয়োজনীয় লোড পড়ে, বিশেষত Business Health Score-এর মতো heavy calculation-এ।
Cache key-তে tenant_id বাদ পড়লে এক tenant-এর cached data আরেক tenant দেখে ফেলতে পারে — stale/leaked data দুটোই সম্ভব।
সব cache key তৈরির একটাই central helper থাকবে যা বাধ্যতামূলকভাবে tenant_id prefix যোগ করে; write operation-এ related cache tag invalidate করা standard practice হবে।
Product image, invoice PDF, backup export — সব local disk-এ নয়, S3-compatible storage (যেমন DigitalOcean Spaces/Wasabi)-এ tenant-ভিত্তিক folder path দিয়ে রাখা হবে।
Server redeploy বা horizontal scaling-এ local disk-এর ফাইল হারানোর/অসামঞ্জস্যতার ঝুঁকি থাকে; object storage থেকে CDN-এর মাধ্যমে দ্রুত সার্ভ করা যায়।
Third-party storage provider-এর downtime বা মাসিক খরচ বৃদ্ধি; ভুল করে public bucket policy সেট হলে অন্য tenant-এর ফাইল exposed হতে পারে।
Signed/temporary URL দিয়ে sensitive ফাইল সার্ভ করা, bucket policy audit checklist, এবং provider abstraction layer রাখা যাতে দরকার হলে provider বদলানো সহজ হয়।
Product/customer/invoice সার্চ শুরুতে MySQL full-text index ও proper indexing দিয়ে চলবে; product catalog বড় হলে Meilisearch/Typesense যোগ করার সিদ্ধান্ত নেওয়া হবে।
প্রাথমিক পর্যায়ে প্রতিটা দোকানের product সংখ্যা তুলনামূলক কম — আলাদা search infra maintain করা অপ্রয়োজনীয় খরচ ও complexity।
Product সংখ্যা ও tenant সংখ্যা বাড়লে DB-based সার্চ ধীর হয়ে যেতে পারে, বিশেষত fuzzy/typo-tolerant সার্চে।
সার্চ layer-কে interface-এর পেছনে abstract রাখা হবে, যাতে পরে dedicated engine-এ সুইচ করলে বাকি কোড না বদলাতে হয়; product-count থ্রেশহোল্ড নির্ধারণ করে রাখা হবে migration trigger হিসেবে।
Subscription billing ও online store checkout-এর জন্য একটা payment aggregator (SSLCommerz-জাতীয়) ব্যবহার হবে যা bKash/Nagad/card একসাথে সাপোর্ট করে — প্রতিটা gateway আলাদা integrate করা হবে না।
একটা integration দিয়েই বাংলাদেশের প্রধান পেমেন্ট মেথডগুলো কভার হয়ে যায় — প্রতিটা মেথড আলাদা integrate করলে maintenance ও compliance overhead অনেক বেড়ে যেত।
Aggregator downtime হলে সব পেমেন্ট মেথড একসাথে বন্ধ হয়ে যায়; transaction fee সরাসরি gateway integrate করার চেয়ে বেশি।
Manual/offline payment option (bank transfer + admin approval) সবসময় fallback হিসেবে রাখা হবে; webhook-ভিত্তিক payment confirmation-এর সাথে idempotency check বাধ্যতামূলক থাকবে যাতে duplicate charge না হয়।
Lead follow-up, order confirmation, ও notification-এর জন্য Meta-এর official WhatsApp Cloud API ব্যবহার হবে — কোনো unofficial/browser-automation ভিত্তিক সমাধান নয়।
Official API স্থিতিশীল, rate-limit predictable, এবং account ব্যান হওয়ার ঝুঁকি নেই — যা SaaS-এর জন্য বাধ্যতামূলক নির্ভরযোগ্যতা।
Per-message খরচ ও template pre-approval প্রয়োজন — unofficial সমাধানের চেয়ে ধীর সেটআপ ও চলমান খরচ বেশি।
Notification layer provider-agnostic রাখা হবে (SMS fallback সহ), এবং প্রায়শই ব্যবহৃত টেমপ্লেটগুলো আগে থেকেই approve করিয়ে রাখা হবে।
প্রতিদিন পুরো ডাটাবেসের automated backup object storage-এ যাবে, সাথে প্রতিটা tenant আলাদাভাবে নিজের data export/download করতে পারবে (tenant-specific backup, Tenancy সেকশনে উল্লেখিত)।
Shared database মডেলে একক ব্যর্থতা (বাগ, ভুল migration, accidental delete) সব tenant-কে প্রভাবিত করতে পারে — দ্রুত পূর্বাবস্থায় ফেরার সক্ষমতা বাধ্যতামূলক।
শুধু full-DB backup থাকলে একটা tenant-এর data restore করতে পুরো ডাটাবেস affect হওয়ার ঝুঁকি থাকে; backup ব্যর্থ হলেও কেউ খেয়াল নাও করতে পারে।
Backup সফল/ব্যর্থ হওয়ার automated alert, নিয়মিত restore-drill (test restore) সিডিউল, এবং tenant-level export আলাদা রাখা যাতে single-tenant restore পুরো ডাটাবেস না ছুঁয়ে করা যায়।
একাধিক শাখাওয়ালা দোকানের জন্য প্রতিটা শাখা আলাদা tenant নয় — একই tenant-এর অধীনে branch_id দিয়ে inventory, sales, staff আলাদা করা হবে।
Owner-এর কাছে সব শাখার consolidated report/dashboard দরকার — আলাদা tenant হলে cross-branch reporting জটিল হয়ে যেত এবং subscription billing-ও দ্বৈত হতো।
tenant_id ও branch_id — দুই স্তরের scoping একসাথে সামলাতে হয়, একটা বাদ পড়লে এক শাখার staff আরেক শাখার data দেখে ফেলতে পারে।
branch-level scope একই global scope mechanism-এ tenant_id-এর সাথে chain করা থাকবে; staff role-এ "assigned branch" বাধ্যতামূলক field হিসেবে থাকবে ও authorization-এ যাচাই হবে।
সব internal ও ভবিষ্যতের mobile-app API versioned REST endpoint (/api/v1/...) দিয়ে বানানো হবে, একটা standard response/error format মেনে।
Team-এর পরিচিতি Laravel/REST-এ বেশি, tooling (Postman, docs) সহজ, এবং প্রথম বছরে জটিল nested query-র প্রয়োজন নেই যা GraphQL-এর মূল সুবিধা।
Over-fetching/under-fetching সমস্যা হতে পারে জটিল dashboard screen-এ, যেখানে একাধিক resource একসাথে দরকার হয়।
Dashboard-এর মতো heavy screen-এর জন্য নির্দিষ্ট aggregate/composite endpoint বানানো হবে (যেমন /dashboard-summary), যাতে বহু ছোট API call এড়ানো যায়।
প্রতিটা invoice নম্বর tenant (ও প্রযোজ্য ক্ষেত্রে branch)-ভিত্তিক আলাদা sequence-এ জেনারেট হবে — একটা global counter নয়। জেনারেশন হবে atomic DB transaction দিয়ে।
প্রতিটা দোকান নিজস্ব invoice সিরিজ (যেমন ১ থেকে শুরু) আশা করে হিসাব ও ট্যাক্স রিপোর্টিং-এর জন্য — global sequence ব্যবসায়িকভাবে অর্থপূর্ণ নয়।
একসাথে অনেক concurrent sale হলে race condition-এ duplicate invoice নম্বর তৈরি হওয়ার ঝুঁকি।
Row-level lock/atomic increment ব্যবহার করে নম্বর জেনারেট করা হবে, এবং DB-তে (tenant_id, branch_id, invoice_no) কম্বিনেশনে unique constraint বাধ্যতামূলক থাকবে যাতে ভুলেও duplicate সংরক্ষিত না হয়।
Dashboard KPI ও notification badge শুরুতে periodic polling দিয়ে আপডেট হবে; POS/multi-counter real-time sync-এর প্রয়োজন হলে পরের ধাপে Laravel Echo + Websocket যোগ করা হবে।
Polling implement করা সহজ ও infra-নির্ভরতা কম — প্রথম ভার্সনে একই শাখায় একাধিক POS counter একসাথে সক্রিয় থাকার case কম।
একাধিক counter/staff একসাথে stock আপডেট করলে সামান্য delay-তে stale data দেখানোর সম্ভাবনা (যেমন স্টক আউট হওয়া প্রোডাক্ট আরেক counter-এ বিক্রি করে ফেলা)।
Stock deduction-এর মতো critical operation-এ optimistic locking/DB-level constraint রাখা হবে যাতে race condition হলেও negative stock না হয়; polling interval short রাখা হবে high-impact screen-এ।
Order/lead notification প্রথমে WhatsApp Cloud API দিয়ে পাঠানোর চেষ্টা হবে; ব্যর্থ হলে (delivery fail বা কাস্টমারের WhatsApp নেই) স্বয়ংক্রিয়ভাবে SMS-এ fallback হবে।
WhatsApp তুলনামূলক সস্তা ও rich (rich formatting, delivery status), কিন্তু বাংলাদেশে সব কাস্টমারের WhatsApp সক্রিয় নাও থাকতে পারে — SMS সবচেয়ে নির্ভরযোগ্য reach।
দুটো চ্যানেল maintain করার জন্য অতিরিক্ত complexity ও কস্ট (দুই providerর বিল), এবং fallback logic ভুল হলে duplicate notification যাওয়ার ঝুঁকি।
একটা central Notification service delivery-status track করবে ও fallback trigger করার আগে idempotency check করবে যাতে একই notification দুইবার না যায়; প্রতিটা tenant-এর জন্য মাসিক notification cost visible রাখা হবে।
MVP-তে POS সম্পূর্ণভাবে online-only থাকবে — internet connection ছাড়া sale complete করা যাবে না। Offline sale queue/local-first architecture এই ধাপে বিল্ড হবে না, RetailOS v2.0-এর scope-এ রাখা হলো।
Offline sync মানে local queue, conflict resolution (দুই device একই stock বিক্রি করলে কী হবে), ও eventual-consistency ডিজাইন — যা ডেটা মডেল ও QA effort উল্লেখযোগ্যভাবে বাড়ায়। MVP-এর লক্ষ্য দ্রুত একটা নির্ভরযোগ্য online POS দেওয়া, স্কোপ না বাড়ানো।
বাংলাদেশের অনেক দোকানে internet সংযোগ মাঝেমধ্যে বিচ্ছিন্ন হয় — সংযোগ না থাকলে সাময়িকভাবে POS ব্যবহার করা যাবে না, যা কাস্টমার অভিজ্ঞতায় প্রভাব ফেলতে পারে।
সংযোগ বিচ্ছিন্ন হলে POS একটা স্পষ্ট "No Connection" state দেখাবে (silent failure বা corrupt partial sale নয়); sales/marketing material-এ "offline support" দাবি করা হবে না যতক্ষণ না v2.0-এ প্রকৃতপক্ষে বিল্ড হয় — যাতে customer expectation ঠিক থাকে।
পুরো Dashboard/menu UI একটা key-based i18n framework দিয়ে বানানো হবে (Laravel localization ফাইল + frontend-এ JSON string bundle) — যেকোনো ভাষা যোগ করা যাবে, শুধু বাংলা+English hardcode করা হবে না। প্রতিটা user tenant-এর মধ্যে নিজের পছন্দের ভাষা বেছে নিতে পারবে (profile-level setting, tenant-wide নয়)।
শুরুতেই hardcoded বাংলা/English স্ট্রিং দিয়ে ৭৮টা পেজ বানালে পরে নতুন ভাষা (যেমন Hindi, Urdu, Nepali) যোগ করতে পুরো UI আবার touch করতে হতো — key-based approach দিয়ে শুরু করলে নতুন ভাষা শুধু একটা নতুন translation file।
Development শুরুতে সামান্য বেশি সময় লাগে (প্রতিটা string hardcode না করে key দিয়ে রেফার করতে হয়); অনুবাদ না হওয়া নতুন ভাষায় missing-key fallback ঠিকভাবে না সামলালে UI-তে raw key দেখা যেতে পারে।
UI Kit (Phase 01)-এর প্রথম component থেকেই string key discipline চালু হবে — কোনো hardcoded UI text merge হবে না; missing translation key থাকলে default (English) fallback দেখাবে, silent blank/raw-key নয়।
শপ registration-এর সময় প্রতিটা tenant একটা নির্দিষ্ট currency (৳ BDT, ₹ INR, $ USD ইত্যাদি) সেট করবে — সেই currency-তেই তাদের সব POS/invoice/report চলবে। একই tenant-এর মধ্যে একাধিক currency-তে live লেনদেন (real-time exchange rate সহ) এই স্কোপে নেই।
অধিকাংশ retail shop একটা মুদ্রাতেই ব্যবসা করে — export/multi-country transaction ছাড়া live exchange-rate সিস্টেম বানানো অপ্রয়োজনীয় জটিলতা যোগ করে (rate fetch/caching, rounding rules, FX-gain/loss হিসাব)। Per-tenant single currency দিয়েই আন্তর্জাতিক গ্রাহকদের (যেমন USD ব্যবহারকারী) মূল প্রয়োজন মেটে।
Currency একবার সেট হয়ে গিয়ে অনেক sales/invoice রেকর্ড জমা হওয়ার পর বদলাতে চাইলে ঐতিহাসিক ডেটার currency মিসম্যাচ হবে — সাধারণ update দিয়ে সমাধান করা যাবে না।
প্রতিটা money-related টেবিলে (sales, invoices, expenses) tenant-এর currency code সংরক্ষিত থাকবে সাথে amount-এর; currency সেটিং onboarding-এর সময় একবার lock হয়ে যাবে (Data Ownership/Onboarding নিয়মের মতো) — পরে বদলাতে হলে Super Admin-এর মাধ্যমে explicit migration path (নতুন currency দিয়ে নতুন হিসাব শুরু, পুরনো রেকর্ড archive) অনুসরণ করা হবে।
Phase 0-এর Database ERD deliverable শুধু table আর relation দেখায় — কিন্তু প্রতিটা table আসলে কার (tenant / branch / platform), সেটা আলাদাভাবে লিখিত না থাকলে ডেভেলপ করার সময় scope গুলিয়ে যায়। এই ম্যাট্রিক্স প্রতিটা core entity-র জন্য owner স্তর নির্ধারণ করে।
| Entity | Tenant-owned | Branch-owned | Global |
|---|---|---|---|
| Product / Category / Brand / Unit | ✅ | Optional | ❌ |
| Customer | ✅ | ❌ | ❌ |
| Supplier | ✅ | Optional | ❌ |
| Sale / POS Invoice | ✅ | ✅ | ❌ |
| Purchase | ✅ | ✅ | ❌ |
| Stock / Inventory Ledger | ✅ | ✅ | ❌ |
| Expense | ✅ | ✅ | ❌ |
| Employee / Staff | ✅ | ✅ (assigned branch) | ❌ |
| Lead / CRM Record | ✅ | Optional | ❌ |
| Online Store Order | ✅ | Optional | ❌ |
| Coupon / Discount Rule | ✅ | Optional | ❌ |
| Shop / Tenant Profile | ✅ (self) | ❌ | Optional (platform read-only) |
| Support Ticket | ✅ (raised by) | ❌ | Optional (platform-visible) |
| Subscription Plan | ❌ | ❌ | ✅ |
| Subscription / Billing Transaction | Optional (tenant read-only) | ❌ | ✅ |
| Platform Admin / Staff | ❌ | ❌ | ✅ |
| System Settings | ❌ | ❌ | ✅ |
| Notification Template (default) | Optional (tenant override) | ❌ | ✅ |
| Global Analytics / Platform Reports | ❌ | ❌ | ✅ |
প্রতিটি feature-কে "complete" বলার আগে নিচের প্রতিটা শর্ত পূরণ হতে হবে — একটাও বাদ দিয়ে feature merge/close করা যাবে না।
প্রতিটি release-এর আগে একটা নির্দিষ্ট test suite অবশ্যই চালাতে হবে — শুধু "কাজ করছে মনে হচ্ছে" এই ভরসায় production-এ পুশ করা যাবে না। বিশেষ করে POS, Inventory, Tenant Isolation এবং Payment-এর মতো জায়গায় একটা ছোট বাগও সরাসরি টাকা বা ডেটা লস করাতে পারে।
Login, register, OTP verify, password reset, session expiry ও token refresh — সবগুলো flow ঠিকভাবে কাজ করছে কিনা।
প্রতিটা role (Owner, Manager, Cashier ইত্যাদি) ঠিক ততটুকু অ্যাক্সেস পাচ্ছে যতটুকু তার permission matrix-এ নির্ধারিত — কম বা বেশি না।
এক tenant-এর session/token দিয়ে অন্য tenant-এর ডেটা কোনোভাবেই access করা না যায়, সেটা প্রতিটা release-এ যাচাই করা।
Barcode scan থেকে payment ও invoice print পর্যন্ত পুরো sale flow, split payment ও discount সহ, সঠিকভাবে সম্পন্ন হচ্ছে কিনা।
Full ও partial return, stock ফেরত যোগ হওয়া, এবং refund/ledger ঠিকভাবে আপডেট হওয়া নিশ্চিত করা।
Purchase, sale, return, batch/expiry — প্রতিটা movement-এর পর stock count ও valuation নির্ভুল থাকছে কিনা।
Split payment, due/partial payment, subscription billing ও gateway callback — টাকার হিসাবে কোনো mismatch নেই তা যাচাই।
ছোট স্ক্রিনে (ফোন/ট্যাব) সব critical flow — বিশেষত POS ও Dashboard — ভেঙে না গিয়ে ঠিকভাবে ব্যবহারযোগ্য থাকছে কিনা।
Chrome, Firefox, Safari ও Edge-এর সাম্প্রতিক ভার্সনে UI ও functionality সমানভাবে কাজ করছে কিনা।
এই তিনটি শর্ত পূরণ না হলে কোনো release production-এ যাবে না — এটা negotiable নয়।
"দ্রুত লোড হবে" — এটা একটা target না, একটা আশা। প্রতিটা critical screen/action-এর একটা নির্দিষ্ট, মাপা যায় এমন সংখ্যা থাকতে হবে, যাতে ডেভেলপমেন্টের সময় ও production monitoring-এ "pass/fail" স্পষ্টভাবে বলা যায়।
উপরের SLO-গুলো কোন স্কেলে ধরে রাখতে হবে, সেটা না জানা থাকলে সার্ভার sizing, DB indexing, ও queue capacity — সবকিছুই আন্দাজের উপর করতে হয়। এই সংখ্যাগুলোই প্রথম বছরের infrastructure planning-এর ভিত্তি।
এই স্ট্যান্ডার্ডগুলো কোনো "ভবিষ্যতে যোগ করব" ফিচার না — Phase 0-এর architecture doc-এর অংশ হিসেবে দিন থেকেই বাস্তবায়িত থাকতে হবে, কারণ পরে যোগ করতে গেলে পুরো ডেটা মডেল আবার ছুঁতে হয়।
কোনো password plain text-এ কখনো সংরক্ষণ হবে না — শক্তিশালী, salted hashing algorithm (যেমন bcrypt/argon2) ব্যবহার হবে।
প্রতিটা OTP-এর একটা নির্দিষ্ট, ছোট মেয়াদ থাকবে; মেয়াদ পার হলে সেটা স্বয়ংক্রিয়ভাবে অকার্যকর হয়ে যাবে।
বারবার ভুল লগইন চেষ্টা হলে IP/অ্যাকাউন্ট সাময়িকভাবে ব্লক হবে, যাতে brute-force আক্রমণ ঠেকানো যায়।
নির্দিষ্ট সময় নিষ্ক্রিয় থাকলে সেশন স্বয়ংক্রিয়ভাবে expire হবে এবং re-authentication চাইবে।
প্রতিটা state-changing request-এ CSRF token যাচাই বাধ্যতামূলক, যাতে ভুয়া/ক্রস-সাইট রিকোয়েস্ট গ্রহণ না হয়।
প্রতিটা অ্যাকশন role/permission matrix অনুযায়ী চেক হবে — শুধু UI-তে লুকিয়ে রাখলেই হবে না, backend-এ enforce থাকতে হবে।
কে, কখন, কোন ডেটা তৈরি/সম্পাদনা/মুছেছে — এই তথ্য ট্র্যাক হবে, বিশেষত financial ও inventory-সংক্রান্ত অ্যাকশনে।
ব্যাকআপ ফাইল rest-এ encrypted থাকবে, যাতে সেটা চুরি হলেও সরাসরি readable না হয়।
প্রতিদিন স্বয়ংক্রিয়ভাবে পুরো ডেটাবেস (ও প্রয়োজনে ফাইল) ব্যাকআপ নেওয়া হবে, ম্যানুয়াল হস্তক্ষেপ ছাড়াই।
ব্যাকআপ শুধু নিলেই হবে না — নিয়মিত বিরতিতে restore করে দেখতে হবে যে সেটা আসলেই কাজ করে।
Customer/payment-এর মতো sensitive ডেটা কে অ্যাক্সেস করেছে, তা আলাদাভাবে লগ হবে — সাধারণ audit log-এর চেয়ে বেশি নজরদারিতে।
শুধু ব্যাকআপ নেওয়া হচ্ছে জানলেই চলবে না — কতটা ডেটা হারানো "গ্রহণযোগ্য" (RPO) আর সমস্যার পর সার্ভিস কত দ্রুত ফিরে আসবে (RTO), সেই সংখ্যা লিখিতভাবে ঠিক না থাকলে ক্রাইসিসের সময় প্রতিশ্রুতি আর বাস্তবতা মিলবে না।
যেকোনো disaster-এ সর্বোচ্চ ৬ ঘণ্টার ডেটা হারানো গ্রহণযোগ্য ধরা হবে — এর বেশি হলে সেটা target miss হিসেবে গণ্য হবে ও review হবে।
Critical service (login, POS, checkout) ইনসিডেন্টের পর সর্বোচ্চ ৪ ঘণ্টার মধ্যে restore করে চালু করার লক্ষ্য — এর বেশি সময় লাগলে escalation trigger হবে।
শুধু backup file আছে ধরে নেওয়া যাবে না — প্রতি মাসে অন্তত একবার আসল restore করে যাচাই করা হবে যে সেটা সত্যিই কার্যকর, এবং সময় লেগেছে কতটা তা লগ হবে।
Tenant isolation rule যতই শক্তিশালী হোক, "যদি একটা incident ঘটেই যায়" — তার জন্য একটা fixed, প্র্যাকটিসড response process থাকতে হবে। ঘটনার মুহূর্তে সিদ্ধান্ত নেওয়ার চেষ্টা করলে ভুল হওয়ার সম্ভাবনা বেশি; তাই এই ধাপগুলো Phase 0-তেই লিখে রাখা।
খুবই সীমিত সংখ্যক senior engineer — নামসহ একটা fixed access list থাকবে, এবং সরাসরি DB access সাধারণ ডেভেলপমেন্ট workflow-এর অংশ হবে না। Read-only দরকার হলে আলাদা replica/reporting connection ব্যবহার হবে।
নির্দিষ্ট incident-এর জন্য সাময়িক, time-boxed access গ্রান্ট করা হবে (যেমন ২৪ ঘণ্টার জন্য) — অনুমোদনসহ, এবং মেয়াদ শেষে স্বয়ংক্রিয়ভাবে revoke হয়ে যাবে। প্রতিটা emergency access grant নিজেই একটা audit-logged ইভেন্ট।
হ্যাঁ — প্রতিটা Super Admin/Platform Admin অ্যাকশন (tenant suspend, plan override, manual refund, data export ইত্যাদি) কে, কখন, কী করেছে তা immutable audit log-এ থাকবে, যা কোনো admin নিজেও এডিট/মুছতে পারবে না।
হ্যাঁ — নতুন ডিভাইস/অস্বাভাবিক লোকেশন থেকে লগইন, বারবার ব্যর্থ লগইন চেষ্টা, বা একই অ্যাকাউন্টে অস্বাভাবিক সময়ে multiple session তৈরি হলে — অ্যাকাউন্ট মালিককে (ও প্রয়োজনে platform admin-কে) স্বয়ংক্রিয় নোটিফিকেশন যাবে।
Audit ও sensitive-access log কমপক্ষে ১২ মাস রাখা হবে (কমপ্লায়েন্স/dispute resolution-এর জন্য); সাধারণ application log ৯০ দিন পর archive/rotate হবে। Incident-সংশ্লিষ্ট log আলাদাভাবে সংরক্ষিত থাকবে যতদিন না post-incident review সম্পন্ন হয়।
প্রতিটা বড় প্রজেক্টে ঝুঁকি থাকে — সমস্যা হয় যখন সেগুলো কারো মাথায় থাকে কিন্তু কোথাও লেখা থাকে না। এই register-এ প্রতিটা চেনা ঝুঁকির probability, impact, owner ও mitigation প্ল্যান লিখিতভাবে থাকবে, এবং প্রতি sprint review-তে status আপডেট হবে।
| ID | Risk | Probability | Impact | Severity | Owner | Mitigation | Status |
|---|---|---|---|---|---|---|---|
| RSK-01 | Cross-tenant data leakSecurity | Low | Critical | High | Lead Backend Eng | Global ORM tenant scope + বাধ্যতামূলক automated cross-tenant test প্রতি release-এর আগে (ADR-001)। | Monitoring |
| RSK-02 | Backup আছে কিন্তু restore আসলে কাজ করে নাOperations | Medium | Critical | High | DevOps | মাসে অন্তত ১ বার লাইভ restore test, সময় ও ফলাফল লগ করা (দেখুন Backup & Restore Objectives)। | Monitoring |
| RSK-03 | একমাত্র সিনিয়র ডেভেলপারের উপর নির্ভরতা (key-person risk)Team | Medium | High | High | Project Lead | ADR ডকুমেন্টেশন, code review বাধ্যতামূলক, critical module-এ কমপক্ষে ২ জনের familiarity নিশ্চিত করা। | Open |
| RSK-04 | v1.0 সম্পূর্ণ হওয়ার আগে v1.5/v2.0 ফিচার শুরু (scope creep)Process | High | Medium | Medium | Project Lead | Release Plan-এর "প্রায়োগিক নিয়ম" কঠোরভাবে অনুসরণ — v1.0 sign-off ছাড়া v1.5 branch-ই ওপেন হবে না। | Monitoring |
| RSK-05 | Tenant/product সংখ্যা বাড়ার সাথে DB পারফরম্যান্স কমে যাওয়াTechnical | Medium | Medium | Medium | Lead Backend Eng | Query-level index review, Redis cache layer (ADR-003), এবং search engine migration থ্রেশহোল্ড আগে থেকেই ঠিক করা (ADR-005)। | Open |
| RSK-06 | WhatsApp/SMS API-এর rate-limit বা pricing পরিবর্তনThird-party | Medium | Medium | Medium | Product Owner | Provider abstraction layer রাখা যাতে দ্রুত অন্য gateway-এ সুইচ করা যায়; fallback SMS/email channel রাখা। | Open |
| RSK-07 | Object storage provider outage বা bucket misconfigurationInfrastructure | Low | Medium | Low | DevOps | Signed/temporary URL, bucket policy audit checklist, provider abstraction layer (ADR-004)। | Mitigated |
| RSK-08 | Consumption Prediction ভুল হয়ে গ্রাহকের আস্থা কমে যাওয়াProduct | Medium | Low | Low | Product Owner | Prediction-কে "suggestion" হিসেবে ফ্রেম করা, confidence কম হলে UI-তে স্পষ্টভাবে দেখানো, ম্যানুয়াল override সবসময় খোলা রাখা। | Open |
| RSK-09 | Pricing plan-এর margin আসলে টার্গেট অনুযায়ী না মেলাBusiness | Medium | Medium | Medium | Founder / Finance | Unit Economics সেকশনের হিসাব প্রতি quarter রিভিউ, infra খরচ বাড়লে plan pricing পুনর্মূল্যায়ন। | Monitoring |
কোন module কোন module-এর উপর নির্ভরশীল, আর কোন module বন্ধ থাকলে আর কী কী আটকে যায় — এটা আগে থেকে স্পষ্ট না থাকলে sprint planning-এ ভুল ক্রমে কাজ শুরু হয়ে যায় এবং শেষ মুহূর্তে rework লাগে। v1.0-এর জন্য একটা নির্দিষ্ট critical path-ও চিহ্নিত করা হয়েছে — এই চেইনের কোনো একটা ধাপ দেরি হলে সরাসরি পুরো v1.0 launch date পিছিয়ে যাবে।
এই সাতটা ধাপ সিরিয়ালি নির্ভরশীল — প্রতিটা ধাপ তার আগের ধাপের উপর hard dependency (নিচের dependency card-গুলোতে বিস্তারিত)। এর বাইরে যা কিছু আছে (CRM, WhatsApp, Consumption Prediction, Online Store) সেগুলো এই critical path-এর সাথে parallel বা পরের release-এ চলবে — এগুলোর দেরি হলে v1.0 launch date সরাসরি প্রভাবিত হয় না।
কাগজে-কলমে module ভাগ করা থাকলেও, বাস্তবে কে কোন অংশের দায়িত্বে সেটা লেখা না থাকলে sprint planning-এ ধোঁয়াশা তৈরি হয়। প্রতিটা core role এবং তার responsibility scope নিচে নির্ধারণ করা হলো — নাম এখনো ঠিক না হলেও, role অনুযায়ী ownership boundary স্পষ্ট থাকা জরুরি।
Database schema, multi-tenant architecture, API, ADR ownership। Data Ownership Matrix ও Security Standards-এর মূল দায়িত্ব এই role-এর।
UI Kit থেকে শুরু করে ৭৮টা পেজ implementation, responsive/theme consistency, ও component reuse বজায় রাখা।
Definition of Done checklist enforce করা, প্রতিটা release-এর আগে test suite চালানো, cross-tenant ও regression bug ধরা।
Deployment pipeline, backup/restore, monitoring, infra খরচ — নিচের Infra & DevOps সেকশনের বাস্তবায়ন দায়িত্ব।
Feature scope, pricing, onboarding strategy, ও Risk Register-এ Business/Product ক্যাটেগরির ঝুঁকির owner।
Sprint schedule, dependency map মেনে কাজ schedule করা, key-person risk (RSK-03) mitigate করা।
Security ও Performance SLO সেকশনে "কী মান বজায় রাখতে হবে" লেখা আছে — এখানে লেখা থাকবে সেটা বাস্তবে কোন environment ও pipeline দিয়ে অর্জন করা হবে।
Multi-tenant retail SaaS হওয়ায় গ্রাহকের ব্যবসার ডেটা (বিক্রি, ইনভেন্টরি, কাস্টমার তথ্য) হাতে থাকবে — তাই তথ্য সুরক্ষা ও লোকাল ব্যবসায়িক নিয়ম মেনে চলা technical কাজের মতোই গুরুত্বপূর্ণ।
এই রোডম্যাপ ডকুমেন্ট নিজেই একটা living artifact — কোড-এর মতো এটারও version, owner আর change history লিখিত থাকা দরকার, যাতে "কোন সিদ্ধান্তটা কবে এবং কেন বদলালো" তা সহজে ট্রেস করা যায়।
| Version | Date | Author | Change Summary |
|---|---|---|---|
| v1.0 | initial | Karmakar Web Solution | মূল রোডম্যাপ — Vision, Phases, 78-page inventory, Feature Specs, Tech Stack। |
| v1.1 | +1 | Karmakar Web Solution | Pricing, Billing Rules ও Onboarding Strategy সেকশন যুক্ত হলো। |
| v1.2 | +2 | Karmakar Web Solution | Multi-tenant Architecture, ADR, Data Ownership Matrix, Definition of Done, QA, Performance SLO ও Security Standards যুক্ত হলো — Phase 0 governance সম্পূর্ণ করা হলো। |
| v1.3 | current | Karmakar Web Solution | Risk Register, Dependency Map এবং এই Version Control Metadata সেকশন যুক্ত হলো — production planning সম্পূর্ণ করার জন্য। |
| v1.4 | current | Karmakar Web Solution | Team & Resource Allocation, Deployment & Infra/DevOps, এবং Legal & Compliance সেকশন যুক্ত হলো — refinement review-এ চিহ্নিত গ্যাপ পূরণের জন্য। |
| v1.5 | current | Karmakar Web Solution | Phase 00 (Product & System Architecture) draft সম্পূর্ণ হলো — User Roles, Permission Matrix, Tenant Model, ERD, POS Flow, Inventory Rules, Invoice Numbering, Subscription Rules, API Conventions, Error-handling Standards। বিস্তারিত: Phase 00 Architecture Spec ডকুমেন্ট। Sign-off checklist review বাকি। |
| v1.6 | current | Karmakar Web Solution | Phase 01–05-এর draft spec ডকুমেন্ট সম্পূর্ণ হলো (UI Kit, Shop Owner Panel, CRM, Online Shop, Super Admin) — এখন সবগুলো ৬টা build Phase (00–05)-এরই বিস্তারিত spec আছে, timeline-এ "Draft — sign-off pending" ট্যাগ যোগ করা হলো। প্রতিটা Phase-এর নিজস্ব sign-off checklist সংশ্লিষ্ট spec ডকুমেন্টে। |
| v1.7 | current | Karmakar Web Solution | ADR-015 (Multi-language UI — i18n key framework) ও ADR-016 (Multi-currency — per-tenant single currency) যুক্ত হলো। Phase 00 (Tenant Model) ও Phase 01 (UI Kit) spec-এ সংশ্লিষ্ট রেফারেন্স আপডেট করা হলো। |
৭৮টা page একসাথে বানানোর চাপ না নিয়ে, তিনটা স্পষ্ট release-এ scope ভাগ করা হয়েছে — প্রতিটা release নিজে থেকেই সম্পূর্ণ ও ব্যবহারযোগ্য (usable) থাকবে।
প্রথম launch — একটা দোকান চালানোর জন্য যা যা লাগবে, ঠিক ততটুকুই।
কাস্টমার রিলেশন ও রিটেনশন-ভিত্তিক ফিচার — বিক্রি বাড়ানোর দ্বিতীয় ধাপ।
একাধিক শাখা ও এন্টারপ্রাইজ-লেভেল ক্লায়েন্টদের জন্য।