1কী কী লাগবে
আপনার ওয়েবসাইট দুটি API দেবে, আর প্রোডাক্ট বা অর্ডার বদলালে OmniConva-কে ওয়েবহুক পাঠাবে। সব কিছু HTTPS-এর উপর JSON।
| অংশ | দিক | দরকার? |
|---|---|---|
| Products API — পেজ ধরে পুরো ক্যাটালগ | OmniConva → ওয়েবসাইট | হ্যাঁ |
| Order API — কাস্টমার চ্যাটে অর্ডার কনফার্ম করলে | OmniConva → ওয়েবসাইট | হ্যাঁ |
| Product Detail API — অর্ডারের আগে লাইভ দাম ও স্টক দেখা | OmniConva → ওয়েবসাইট | না |
| Webhooks — প্রোডাক্ট ও অর্ডার স্ট্যাটাস বদল | ওয়েবসাইট → OmniConva | জোরালোভাবে প্রস্তাবিত |
দুটি JSON ফরম্যাট চলে: Standard (নতুন ইন্টিগ্রেশনের জন্য) আর Alternative — nested metadata, pricing, variations আর contact/line_items অর্ডারওয়ালা কাঠামো, যা অনেক সাইটে আগে থেকেই আছে। Alternative বেছে নিলে আপনার সাইটের কোড বদলাতে হয় না, শুধু URL আর টোকেন।
2Laravel সাইট? প্যাকেজ ব্যবহার করুন
Laravel ১২ বা ১৩ (PHP ৮.২+) সাইটের জন্য omniconva/laravel প্যাকেজ নিচের সব API আর ওয়েবহুক নিজেই সামলায় — রিকোয়েস্ট সিগনেচার যাচাই, একই অর্ডার দুবার না হওয়া, আর প্রোডাক্ট বদলালে ওয়েবহুক পাঠানো। আপনার ডেভেলপার শুধু দুটি ক্লাস লেখেন।
composer require omniconva/laravel
php artisan omniconva:install
php artisan migrateclass Products extends EloquentProductSource
{
public function query(): Builder
{
return Product::query()->with(['variants', 'images']);
}
public function map(Model $product): ProductData
{
return ProductData::make($product->id, $product->name)
->url(route('products.show', $product))
->price($product->price)
->salePrice($product->sale_price)
->stockQuantity($product->stock)
->images($product->images->pluck('url'))
->variants($product->variants->map(
fn ($v) => VariantData::make($v->id, $v->name)
->price($v->price)
->stockQuantity($v->stock)
->options(['Size' => $v->size])
));
}
}class Orders implements OrderHandler
{
public function createOrder(OrderData $order): OrderResult
{
$saved = Order::create([
'customer_name' => $order->customer->name,
'phone' => $order->customer->phone,
'address' => $order->shippingAddress->address,
'total' => $order->total,
]);
return OrderResult::make($saved->id, $saved->number);
}
}- প্রোডাক্ট মডেলে
use SyncsWithOmniConva;দিলে সেভ বা ডিলিট হলেই OmniConva আপডেট হয়। OmniConva::orderUpdated($id, 'shipped', $tracking)দিয়ে অর্ডার স্ট্যাটাস জানান।- লেআউটে
<x-omniconva-chat />দিলে চ্যাট উইজেট দেখাবে। php artisan omniconva:testসব কিছু ঠিক আছে কি না যাচাই করে।
3Node.js সাইট? প্যাকেজ ব্যবহার করুন
Express, NestJS, Next.js, Hono বা Bun-এ বানানো সাইটের জন্য @omniconva/node প্যাকেজ একই কাজ করে: API সার্ভ করা, সিগনেচার যাচাই, একই অর্ডার দুবার না হওয়া আর ওয়েবহুক। আপনার ডেভেলপার শুধু দুটি ফাংশন লেখেন।
import express from 'express';
import { createOmniConva } from '@omniconva/node';
const omniconva = createOmniConva({
products: {
async list({ page, perPage }) {
const { rows, total } = await db.products.page(page, perPage);
return { products: rows.map(toOmniConva), total };
},
async get(id) {
const row = await db.products.find(id);
return row ? toOmniConva(row) : null;
},
},
orders: {
async create(order) {
const saved = await db.orders.create(order);
return { orderId: saved.id, orderNumber: saved.number };
},
},
});
const app = express();
app.use(omniconva.express()); // before express.json()
// after saving a product
await omniconva.productUpdated(toOmniConva(product));4ড্যাশবোর্ডে কানেক্ট করা
- Settings › Connection › Custom website সারিতে Connect চাপুন।
- Website URL, কারেন্সি আর API format দিন।
- Products API-এর URL আর হেডার (যেমন
Authorization: Bearer …) দিন, তারপর Test Products API চাপুন — প্রথম পেজের প্রোডাক্টগুলো যেমন পড়া হলো তা দেখাবে। - Order API-এর URL আর হেডার দিন। চাইলে Send test order দিয়ে একটি টেস্ট অর্ডার পাঠান।
- Connect website চাপুন। প্রোডাক্ট ইমপোর্ট নিজে থেকে শুরু হবে, আর Webhooks অংশে আপনার ওয়েবহুক URL, টোকেন ও সাইনিং সিক্রেট দেখাবে।
5Products API (Standard ফরম্যাট)
GET https://yourwebsite.com/api/products?page=1&per_page=50
Authorization: Bearer <your products API token>page ১ থেকে শুরু। প্যারামিটারের নাম বদলানো যায়, বাড়তি query যোগ করা যায়, আর দরকারে POST ও JSON body ({page}, {per_page} সহ) ব্যবহার করা যায়।
{
"products": [
{
"id": "1001",
"title": "Hero Hoodie",
"url": "https://yourwebsite.com/products/hero-hoodie",
"description": "<p>Warm fleece hoodie.</p>",
"short_description": "Warm fleece hoodie.",
"status": "active",
"sku": "HOODIE",
"brand": "Hero",
"categories": [
"Hoodies"
],
"tags": [
"fleece"
],
"images": [
"https://cdn.yourwebsite.com/hoodie.jpg"
],
"currency": "BDT",
"price": "1500.00",
"sale_price": "1200.00",
"in_stock": true,
"stock_quantity": 7,
"variants": [
{
"id": "1001-M",
"title": "M",
"sku": "HOODIE-M",
"price": "1500.00",
"sale_price": "1200.00",
"in_stock": true,
"stock_quantity": 7,
"image": null,
"options": {
"Size": "M"
}
}
],
"updated_at": "2026-10-01T10:00:00Z"
}
],
"page": 1,
"per_page": 50,
"total": 128,
"has_more": true
}| ফিল্ড | নোট |
|---|---|
id, title | আবশ্যক। id কখনো বদলাবে না; ভ্যারিয়েন্টেরও নিজস্ব id লাগবে। |
status | active বিক্রির জন্য; draft বা অন্য কিছু বিক্রি হবে না। |
price, sale_price | sale_price দামের চেয়ে কম হলেই গোনা হয়। |
in_stock, stock_quantity | যেকোনো একটি বা দুটোই। stock_quantity: null মানে স্টক গোনা হয় না। |
images | পূর্ণ https URL; সর্বোচ্চ ৮টি রাখা হয়। |
has_more | পরের পেজ আছে কি না। না থাকলে total থেকে হিসাব হয়। |
6প্রোডাক্ট ওয়েবহুক (ওয়েবসাইট → OmniConva)
POST https://api.omniconva.com/webhooks/custom-website/<store id>
Authorization: Bearer <webhook token>
X-Webhook-Topic: product.updated
Content-Type: application/json| X-Webhook-Topic | Body |
|---|---|
product.created, product.updated | পুরো প্রোডাক্ট, Products API-র মতো একই আকারে। |
product.deleted | {"id": "1001"} |
order.updated | নিচের অর্ডার স্ট্যাটাস অংশ দেখুন। |
Alternative ফরম্যাটে product/create, product/update, product/delete টপিকও চলে, আর ডিলিটের body {"product_id": …} হতে পারে। উত্তর: 200 হয়েছে, 400 body ব্যবহারযোগ্য নয় (কারণ লেখা থাকে), 401 টোকেন বা সিগনেচার ভুল। ~৫ সেকেন্ড টাইমআউট রাখুন আর 5xx হলে আবার পাঠান।
সাইন করা ওয়েবহুক (প্রস্তাবিত)
X-OmniConva-Signature: t=<unix সেকেন্ড>,v1=<hex HMAC-SHA256> যোগ করুন — সাইনিং সিক্রেট দিয়ে "<t>.<raw body>"-এর HMAC। ৫ মিনিটের পুরোনো সিগনেচার ফেরত যায়। সব ওয়েবহুক সাইন হলে ড্যাশবোর্ডে Require signed webhooks চালু করুন।
// Node.js: sign the exact body you send.
const crypto = require("crypto");
const body = JSON.stringify(payload);
const t = Math.floor(Date.now() / 1000);
const v1 = crypto
.createHmac("sha256", SIGNING_SECRET)
.update(`${t}.${body}`)
.digest("hex");
await fetch(WEBHOOK_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${WEBHOOK_TOKEN}`,
"X-Webhook-Topic": "product.updated",
"X-OmniConva-Signature": `t=${t},v1=${v1}`,
},
body,
});আমাদের রিকোয়েস্টও সাইন করা থাকে
OmniConva আপনার API-তে যত কল করে সবগুলোতে X-OmniConva-Signature থাকে: একই সিক্রেট দিয়ে "<t>.<METHOD>.<path ও query>.<body>"-এর HMAC (GET-এ body খালি)। চাইলে এটি যাচাই করে নিশ্চিত হোন কলটি আমাদের কাছ থেকেই এসেছে।
7Order API (Standard ফরম্যাট)
POST https://yourwebsite.com/api/orders
Authorization: Bearer <your order API token>
Content-Type: application/json
Idempotency-Key: <OmniConva order id>{
"id": "6a3f0c1e-2b7d-4c1a-9f3e-8d2b1c0a9e77",
"order_number": "1042",
"source": "omniconva",
"currency": "BDT",
"customer": {
"name": "Rahim Uddin",
"phone": "01711000000"
},
"shipping_address": {
"address": "House 12, Road 4, Dhanmondi",
"city": "Dhaka",
"state": null,
"postcode": null,
"country": "BD"
},
"items": [
{
"product_id": "1001",
"variant_id": "1001-M",
"sku": "HOODIE-M",
"title": "Hero Hoodie – M",
"quantity": 2,
"unit_price": "1200.00",
"total": "2400.00",
"image": "https://cdn.yourwebsite.com/hoodie.jpg"
}
],
"subtotal": "2400.00",
"discount": "0.00",
"shipping": {
"title": "Inside Dhaka",
"amount": "60.00"
},
"fees": [],
"total": "2460.00",
"payment": {
"method": "cash_on_delivery",
"status": "unpaid"
},
"note": "Placed through OmniConva chat, cash on delivery."
}{
"order_id": "W-5531",
"order_number": "5531"
}Idempotency-Key দিয়ে আবার পাঠানো হয়। এই কী আগে দেখে থাকলে নতুন অর্ডার না বানিয়ে আগের অর্ডারটাই ফেরত দিন (2xx, বা অর্ডার id সহ 409)।"test": true আর X-OmniConva-Test: 1 হেডার থাকে — এগুলো বাদ দিন।8Product Detail API (ঐচ্ছিক)
GET https://yourwebsite.com/api/products/{id}একটি প্রোডাক্ট ফেরত দিন (Products API-র মতো একই আকারে); না থাকলে 404। এটি থাকলে অর্ডার কনফার্মের আগে লাইভ দাম ও স্টক মেলানো হয়; না থাকলে ওয়েবহুকে আপডেট থাকা ক্যাটালগ ব্যবহার হয়।
9অর্ডার স্ট্যাটাস আপডেট
একই ওয়েবহুক URL আর টোকেন, X-Webhook-Topic: order.updated দিয়ে। Order API যে id ফেরত দিয়েছিল সেটি (বা আমাদের id omniconva_order_id) দিন। এতে এআই কাস্টমারকে "আমার অর্ডার কোথায়?"-এর উত্তর দিতে পারে, আর ড্যাশবোর্ডের Orders-এ স্ট্যাটাস ও ট্র্যাকিং দেখায়।
{
"order_id": "W-5531",
"status": "shipped",
"tracking": {
"number": "TRK123",
"carrier": "Pathao",
"url": "https://track.example.com/TRK123"
},
"note": "Rider assigned",
"updated_at": "2026-10-10T10:00:00Z"
}10Alternative ফরম্যাট
একই API আর ওয়েবহুক, ভিন্ন JSON। ড্যাশবোর্ডে API format › Alternative বেছে নিন।
{
"metadata": {
"total": 128,
"page": 1,
"per_page": 50
},
"products": [
{
"id": 6001,
"title": "Classic Cotton T-Shirt",
"url": "https://yourwebsite.com/products/classic-cotton-tshirt",
"description": "<p>Premium organic cotton t-shirt.</p>",
"summary": "Premium organic cotton t-shirt.",
"published": true,
"is_draft": false,
"purchasable": true,
"sku": "TSHIRT-CLASSIC",
"brand": "EcoWear",
"tags": [
"cotton"
],
"categories": [
{
"id": 20,
"title": "Shirts",
"slug": "shirts"
}
],
"images": [
{
"url": "https://cdn.yourwebsite.com/tshirt.jpg"
}
],
"pricing": {
"regular_price": "24.99",
"sale_prices": []
},
"inventory": {
"stock_status": true,
"stocks": []
},
"variations": [
{
"id": 6002,
"title": "Small / Red",
"sku": "TSHIRT-S-RED",
"published": true,
"pricing": {
"regular_price": "24.99",
"sale_prices": []
},
"inventory": {
"stock_status": true,
"stocks": [
{
"quantity": 50
}
]
},
"images": [],
"attributes": [
{
"id": 5,
"name": "Size",
"value": "Small"
},
{
"id": 6,
"name": "Color",
"value": "Red"
}
]
}
],
"updated_at": "2026-02-25T16:30:00"
}
]
}published: falseবাis_draft: trueহলে বিক্রি হবে না;purchasable: falseমানে স্টক নেই।pricing.sale_prices-এর এখন চলমান প্রথম এন্ট্রিই সেল প্রাইস (সংখ্যা, স্ট্রিং বা{price, start, end})।inventory.stocks-এর পরিমাণগুলো যোগ হয়; খালি হলেstock_statusবলে স্টক আছে কি না।- কারেন্সি ফিল্ড নেই, তাই ড্যাশবোর্ডে দেওয়া কারেন্সি ব্যবহার হয়।
{
"id": 1042,
"deliveryCharge": "60",
"contact": {
"name": "Customer Name",
"phone": "01700000000",
"address": "House 12, Road 4, Dhanmondi, Dhaka"
},
"total_price": 1258,
"note": "Placed through OmniConva chat, cash on delivery.",
"payment_method": "cash_on_delivery",
"payment_status": "unpaid",
"line_items": [
{
"product_id": "6001",
"sku": "TSHIRT-S-RED",
"variation_id": "6002",
"name": "Classic Cotton T-Shirt – Small / Red",
"price": 599,
"quantity": 2,
"image": "https://cdn.yourwebsite.com/tshirt.jpg"
}
],
"omniconva_order_id": "6a3f0c1e-2b7d-4c1a-9f3e-8d2b1c0a9e77",
"city": "Dhaka",
"discount": 0
}id হলো OmniConva-র অর্ডার নম্বর। ভ্যারিয়েশন না থাকলে variation_id আর product_id একই। omniconva_order_id, city, discount বাড়তি ফিল্ড — সাইট চাইলে উপেক্ষা করতে পারে। Idempotency-Key আর উত্তরের নিয়ম Standard-এর মতোই।
11কিছু ব্যর্থ হলে
- অর্ডার পুশ: প্রথম চেষ্টা ব্যর্থ হলে অর্ডার হারায় না — কাস্টমারকে জানানো হয় স্টোর কনফার্ম করবে, আর ব্যাকগ্রাউন্ডে আবার পাঠানো হয়। শেষ চেষ্টাও ব্যর্থ হলে অর্ডারটি Failed হয়, স্টাফ নোটিফিকেশন পায়, আর Orders পেজে Retry push বাটন আসে।
- ইমপোর্ট: যে প্রোডাক্ট পড়া যায় না তা বাদ পড়ে আর Connection Logs-এ গোনা হয়।
- প্রতিটি কলের সময়সীমা আছে (প্রোডাক্ট ১৫ সেকেন্ড, অর্ডার ২০ সেকেন্ড) আর উত্তরের আকার সর্বোচ্চ ১০ MB।
আরও সাহায্য লাগবে?
আপনার অ্যাকাউন্টের মোবাইল নম্বর আর কী করতে চাইছিলেন তা লিখে আমাদের ইমেইল করুন।
[email protected]