ওয়েবহুকে সাবমিশন পাঠান এবং রিসিভারের মিস করাগুলো আবার চেষ্টা করুন
ফর্মে একটি ওয়েবহুক এন্ডপয়েন্ট যোগ করুন, রিসিভারে সিগনেচার যাচাই করুন, আর বিভ্রাটের পর ব্যর্থ ডেলিভারি পুনরায় চেষ্টা করুন ব্যবহার করুন। FormFlow নিজে কী আবার চেষ্টা করে, আর কী আবার পাঠাবে না।
এই পোস্টটি যন্ত্রের মাধ্যমে অনুবাদ করা হয়েছে। ইংরেজিতে মূল পোস্টটি পড়ুন

একটি ওয়েবহুক প্রতিটি গৃহীত সাবমিশন কয়েক সেকেন্ডের মধ্যে আপনার নিজের মালিকানাধীন একটি URL-এ পাঠায়, ফলে ইমেইল ডাইজেস্টের অপেক্ষা না করেই একটি লিড আপনার CRM বা আপনার নিজের কোডে পৌঁছাতে পারে। ওয়েবহুক FormFlow-এ আছে v1.0.0 থেকে। এই টিউটোরিয়ালে একটি এন্ডপয়েন্ট যোগ করা হয়েছে, দেখানো হয়েছে আপনার রিসিভার কী পায় এবং কীভাবে তা যাচাই করবেন, তারপর সেই অংশটি, যা আপনার রিসিভার বন্ধ থাকার দিনে গুরুত্বপূর্ণ: FormFlow নিজে কী আবার চেষ্টা করে এবং বাকিগুলো ব্যর্থ ডেলিভারি পুনরায় চেষ্টা করুন দিয়ে কীভাবে আবার পাঠাবেন।
যা লাগবে
একটি রিসিভার, যা আপনার নিয়ন্ত্রণে এবং যা JSON বডিসহ একটি POST গ্রহণ করে। এর ঠিকানা অবশ্যই https হতে হবে এবং শুধু পাবলিক ঠিকানায় রিজলভ হতে হবে। সংরক্ষণের সময় প্যানেল এর বাইরের সবকিছু প্রত্যাখ্যান করে, তাই localhost ঠিকানা কাজ করে না, আর পরীক্ষার স্বাভাবিক উপায় একটি টানেল।
এন্ডপয়েন্ট যোগ করুন
প্যানেলে ফর্মটি খুলুন এবং ডেলিভারি ট্যাবে যান।
ওয়েবহুক এন্ডপয়েন্টসমূহ-এর নিচে এন্ডপয়েন্ট যোগ করুন চাপুন।
যে নামে পাঠানো হবে ঘরে FormFlow JSON (স্বাক্ষরিত) যেমন আছে তেমনই রাখুন। অন্য বিকল্প, Slack বার্তা, একটি Slack ইনকামিং ওয়েবহুক URL নেয়।
এন্ডপয়েন্ট URL-এ আপনার রিসিভারের ঠিকানা পেস্ট করুন এবং ডেলিভার করা হচ্ছে চালু রাখুন।
ফর্মটি সংরক্ষণ করুন। আপনার ওয়েবহুক সাইনিং সিক্রেটগুলো এখনই কপি করুন শিরোনামের একটি বিজ্ঞপ্তি প্রতিটি নতুন এন্ডপয়েন্টের URL ও সিক্রেট দেখায়। আপনি বাতিল না করা পর্যন্ত এটি স্ক্রিনে থাকে, আর এতে লেখা থাকে সিক্রেট আর দেখানো হবে না। সিক্রেটটি আপনার সিক্রেট ম্যানেজারে রাখুন। নতুন একটি পেতে এন্ডপয়েন্টটি মুছে আবার যোগ করুন।
এন্ডপয়েন্টের সারিতে টেস্ট পাঠান চাপুন। আপনি পাবেন টেস্ট সফলভাবে ডেলিভার হয়েছে, অথবা টেস্ট ডেলিভারি ব্যর্থ হয়েছে, সঙ্গে আপনার রিসিভারের নিজস্ব ত্রুটির লেখা। সারিটি আগে সংরক্ষিত হতে হবে, আর বোতামটি ঘণ্টায় ২০টি টেস্ট ডেলিভারিতে সীমিত।
তারপর একটি আসল সাবমিশন পাঠান এবং প্যানেলে সেটি খুলুন। এর ডেলিভারি অনুরোধগুলো টেবিল সেই সাবমিশনের জন্য পাওনা প্রতিটি গন্তব্য তালিকাভুক্ত করে, সঙ্গে স্ট্যাটাস, অপেক্ষমান, বরাদ্দকৃত (Leased), ডেলিভার হয়েছে বা নিষ্ক্রিয় (Dead), চেষ্টার সংখ্যা, ডেলিভারি আইডি এবং শেষ ত্রুটি।
আপনার রিসিভার কী পায়
স্প্যাম নয় এমন প্রতিটি সাবমিশনের জন্য একটি POST। বডি একটি ছোট JSON ডকুমেন্ট, আর সঙ্গে আসে তিনটি হেডার। প্লেসহোল্ডার মানসহ এর আকার এমন:
{
"id": "SUBMISSION_UUID",
"form": { "id": "FORM_UUID", "name": "Contact Us" },
"submitted_at": "2026-10-08T09:00:00+00:00",
"data": { "name": "Ada Lovelace", "email": "ada@example.com" }
}X-FormFlow-Timestamp হলো চেষ্টার সময়, সেকেন্ডে।
X-FormFlow-Signature-256 হলো sha256= এবং তার পরে টাইমস্ট্যাম্প, একটি ডট ও কাঁচা বডির HMAC-SHA256, এন্ডপয়েন্টের সিক্রেটকে কী ধরে।
X-FormFlow-Delivery-Id ডেলিভারিটি শনাক্ত করে। প্রতিটি পুনরায় চেষ্টায় এটি একই থাকে।
অনুরোধকে বিশ্বাস করার আগে সিগনেচার যাচাই করুন, কাঁচা বডির ওপর, আবার এনকোড করা কপির ওপর নয়। FormFlow-এর API ডকুমেন্টেশনে দেওয়া আকারে একটি PHP সংস্করণ:
function formflow_verify(string $rawBody, string $timestamp, string $signature, string $secret): bool
{
if (abs(time() - (int) $timestamp) > 300) {
return false;
}
$expected = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $rawBody, $secret);
return hash_equals($expected, $signature);
}
FormFlow নিজে কী আবার চেষ্টা করে
FormFlow সাড়ার জন্য সর্বোচ্চ ১০ সেকেন্ড অপেক্ষা করে। যেকোনো 2xx সাড়া ডেলিভার হয়েছে বলে গণ্য হয়। টাইমআউট, ছিন্ন সংযোগ, 408, 429 বা 5xx সাড়া আবার চেষ্টা করা হয়, মোট সর্বোচ্চ ছয়বার, মাঝখানে অপেক্ষা ১০ সেকেন্ড, ১ মিনিট, ৫ মিনিট, ৩০ মিনিট ও ২ ঘণ্টা। অন্য যেকোনো সাড়া, 3xx বা 4xx সহ, স্থায়ী প্রত্যাখ্যান হিসেবে ধরা হয় এবং নিজে থেকে আবার চেষ্টা করা হয় না। FormFlow রিডাইরেক্ট অনুসরণ করে না, তাই রিডাইরেক্ট দিয়ে সাড়া দেওয়া এন্ডপয়েন্ট ব্যর্থ বলে গণ্য হয়। এন্ডপয়েন্টকে তার চূড়ান্ত ঠিকানায় নির্দেশ করুন।
কোনো এন্ডপয়েন্ট বারবার আবার চেষ্টা করতে বলতে থাকলে এবং চেষ্টা ফুরিয়ে গেলে FormFlow তার জন্য ডেলিভার করা হচ্ছে বন্ধ করে দেয় এবং টিমের মালিকদের ইমেইলে জানায়। যে ডেলিভারির চেষ্টা ফুরিয়েছে সেটি নিষ্ক্রিয় (Dead) হিসেবে দেখায়। ড্যাশবোর্ডও যে ওয়েবহুকের পাঠানো বন্ধ, তাকে তার ব্যর্থতার ধারাসহ তালিকাভুক্ত করে যেতে থাকে, যতক্ষণ না একটি ডেলিভারি সফল হয়।
রিসিভারের মিস করা ডেলিভারি আবার চেষ্টা করুন
v1.33-এর আগে প্রতিটি মিস করা সাবমিশনের জন্য আলাদা এখনই পুনরায় চেষ্টা করুন লাগত। এখন একটি চাপই একটি এন্ডপয়েন্টকে ধরে। রিলিজটি আছে পরিবর্তনের তালিকা-য়। ক্রমটি গুরুত্বপূর্ণ:
আগে রিসিভার ঠিক করুন। প্রতিটি ব্যর্থ ডেলিভারি আরও একবার চেষ্টার সুযোগ পায়, তাই এখনও ভাঙা রিসিভারের বিরুদ্ধে আবার চেষ্টা শুধু আবার ব্যর্থ হয়।
ডেলিভারি ট্যাবে এন্ডপয়েন্টের ডেলিভার করা হচ্ছে সুইচটি দেখুন। FormFlow সেটি বন্ধ করে দিলে চালু করে ফর্মটি সংরক্ষণ করুন। বন্ধ করা এন্ডপয়েন্টে আবার চেষ্টা প্রত্যাখ্যাত হয় এই বার্তায়: "ডেলিভার করা হচ্ছে চালু করুন এবং ফর্মটি সংরক্ষণ করুন, তারপর পুনরায় চেষ্টা করুন।"
এন্ডপয়েন্টের সারিতে ব্যর্থ ডেলিভারি পুনরায় চেষ্টা করুন চাপুন এবং নিশ্চিত করুন। ডায়ালগ বলে, যে ব্যর্থ ডেলিভারি এখনও পাঠানো যায় তার প্রতিটি আবার কিউতে দেওয়া হয়, মূল ডেলিভারি আইডি ও পেলোডসহ।
একটি বিজ্ঞপ্তি জানায় কতগুলো কিউতে গেছে। এক চাপে সর্বোচ্চ ৫০০টি যায়। আরও বাকি থাকলে সেটি আবার চাপতে বলে।
একটি সাবমিশন খুলে তার ডেলিভারি অনুরোধগুলো টেবিল দেখুন। চেষ্টার সংখ্যা বেড়ে গেছে এবং স্ট্যাটাস ডেলিভার হয়েছে-তে পৌঁছানো উচিত।
এন্ডপয়েন্টের URL, সিক্রেট বা ফরম্যাট বদলালে সেটি নতুন করে শুরু হয়। বদলানোর আগের ডেলিভারিগুলো আবার পাঠানো হয় না, আর v1.35.1 থেকে ড্যাশবোর্ড পুরোনো ব্যর্থতাগুলো নতুন ঠিকানার হিসাবে গোনে না। কিছু না বদলে এন্ডপয়েন্ট বন্ধ করে আবার চালু করলে তার ব্যর্থতার রেকর্ড থেকে যায়।
যে সীমাবদ্ধতাগুলো জানা দরকার
নতুন এন্ডপয়েন্ট শুধু সেট আপ করার পরে আসা সাবমিশন পায়। আপনার আগে থেকে থাকা সাবমিশনগুলো তাকে পাঠানো হয় না।
স্প্যাম ফরওয়ার্ড করা হয় না।
ব্যর্থ ডেলিভারি পুনরায় চেষ্টা করুন শুধু সেই ডেলিভারিগুলো আবার পাঠায় যেগুলো এখনও পাঠানো যায়, আর শুধু এন্ডপয়েন্টটি এখন যেমন আছে তার কাছে।
ডেলিভারি অন্তত একবার। আপনার রিসিভারকে পুনরাবৃত্তি সহ্য করতে হবে।