একটা ক্লায়েন্টের দোকান ছয় মাস ধরে চলছিল, ৯০০-র বেশি অর্ডারও হয়েছিল। সমস্যা নিয়ে যখন আমাদের কাছে এলেন, অভিযোগ ছিল একটাই — “অনেক কাস্টমার bKash দিয়ে পেমেন্ট করে, কিন্তু অর্ডারটা Pending Payment-এই পড়ে থাকে। প্রতিদিন সকালে গেটওয়ের ড্যাশবোর্ড খুলে হাতে মিলিয়ে অর্ডার Processing করতে হয়।” ছয় মাস ধরে একজন কর্মী রোজ এই কাজটা করছিলেন।
কারণটা কনফিগারেশনে। গেটওয়ে প্লাগিন বসানো ছিল ঠিকই, কিন্তু IPN বা কলব্যাক URL সেট করা হয়নি। অর্ডার Processing হচ্ছিল শুধু তখনই, যখন গ্রাহক পেমেন্টের পর ব্রাউজারে ফিরে আসতেন। যিনি bKash অ্যাপ থেকে টাকা দিয়ে অ্যাপটাই বন্ধ করে দিতেন, তাঁর অর্ডার আটকে থাকত। ঠিক করতে এক ঘণ্টা লেগেছিল। আর এই লেখাটা মূলত সেই এক ঘণ্টার কাজগুলো নিয়ে — যেগুলো আগেই করে রাখলে ছয় মাসের ভোগান্তি হয় না।
ধাপ ০: সার্ভার ঠিক না থাকলে বাকি সব বৃথা
WooCommerce সেটআপ শুরু হয় প্লাগিন ইনস্টলের আগে, PHP কনফিগারেশন থেকে। PHP 8.2 বা 8.3, memory_limit অন্তত 256M, max_execution_time 120। আর যেটা প্রায় কেউ জানে না — max_input_vars। ডিফল্ট ১০০০। ৫০টা ভ্যারিয়েশনের একটা প্রোডাক্ট, বা একটা বড় ট্যাক্স টেবিল সেভ করতে গেলে ফর্ম ১০০০-এর বেশি ফিল্ড পাঠায়, আর PHP বাকিটা নীরবে কেটে ফেলে। কোনো এরর দেখায় না।
উপসর্গটা চেনা লাগবে: “সেভ দিলাম, কিন্তু অর্ধেক ভ্যারিয়েশন গায়েব হয়ে গেছে।” সস্তা শেয়ার্ড হোস্টিংয়ে এটা রোজকার ঘটনা। php.ini-তে max_input_vars = 3000, post_max_size = 64M, upload_max_filesize = 64M বসিয়ে দিন।
- চোখে দেখে নিন — WooCommerce → Status → System Status খুলুন। PHP Version, PHP Post Max Size, PHP Time Limit, Max Input Vars — সব সবুজ কি না দেখুন। পেজটার একটা স্ক্রিনশট রেখে দিন; পরে কোনো প্লাগিন কিছু ভাঙলে এটাই আপনার তুলনার ভিত্তি।
ধাপ ১: HPOS — অর্ডার আসলে কোথায় জমা হচ্ছে
WooCommerce 8.2 থেকে High-Performance Order Storage (HPOS) এসেছে। আগে প্রতিটা অর্ডার wp_posts আর wp_postmeta-তে জমত — মানে একটা অর্ডারের তথ্য ৪০-৫০টা সারিতে ছড়ানো থাকত। ১০ হাজার অর্ডারের দোকানে অ্যাডমিন অর্ডার লিস্ট খুলতে ১০ সেকেন্ড লাগা এখান থেকেই আসে। HPOS অর্ডারগুলো আলাদা, ইনডেক্সড টেবিলে (wp_wc_orders) রাখে।
- নতুন ইনস্টলে HPOS ডিফল্ট। পুরনো দোকানে WooCommerce → Settings → Advanced → Features থেকে চালু করুন, কিন্তু প্রথমে “compatibility mode” অন রেখে সিংক শেষ হতে দিন।
- নিশ্চিত হোন — WP-CLI থাকলে
wp wc cot count_unmigratedচালিয়ে দেখুন কতগুলো অর্ডার এখনো মাইগ্রেট হয়নি, আরwp wc cot verify_cot_dataদিয়ে পুরনো-নতুন টেবিলের ডেটা মিলিয়ে নিন। - প্লাগিন পেজে খেয়াল করুন — যে প্লাগিনগুলো HPOS-এর সাথে সামঞ্জস্যপূর্ণ নয়, WooCommerce সেখানে সতর্কবার্তা দেখায়। সেগুলো সরাসরি
wp_postmetaথেকে অর্ডার পড়ে, তাই compatibility mode বন্ধ করলেই ওরা পুরনো ডেটা দেখাবে।
ধাপ ২: টাকা, দশমিক আর যে সিদ্ধান্ত পরে বদলানো যায় না
কারেন্সি BDT, সিম্বল ৳, পজিশন আর সেপারেটর — এগুলো সহজ। ফাঁদটা দশমিকে। বাংলাদেশি বেশিরভাগ দোকান decimals শূন্য করে দেন, যাতে ৳২৯৯ দেখায়, ৳২৯৯.০০ না। কিন্তু decimals শূন্য করলে WooCommerce শুধু দেখানোটা গোল করে, জমা থাকা দাম বদলায় না। প্রোডাক্টের দাম যদি ২৯৯.৫০ হয়, গ্রাহক দেখবেন ৳৩০০, অথচ গেটওয়েতে চার্জ হবে ২৯৯.৫০। ইনভয়েস আর ব্যাংক স্টেটমেন্টে অমিল শুরু এখান থেকেই। নিয়ম সহজ — decimals শূন্য রাখলে দামগুলোও পূর্ণসংখ্যায় রাখুন।
ট্যাক্সের সিদ্ধান্তটা আরও বেশি অপরিবর্তনীয়। “Enter prices inclusive of tax” — এটা প্রথম প্রোডাক্ট বসানোর আগেই ঠিক করুন। পরে বদলালে আগের প্রতিটা দামের অর্থ পাল্টে যায়: ৳১০০ যেটা ভ্যাট ছাড়া ছিল, সেটা হঠাৎ ভ্যাটসহ ধরা হবে, আর আপনার মার্জিন খেয়ে ফেলবে। ১৫% মূসক দেখাতে হলে Standard rate-এ Country = BD, Rate = 15.0000, আর “Shipping” টিক করবেন কি না সেটাও সচেতনভাবে ঠিক করুন।
- মিলিয়ে দেখুন — ৳১ দামের একটা লুকানো টেস্ট প্রোডাক্ট বানান, নিজে অর্ডার করুন, তারপর অর্ডারের টোটাল ব্রেকডাউন লাইন ধরে ক্যালকুলেটরে মিলিয়ে দেখুন। এই এক টাকার অর্ডারটাই আপনাকে লাখ টাকার হিসাব-ভুল থেকে বাঁচাবে।
ধাপ ৩: পেমেন্ট — এখানেই বেশিরভাগ দোকান রক্ত ঝরায়
SSLCommerz, aamarPay, ShurjoPay, নাকি সরাসরি bKash মার্চেন্ট API — যেটাই নিন, একটা নীতি অপরিবর্তনীয়: ব্রাউজার রিডাইরেক্টের ওপর কখনো ভরসা করবেন না। পেমেন্ট নিশ্চিত হওয়ার খবর সার্ভার-থেকে-সার্ভার আসতে হবে, IPN বা webhook দিয়ে। গ্রাহক পেমেন্ট করার পর অ্যাপ বন্ধ করে দিলে বা নেট চলে গেলে ব্রাউজার আর ফিরবে না — আর তখন আপনি ভাববেন তিনি টাকা দেননি।
- গেটওয়ের ড্যাশবোর্ডে IPN/Callback URL বসান। WooCommerce গেটওয়েগুলো সাধারণত
https://yourdomain.com/?wc-api=<gateway_id>ফরম্যাট ব্যবহার করে — প্লাগিনের ডকুমেন্টেশনে সঠিকটা লেখা থাকে। - সেই URL অবশ্যই বাইরে থেকে POST রিকোয়েস্ট গ্রহণ করতে পারতে হবে। Cloudflare-এর “Under Attack” মোড, বা Wordfence-জাতীয় সিকিউরিটি প্লাগিনের বট-ব্লকিং গেটওয়ের কলব্যাক আটকে দিতে পারে। গেটওয়ের IP গুলো allowlist করুন।
- স্যান্ডবক্সে অন্তত তিনটা পরিস্থিতি চালান: সফল পেমেন্ট, ব্যর্থ পেমেন্ট, আর — সবচেয়ে জরুরি — পেমেন্ট সফল হওয়ার পরপরই ট্যাব বন্ধ করে দেওয়া।
- পরীক্ষা — ওই তৃতীয় পরীক্ষাটাই আসল। টাকা কাটার পর ট্যাব বন্ধ করুন, দুই-তিন মিনিট অপেক্ষা করুন, তারপর WooCommerce → Orders দেখুন। অর্ডারটা নিজে নিজে Processing-এ চলে গেছে? তবেই আপনার কলব্যাক কাজ করছে। না গেলে লাইভে যাবেন না — যত সুন্দরই দেখাক।
ক্যাশ অন ডেলিভারির নিজস্ব একটা ফাঁদ আছে। COD চালু করলে সেটা ডিফল্টভাবে সব শিপিং জোনে খুলে যায় — মানে বান্দরবানের গ্রাহকও ৳২,০০০ টাকার অর্ডার COD-তে দিতে পারবেন, আর রিটার্ন হলে কুরিয়ার খরচ আপনার ঘাড়ে। WooCommerce → Payments → Cash on delivery → “Enable for shipping methods” দিয়ে নির্দিষ্ট শিপিং মেথডে সীমাবদ্ধ করুন।
ধাপ ৪: শিপিং জোন — ঢাকার ভেতরে আর বাইরে
দুটো জোন দিয়ে শুরু করুন: “ঢাকা সিটি” (রিজিয়ন হিসেবে ঢাকা জেলা বেছে, ফ্ল্যাট রেট ৳৬০-৮০) আর “ঢাকার বাইরে” (রিজিয়ন = Bangladesh, ফ্ল্যাট রেট ৳১২০-১৫০)। ফ্ল্যাট রেটের Cost ফিল্ডে সূত্রও লেখা যায় — যেমন 60 + (15 * [qty]) মানে প্রথম খরচ ৬০, তারপর প্রতি আইটেমে ১৫ টাকা যোগ।
- হাতে-কলমে দেখুন — প্রতিটা জোনের একটা করে টেস্ট ঠিকানা দিয়ে চেকআউট পর্যন্ত যান, দেখুন সঠিক মেথড আর সঠিক খরচ আসছে কি না।
- একটা ফলব্যাক জোন রাখুন। কোনো ঠিকানা কোনো জোনে না পড়লে গ্রাহক দেখেন “No shipping options available” — আর সাথে সাথেই কার্ট ছেড়ে চলে যান। আপনি কোনোদিন জানতেও পারবেন না।
ধাপ ৫: ইমেইল না গেলে অর্ডারও হারায়
শেয়ার্ড হোস্টিংয়ের PHP mail() দিয়ে পাঠানো অর্ডার কনফার্মেশন সোজা স্প্যামে যায়, নয়তো একেবারেই পৌঁছায় না। FluentSMTP বা WP Mail SMTP বসিয়ে একটা আসল SMTP সার্ভিসে (Brevo, Zoho, Amazon SES) যুক্ত করুন। From অ্যাড্রেস অবশ্যই আপনার নিজের ডোমেইনের মেইলবক্স হবে — noreply@gmail.com দিলে Gmail নিজেই সেটা আটকে দেবে।
- DNS-এ SPF, DKIM আর DMARC রেকর্ড যোগ করুন। SMTP সার্ভিস তিনটার মানই ড্যাশবোর্ডে দিয়ে দেয়।
- প্রমাণ করুন — নিজের Gmail-এ একটা টেস্ট অর্ডার ইমেইল পাঠান, তারপর মেইল খুলে “Show original” চাপুন। SPF, DKIM, DMARC — তিনটাতেই PASS দেখতে হবে। একটাও FAIL মানে আপনার অর্ধেক গ্রাহক ইমেইল পাচ্ছেন না।
ধাপ ৬: wp-cron আর Action Scheduler
WordPress-এর cron আসল cron নয় — এটা তখনই চলে যখন কেউ সাইটে ঢোকে। রাত ৩টায় আপনার দোকানে কেউ না থাকলে কিছুই চলে না। অথচ WooCommerce তার অনেক কাজ — আটকে থাকা স্টক ছেড়ে দেওয়া, ব্যর্থ ইমেইল আবার পাঠানো, webhook ডেলিভারি — Action Scheduler-এর মাধ্যমে cron-এর ওপর চাপিয়ে রাখে।
wp-config.php-এ লিখুনdefine('DISABLE_WP_CRON', true);- cPanel-এর Cron Jobs-এ প্রতি ৫ মিনিটে চালান:
wget -q -O - https://yourdomain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1 - চোখে দেখে নিন — WooCommerce → Status → Scheduled Actions খুলুন, Pending ট্যাব দেখুন। এক ঘণ্টার বেশি পুরনো শত শত pending অ্যাকশন জমে থাকা মানে আপনার cron চলছে না। Failed ট্যাবটাও পড়ুন — ওগুলো মুছবেন না, ওখানে আসল সমস্যার সূত্র থাকে।
ধাপ ৭: স্টক, ক্যাশ আর চেকআউটের ছোট ফাঁদগুলো
- Inventory সেটিংসে “Hold stock (minutes)” ৬০ রাখুন, আর ব্যাকঅর্ডার বন্ধ রাখুন — নইলে শেষ এক পিস প্রোডাক্ট দুজনের কাছে বিক্রি হয়ে যাবে।
/cart,/checkoutআর/my-account— এই তিনটা পেজ কখনোই ক্যাশ করবেন না। LiteSpeed Cache বা WP Rocket-এ exclusion লিস্টে যোগ করুন। এই এক ভুলে গ্রাহক অন্যের কার্ট দেখতে পান।- পোস্টকোড বাধ্যতামূলক রাখবেন না — বাংলাদেশে বেশিরভাগ গ্রাহক নিজের পোস্ট কোড জানেন না, আর এটা নীরবে চেকআউট ড্রপ বাড়ায়।
woocommerce_default_address_fieldsফিল্টার দিয়েrequiredকেfalseকরে দিন। - Cart fragments (
?wc-ajax=get_refreshed_fragments) প্রতিটা পেজলোডে একটা অতিরিক্ত, কখনোই ক্যাশ না হওয়া রিকোয়েস্ট পাঠায়। হোমপেজে কার্ট আইকনে লাইভ কাউন্ট না লাগলে এটা বন্ধ করুন — TTFB নাটকীয়ভাবে কমবে।
লাইভে যাওয়ার আগে শেষ চেকলিস্ট
- আসল টাকায় একটা অর্ডার করুন (নিজের কার্ড/bKash দিয়ে), পেমেন্টের পরপরই ট্যাব বন্ধ করুন, তারপর দেখুন অর্ডার Processing হয় কি না।
- দুটো ব্রাউজার থেকে একই শেষ স্টকের প্রোডাক্ট একসাথে অর্ডার করার চেষ্টা করুন — ঠিক একটা বিক্রি হওয়া উচিত।
- অর্ডার কনফার্মেশন ইমেইল গ্রাহক আর আপনার দুজনের ইনবক্সেই এসেছে কি না মিলিয়ে দেখুন, স্প্যাম ফোল্ডারসহ।
- একটা ব্যাকআপ নিন, তারপর সেটা স্টেজিংয়ে রিস্টোর করে দেখুন সত্যিই কাজ করে — যে ব্যাকআপ কখনো রিস্টোর করে দেখা হয়নি, সেটা ব্যাকআপ নয়, আশা।
যা সবাই জিজ্ঞেস করেন
WooCommerce কি বেশি অর্ডারে ধীর হয়ে যায়? নিজে থেকে না। ধীর হয় খারাপ হোস্টিং, HPOS বন্ধ থাকা, ২৫টা প্লাগিন, আর ক্যাশ-না-থাকা মিলে। HPOS চালু আর অবজেক্ট ক্যাশ (Redis) সহ ভালো VPS-এ ৫০ হাজার অর্ডার নিয়েও WooCommerce স্বচ্ছন্দে চলে।
বাংলাদেশে কোন গেটওয়ে দিয়ে শুরু করব? শুরুতে COD + একটা অ্যাগ্রিগেটর (SSLCommerz বা aamarPay) — এতে bKash, নগদ, কার্ড সবই একসাথে পাবেন, আলাদা করে প্রতিটার সাথে ইন্টিগ্রেশন করতে হবে না। মাসিক ভলিউম বাড়লে তখন সরাসরি মার্চেন্ট API-তে গেলে ট্রানজেকশন ফি কমে।
শেয়ার্ড হোস্টিং কি যথেষ্ট? দিনে ২০-৩০টা অর্ডার পর্যন্ত মোটামুটি চলে। তার বেশি হলে, বা প্রোডাক্ট ৫০০ ছাড়ালে, একটা VPS নিন — প্রতি মাসে ৳৮০০-১৫০০-এর মধ্যে ভালো অপশন আছে, আর পার্থক্যটা গ্রাহক টের পান।
পেজ বিল্ডার দিয়ে চেকআউট বানানো যাবে? টেকনিক্যালি যায়, কিন্তু করবেন না। চেকআউট WooCommerce-এর সবচেয়ে সংবেদনশীল পেজ; বিল্ডারের অতিরিক্ত DOM আর স্ক্রিপ্ট পেমেন্ট গেটওয়ের JavaScript-এর সাথে সংঘর্ষ বাধায়। ডিজাইন করুন CSS দিয়ে, স্ট্রাকচার WooCommerce-এরটাই রাখুন।
নতুন দোকান দাঁড় করাচ্ছেন, নাকি পুরনো একটার লিক ধরতে চান — স্ট্যাক অ্যালিক্স WooCommerce সেটআপ, গেটওয়ে ইন্টিগ্রেশন আর পারফরম্যান্স অডিটের কাজ করে। উপরের চেকলিস্টটা নিজে চালিয়ে দেখুন; কোনো ধাপে আটকে গেলে জানাবেন।

