পয়েন্ট অব সেলে ক্রিপ্টো গ্রহণ
পয়েন্ট অব সেলে ক্রিপ্টো গ্রহণ মানে আপনার কাউন্টারে দাঁড়ানো গ্রাহক একটি ডিজিটাল অ্যাসেটে পেমেন্ট করছেন — USDC-র মতো stablecoin বা BTC-র মতো কয়েন — আর আপনি, মার্চেন্ট, টাকা পাচ্ছেন ইউরোতে। গ্রাহক যে অ্যাসেট পাঠান আর আপনি যে অর্থ পান, তা দুটি আলাদা জিনিস, যাদের জোড়া লাগায় ট্যাপের মুহূর্তে নির্ধারিত একটি কোট। আপনার tilI, হিসাব বা ব্যাংক অ্যাকাউন্ট কিছুই জানতে পারে না যে এখানে ক্রিপ্টো ছিল। টার্মিনাল ইউরোতে দাম দেখায়, গ্রাহক কোড স্ক্যান করেন, কয়েক সেকেন্ড পরে বিক্রি ইউরোতেই বন্ধ হয় — কার্ডে হলে যে লাইনে বসত, ঠিক সেই লাইনেই। পয়েন্ট অব সেলে ক্রিপ্টো একটি পেমেন্ট মেথড, অ্যাকাউন্টিংয়ের পরিবর্তন নয়, আর এটাকে সেভাবেই রাখাই পুরো ইঞ্জিনিয়ারিং সমস্যা।
কথাটা আগে বলে নেওয়া দরকার, কারণ ক্রিপ্টো পেমেন্ট নিয়ে বেশিরভাগ বিভ্রান্তি আসে দুটি আলাদা প্রশ্নকে এক করে ফেলা থেকে: গ্রাহক কীভাবে পে করেন, আর মার্চেন্ট কোন কারেন্সি রাখেন। দুটিকে আলাদা করলেই বাকিটা পরিষ্কার হয়ে যায়।
আসলে যে সমস্যাটি সমাধান করতে হবে
মার্চেন্ট চান বিক্রি, ভোলাটিলিটি নয়। দিন শেষে অনিশ্চিত মূল্যের একগাদা অ্যাসেট হাতে থাকুক, তা তাঁরা চান না; আর তাঁদের বুককিপার হঠাৎ দুই কারেন্সিতে কথা বলুন, তাও না। তাঁরা চান ট্যাপ থেকে রসিদ পর্যন্ত দাম স্থির থাকুক, অর্থ ইউরোতে আসুক, আর reconciliation দেখতে হোক অন্য যেকোনো কার্ডের দিনের মতো। সরলভাবে ক্রিপ্টো নেওয়া দোকান এর কিছুই পায় না: গ্রাহক সিদ্ধান্ত নেওয়ার মধ্যেই দাম বদলে যাওয়া অ্যাসেট সে নেয়, একটি ওয়ালেটে ফেলে রাখে, আর হিসাবে দ্বিতীয় একটি কারেন্সি পায় যার মূল্য নির্ধারণ ও রূপান্তর এখন কাউকে হাতে করতে হয়। তাই ডিজাইনের লক্ষ্য সংকীর্ণ ও কঠোর — ক্রিপ্টোকে দৃশ্যমান রাখুন ঠিক এক জায়গায়, পেমেন্টের মুহূর্তে, আর বাকি সব জায়গায় অদৃশ্য।
এক ট্যাপ: QR, লকড কোট, ইউরো লাইন
কাউন্টারের ফ্লো দেখা যাক। ক্যাশিয়ার €24.00-এর একটি বাস্কেট রিং করেন। টার্মিনাল ইউরোতে মোট দেখায় এবং একটি QR কোড রেন্ডার করে, যাতে অনুরোধটি এনকোড করা থাকে — পরিমাণ, গন্তব্য অ্যাড্রেস বা ইনভয়েস, আর স্বল্পস্থায়ী একটি কোট আইডি। গ্রাহক নিজের ওয়ালেট দিয়ে স্ক্যান করেন, ঠিক কী পাঠাতে যাচ্ছেন দেখেন, এবং কনফার্ম করেন। টার্মিনাল নেটওয়ার্কে সেই ট্রান্সফারের দিকে নজর রাখে এবং কনফার্মেশন এলে ইউরোতে রসিদ প্রিন্ট করে। ক্যাশিয়ারের দিক থেকে ছন্দটা কার্ডের মতোই: মোট, প্রেজেন্ট, approve, রসিদ। কাউন্টারের ওপাশে কেউ অ্যাড্রেস টাইপ করেন না, বা ইউরো ছাড়া অন্য কিছুতে ব্যালেন্স পড়েন না।
অনুরোধটি QR-এর ভেতরে রাখাই একে অচেনা কারও ফোনে তুলে দেওয়ার মতো নিরাপদ করে। পরিমাণ ও গন্তব্য কোডের মধ্যেই checksum-সহ যায়, তাই ভুল টাইপ করে ভুল অ্যাড্রেসে বা ভুল পরিমাণে পে করার সুযোগ থাকে না — collections দিকে identity-by-construction-এর যে কৌশল, এখানে সেটিই কাউন্টারে প্রয়োগ। যে কোড স্ক্যান হয়, সেটি সঠিক; ভুল করার মতো কোনো ফ্রি-টেক্সট ফিল্ড নেই।
ইউরোতে সেটলমেন্ট, যাতে হিসাব ক্রিপ্টো টেরই না পায়
গ্রাহকের পাঠানো অ্যাসেট আর মার্চেন্টের রাখা ইউরোর মাঝখানে বসে কনভার্সন, আর সেটি কোথায় বসে সেটাই পুরো কৌশল। গ্রাহক পাঠান USDC বা BTC; প্ল্যাটফর্ম কনভার্ট করে মার্চেন্টের অ্যাকাউন্টে EUR-এ ক্রেডিট দেয়। মার্চেন্টের ledger শুধু একটি ইউরো ক্রেডিট ও একটি ইউরো ফি লাইন দেখে — কার্ড সেটলমেন্টের মতোই — কারণ অ্যাসেট রূপান্তর হয় প্ল্যাটফর্মে, মার্চেন্টকে সামলাতে হবে এমন ওয়ালেটে পড়ে থাকে না। দিন শেষে হিসাব আগাগোড়া ইউরোতে। মূল্য নির্ধারণের মতো কয়েনের ঝুড়ি নেই, হিসাবে দ্বিতীয় কারেন্সি নেই, আর সোমবার সকালে off-ramp করার মতো কিছুও নেই।
গ্রাহকের কাজ হলো তাঁর কাছে যা আছে তা দিয়েই পে করা। মার্চেন্টের কাজ এক কারেন্সিতে হিসাব রাখা। ক্রিপ্টোকে ইউরোতে সেটল করা পয়েন্ট অব সেল হলো সেই যন্ত্র, যা এই দুটি বাস্তবতাকে কখনো মুখোমুখি হতে দেয় না।
রেট লক করা হয়, তাড়া করা হয় না
ভয়টা ভোলাটিলিটির, আর তার উত্তর হলো কাউন্টডাউনসহ লকড কোট। টার্মিনাল যখন ইউরোতে দাম দেখায়, তখনই সে একটি নির্দিষ্ট সময়ের জন্য বৈধ কোটও নির্ধারণ করে — কয়েক সেকেন্ড। গ্রাহক সেই সময়ের মধ্যে, সেই কোটের বিপরীতে পে করেন, আর মার্চেন্ট যে ইউরো ক্রেডিট পান তা স্ক্রিনে দেখা ইউরোই, ওয়ালেট লোড হওয়ার ফাঁকে বাজার যা-ই করুক না কেন। গ্রাহক কনফার্ম করার আগে সময় শেষ হলে টার্মিনাল আবার কোট করে: নতুন কোড, নতুন কাউন্টডাউন, স্পষ্ট নতুন দাম — কখনো নীরবে সরে যাওয়া নয়। ট্যাপ ও কনফার্মেশনের মধ্যবর্তী ওঠানামার ঝুঁকি মার্চেন্টের নয়; সে ঝুঁকি তাঁর, যিনি কোট নির্ধারণ করেছেন — এক কাপ কফি বিক্রি করতে চাওয়া দোকানদারের নয়।
যখন গ্রাহক ধীর, বা টার্মিনাল অফলাইন
নেটওয়ার্ক আটকে যায়, দোকানের কানেকশন হারায়, তাই অফলাইন আচরণ ইচ্ছাকৃতভাবেই নিরামিষ হওয়া দরকার। দুটি ক্ষেত্র। গ্রাহক ধীর হলে কোট শুধু expire হয়ে আবার কোট করে — পেমেন্ট হয় সময়ের মধ্যে কনফার্ম হবে, নয়তো হবে না; গুটিয়ে নেওয়ার মতো অর্ধসমাপ্ত বিক্রি থাকে না। টার্মিনাল নিজে অফলাইন হলে সে জানা পরিমাণের জন্য অনুরোধ দেখাতে পারে, কিন্তু নতুন কোট নির্ধারণ বা সেটলমেন্ট কনফার্ম করতে পারে না; তাই সফলতার ভান না করে বিক্রিটি pending রাখে এবং পুনরায় সংযুক্ত হলে reconcile করে। মূল নিয়ম: রসিদ প্রিন্ট হয় কনফার্মেশনে, আশায় নয় — ইউরো রসিদ মানে ইউরোর হিসাব মিলেছে, আর যে বিক্রি টার্মিনাল কনফার্ম করতে পারেনি তা নীরবে হারিয়ে না গিয়ে অপারেটর কনসোলে খোলা ও দৃশ্যমান থাকে।
যেখানে টার্মিনাল gateway-র সাথে মেলে
কাউন্টার হলো সেই একই acceptance stack-এর সামনাসামনি রূপ, যা অনলাইনে চলে। কার্ড-প্রেজেন্ট ক্রিপ্টো ট্যাপ আর pay-by-link checkout ভেতরে একই ঘটনা — অনুরোধ, পেমেন্ট, ইউরো সেটলমেন্ট, রসিদ — শুধু ভিন্ন সারফেসে উপস্থাপিত। তাই মার্চেন্ট স্টোরের ক্রিপ্টো ও অনলাইন অর্ডার এক জায়গায়, ইউরোতে, একই ফি লাইন ও একই এক্সপোর্টে reconcile করেন; মাস শেষে দুটি হিসাব স্ট্যাপল করে জোড়া দিতে হয় না। টার্মিনাল আছে /products/pos-এ; একই রেলের অনলাইন দিক /products/gateway; আর কোট, সেটলমেন্ট, acquirer, reconciliation-এর মতো শব্দের সংজ্ঞা আছে /glossary-তে।
স্পষ্ট সীমারেখা
আপনার কাউন্টারে কেউ যদি ক্রিপ্টোতে পে করতে না চায়, তবে ক্রিপ্টো টার্মিনাল এমন সমস্যার সমাধান যা আপনার নেই — কার্ড নিন আর এগিয়ে যান। যেখানে আপনার গ্রাহকদের একটি বাস্তব অংশ আগে থেকেই ডিজিটাল অ্যাসেট রাখেন এবং আগে off-ramp না করে সরাসরি খরচ করতে চান, সেখানেই এর জায়গা: কিছু ভ্রমণ করিডর, কিছু অনলাইন-নেটিভ গোষ্ঠী, কিছু অঞ্চল যেখানে stablecoin-ই মানুষের খরচযোগ্য অর্থ রাখার স্বাভাবিক উপায়। সেসব জায়গায় ট্যাপ ফিরিয়ে দেওয়া মানে বিক্রি ফিরিয়ে দেওয়া। ওপরের ব্যবস্থা — QR, লকড কোট, ইউরোতে সেটলমেন্ট, কনফার্মের আগে রসিদ নয় নিয়ম — আপনাকে সেই বিক্রি নিতে দেয় ভোলাটিলিটি, দ্বিতীয় কারেন্সি বা বুককিপিং প্রজেক্ট ছাড়াই। ক্রিপ্টো থাকে গ্রাহকের দায়িত্বে; ইউরো থাকে আপনার।
কোনো সিস্টেম বানাতে চান?
সমস্যাটা আমাদের জানান। আমরা আর্কিটেকচার ও একটি পরিকল্পনা নিয়ে ফিরে আসব।