ডেভেলপারদের জন্য

নিজের ওয়েবসাইট কানেক্ট করা (API ও ওয়েবহুক)

নিজের বানানো ওয়েবসাইটকে প্রোডাক্ট API, অর্ডার API আর ওয়েবহুক দিয়ে OmniConva-র সাথে যুক্ত করুন — ডেভেলপারদের জন্য পুরো নির্দেশিকা।

এই গাইডের ভিডিও শিগগিরই আসছে।

ড্যাশবোর্ডে খুলুনসব গাইড

সর্বশেষ আপডেট: ১৬ অক্টোবর ২০২৬

← সাহায্য কেন্দ্র

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 migrate
class 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])
            ));
    }
}
app/OmniConva/Products.php — কোন প্রোডাক্ট, কীভাবে
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);
    }
}
app/OmniConva/Orders.php — অর্ডার সেভ করা
  • প্রোডাক্ট মডেলে use SyncsWithOmniConva; দিলে সেভ বা ডিলিট হলেই OmniConva আপডেট হয়।
  • OmniConva::orderUpdated($id, 'shipped', $tracking) দিয়ে অর্ডার স্ট্যাটাস জানান।
  • লেআউটে <x-omniconva-chat /> দিলে চ্যাট উইজেট দেখাবে।
  • php artisan omniconva:test সব কিছু ঠিক আছে কি না যাচাই করে।
টিপড্যাশবোর্ডে Custom website › Setup method › Laravel package বেছে নিন — URL বা হেডার লিখতে হবে না, শুধু ওয়েবসাইটের ঠিকানা। বাকি নির্দেশিকা হাতে বানানো API-র জন্য।

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));
npm install @omniconva/node
টিপড্যাশবোর্ডে Custom website › Setup method › Node.js package বেছে নিন। পুরো কোডসহ নির্দেশিকা প্যাকেজের README-তে আছে।

4ড্যাশবোর্ডে কানেক্ট করা

  1. Settings › Connection › Custom website সারিতে Connect চাপুন।
  2. Website URL, কারেন্সি আর API format দিন।
  3. Products API-এর URL আর হেডার (যেমন Authorization: Bearer …) দিন, তারপর Test Products API চাপুন — প্রথম পেজের প্রোডাক্টগুলো যেমন পড়া হলো তা দেখাবে।
  4. Order API-এর URL আর হেডার দিন। চাইলে Send test order দিয়ে একটি টেস্ট অর্ডার পাঠান।
  5. Connect website চাপুন। প্রোডাক্ট ইমপোর্ট নিজে থেকে শুরু হবে, আর Webhooks অংশে আপনার ওয়েবহুক URL, টোকেন ও সাইনিং সিক্রেট দেখাবে।
টিপDeveloper guide বাটন আপনার স্টোরের নিজের URL আর টোকেনসহ এই নির্দেশিকা দেখায় — প্রিন্ট বা PDF করে ডেভেলপারকে দিন।
খেয়াল রাখুনএর জন্য সক্রিয় প্ল্যান আর স্টোর ওনার রোল লাগে। API-র ঠিকানা পাবলিক https হতে হবে।

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 লাগবে।
statusactive বিক্রির জন্য; draft বা অন্য কিছু বিক্রি হবে না।
price, sale_pricesale_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-TopicBody
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."
}
OmniConva যা পাঠায়
{
  "order_id": "W-5531",
  "order_number": "5531"
}
আপনার উত্তর (যেকোনো 2xx)
খেয়াল রাখুনপুশ ব্যর্থ হলে প্রায় এক ঘণ্টায় ৬ বার একই 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"
    }
  ]
}
Products API-র উত্তর
  • 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
}
Order API-তে যা পাঠানো হয়

id হলো OmniConva-র অর্ডার নম্বর। ভ্যারিয়েশন না থাকলে variation_id আর product_id একই। omniconva_order_id, city, discount বাড়তি ফিল্ড — সাইট চাইলে উপেক্ষা করতে পারে। Idempotency-Key আর উত্তরের নিয়ম Standard-এর মতোই।

11কিছু ব্যর্থ হলে

  • অর্ডার পুশ: প্রথম চেষ্টা ব্যর্থ হলে অর্ডার হারায় না — কাস্টমারকে জানানো হয় স্টোর কনফার্ম করবে, আর ব্যাকগ্রাউন্ডে আবার পাঠানো হয়। শেষ চেষ্টাও ব্যর্থ হলে অর্ডারটি Failed হয়, স্টাফ নোটিফিকেশন পায়, আর Orders পেজে Retry push বাটন আসে।
  • ইমপোর্ট: যে প্রোডাক্ট পড়া যায় না তা বাদ পড়ে আর Connection Logs-এ গোনা হয়।
  • প্রতিটি কলের সময়সীমা আছে (প্রোডাক্ট ১৫ সেকেন্ড, অর্ডার ২০ সেকেন্ড) আর উত্তরের আকার সর্বোচ্চ ১০ MB।

আরও সাহায্য লাগবে?

আপনার অ্যাকাউন্টের মোবাইল নম্বর আর কী করতে চাইছিলেন তা লিখে আমাদের ইমেইল করুন।

[email protected]

সম্পর্কিত গাইড

অনলাইন স্টোর কানেক্ট করা

WooCommerce বা BitCommerz যুক্ত করুন যাতে প্রোডাক্ট, স্টক আর অর্ডার নিজে থেকে সিঙ্ক হয় — এআই সেখান থেকেই দাম আর স্টক বলবে।

অর্ডার

চ্যাট থেকে আসা সব অর্ডার: কীভাবে তৈরি হয়, অবস্থাগুলোর মানে, আর নিজের অর্ডারের অবস্থা বদলানো।

কানেকশন লগ

প্রোডাক্ট ইমপোর্ট, স্টক আপডেট আর অর্ডার পাঠানোর সব কাজের ইতিহাস — সিঙ্ক বা অর্ডারে সমস্যা হলে প্রথমে এখানে দেখুন।