مستندات اتصال به سرویس یونکسو

 

اگر وب‌سایت شما وردپرسی و ووکامرسی است به راحتی با نصب افزونه‌ی یونکسو اینتگریشن انجام می‌شود. پس از نصب  افزونه نیاز است که اینتگریشن بررسی گردد و در صورتیکه اینتگریشن مشکلاتی دارد با تیم پشتیبانی یونکسو در ارتباط باشید تا افزونه بر حسب تغییراتی که در هسته ووکامرس داده اید ویرایش شود.

 اما اگر وب‌سایت غیر وردپرسی دارید، به منظور دنبال کردن کاربران سایت و همچنین ارسال پوش نوتیفیکیشن به کاربران باید ابتدا اسکریپت زیر را در header سایت قرار دهید.

نکته:

در اسکریپت زیر باید بجای  novinProjectToken توکن خصوصی خود را قرار دهید.

 
<script>
        function setCookie(cookieName, cookieValue, expirationDays) {
            const d = new Date();
            d.setTime(d.getTime() + (expirationDays * 24 * 60 * 60 * 1000));
            const expires = "expires=" + d.toUTCString();
            document.cookie = cookieName + "=" + cookieValue + ";" + expires + ";path=/";
        }
 
        function fetchSdkVersion() {
            return fetch('https://cdp.novin.marketing/api/sdk')
                .then(response => {
                    if (!response.ok) {
                        console.log('Failed to fetch SDK version');
                        return '1.0.0';
                    }
                    return response.json();
                })
                .then(data => {
                    console.log("data.sdkVersion: " + data.sdkVersion);
                    return data.sdkVersion;
                })
                .catch(error => {
                    console.error('Error fetching SDK version:', error);
                    return '1.0.0'; // Fallback value
                });
        }
        setCookie('novinProjectId', 'novinProjectToken', 365);
        fetchSdkVersion().then(sdkVersion => {
            const automationScript = document.createElement('script');
            automationScript.src = 'https://cdn.unexo.ir/novinSDK.js?version=' + sdkVersion;
            document.head.appendChild(automationScript);
        });
</script>
 

همچنین باید فایل سرویس ورکر را در ریشه اصلی سایت قرار دهید طوریکه با آدرس زیر به آن دسترسی داشته باشیم.

https://yourSite.com/novinWebPushServiceWorker.js

برای ارسال اطلاعات از سمت سرور شما به پلتفرم داده‌ی یونکسو ، به یک accessToken مخصوص پروژه‌ی شما نیاز است.

در همه‌ی درخواست‌ها، مقدار ‘Bearer accessToken’ را در هدر با کلید Authorization قرار دهید.

 اگر وب‌سایت غیر وردپرسی و اختصاصی دارید برای پیاده‌سازی اینتگریشن باید مراحل زیر را انجام دهید.

 

۱. ارسال داده‌ها به صورت بالک

در ابتدا باید تمام داده‌های مربوط به محصولات، کاربران و تاریخچه‌ی خرید مشتریان به دیتا پلتفرم یونکسو ارسال گردد. این‌کار می‌تواند از طریق وب‌سرویس یونکسو انجام شود.
نکته: 
در ارسال بالک، تعداد آیتم‌های درون آرایه‌ی ارسالی 500 باشد.

ارسال محصولات

روش: POST
آدرس: https://cdp.novin.marketing/api/items/bulk

بدنه درخواست:


{
“items” : [
  {
    "itemId": "string",
    "name": "string",
    "quantity": "number",
    "price": "number",// Toman
    "discountPercentage": "number",
    "discountValue": "number",
    "fullPath": "string",
    "imagesUrl": ["string"],
"isConsumable": Boolean,
"consumeTime": Number // -1 for not consumable items
  }
]
}

ارسال کاربران

روش: POST
آدرس: https://cdp.novin.marketing/api/users/bulk

نکته:

تنها فیلدهایی که لازم دارید را ارسال کنید.
اگر فیلد اضافی دارید که در بدنه اصلی نیست می‌توانید در قسمت attributes به صورت customeField قرار دهید و ارسال کنید.

بدنه درخواست:

{
“users” : [
 {
    "userId": "string",
    "firstName": "string",
    "lastName": "string",
    "mobile": "string",
    "email": "string",
    "country": "string",
    "state": "string",
    "city": "string",
    "address": "string",
    "zipCode": "string",
    "company": {"string",
    "companyType": "string",
    "jobPosition": "string",
    "department": "string",
    "industry": "string",
    "birthDate": date,
    "gender": "string",
   "userType": "string", // visitor or customer (customer has at least one purchase)
    "attributes": {
      "customeField1": "string",
      "customeField2": "boolean",
      "customeField3": {"JSON": "value"},
      "customeField4": ["array"]
    }
  }
]
}

 

ارسال تاریخچه خرید مشتریان

تمام خریدهای قبلی مشتریان به صورت bulk ارسال شود

روش: POST
آدرس: https://cdp.novin.marketing/api/events/bulk

 {
"events" : [
        {
            "userId": "string",
            "name": "purchaseApproved",
"itemIdList": ["itemId1", "itemId2", ... ],
"time": 'yyyy-mm-ddThh:mm:ss'; // ISO 8601 string
            "properties": {
            "purchaseId": "string",
            "itemsList": [
                    {
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemUrl",
"itemImageUrl"
                    }
                ],
            "totalPrice": number, // Toman
            "totalQuantity": number,
            "couponCode": "string",
            "couponPercentage": number,
            "couponValue": number,
            }
        }
    ]
}

۲. ارسال و آپدیت داده‌ها

 

ارسال/آپدیت محصول

روش: POST
آدرس: https://cdp.novin.marketing/api/items

بدنه درخواست:

 
{
  "itemId": "string",
  "name": "string",
  "quantity": "number",
  "price": "number",// Toman
  "discountPercentage": "number",
  "discountValue": "number",
  "fullPath": "string",
  "imagesUrl": ["string"],
"isConsumable": Boolean,
"consumeTime": Number // -1 for not consumable items

}

ارسال/آپدیت کاربر

روش: POST
آدرس: https://cdp.novin.marketing/api/users

بدنه درخواست:

{
"userId": "string",
    "firstName": "string",
    "lastName": "string",
    "mobile": "string",
    "email": "string",
    "country": "string",
    "state": "string",
    "city": "string",
    "address": "string",
    "zipCode": "string",
    "company": {"string",
    "companyType": "string",
    "jobPosition": "string",
    "department": "string",
    "industry": "string",
    "birthDate": date,
    "gender": "string",
   "userType": "string",
// visitor or customer (customer has at least one purchase)
  "attributes": {
    "customeField1": "string",
    "customeField2": "boolean",
    "customeField3": {"JSON": "value"},
    "customeField4": ["array"]
  }
}

۳. حذف داده‌ها

 حذف محصول

روش: DELETE
آدرس: https://cdp.novin.marketing/api/items/{itemId}

حذف کاربر

روش: DELETE
آدرس: https://cdp.novin.marketing/api/users/{userId}

 ۴. ارسال ایونت‌ها

در سیستم یونکسو مارکتینگ اتومیشن، ۲ نوع کاربر داریم. کاربر ناشناس (Anonymous) و کاربر شناس (Identified) 

Anonymous: کاربریست که اطلاعات ارتباطی مانند ایمیل، شماره موبایل و … از وی نداریم.  برای ذخیره ی تمام رفتارها و ایونت های این کاربر، باید از سمت بک اند مقدار کوکی با نام novinAnonymousId  که در واقع  AnonymousId کاربر است را دریافت کنید و تمامی ایونت ها را با کلید “anonymousId” و مقدار کوکی ارسال کنید. برای مثال:

 
{ 
“anonymousId”:"novinAnonymousIdCookieValue",
"name":"eventName",
"properties": {
}
}
 

کاربری که در سایت (یا اپلیکیشن) لاگین است کاربر Identified است و در پایگاه داده‌‌ ی شما یک userId دارد. تمام ایونت های این نوع کاربر با کلید “userId” و Id کاربر (در سیستم خودتان) به همراه  anonymousId ارسال کنید. برای مثال:

 
{
"userId":"yourDBUserId",
“anonymousId”:"novinAnonymousIdCookieValue",
"name":"eventName",
"properties": {
}
}

نکات مهم

در هنگام ارسال ایونت می‌توان تنها anonymousId یا تنها userId یا همزمان هر دو را ارسال کرد. اما این نکته را در نظر بگیرید که اگر در زمان ارسال ایونت به هرکدام دسترسی دارید باید حتما ارسال کنید. مثلا اگر ایونت registerorder ارسال می‌کنید چونکه هم به userId و هم به anonymousId دسترسی دارید حتما باید هر دو ارسال شود اما زمانی ممکن است ایونت‌های مثل purchaseApproved، orderSent یا itemComment پس از تایید ارسال شود، در این زمان به anonymousId کاربر دسترسی نیست، پس حتما فقط userId را در ایونت ارسال کنید.

نکته بسیار مهم

در هنگام ارسال هر کدام از ایونت ها اگر کاربر لاگین است حتما باید همزمان userId و anonymousId ارسال شوند.
ایونت باید زمانی ارسال شود که کوکی novinAnonymousId موجود باشد. پس قبل از ارسال ایونت باید منتظر بمانید تا این کوکی ست شده باشد. این اتفاق فقط برای اولین بازدید کاربر از سایت شما چالش برانگیز می شود و در بقیه ی وارد کاربر حتما این کوکی را دارد.

در صورت نیاز به تست A/B حتما در هنگام ارسالِ ایونت ها، پارامتر novinAB را نیز ارسال کنید که مقدار این پارامتر با خواندن کوکی با نام novin-AB بدست می‌آید.

روش‌های ارسال ایونت

ارسال ایونت به CDP یونکسو می‌تواند از سمت فرانت‌اِند یا بک‌اِند صورت پذیرد.

فرانت‌اِند:

در صورتیکه به پارامترهای مورد نیاز هر ایونت از سمت فرانت دسترسی دارید می‌توانید از این روش ساده‌تر برای ارسال ایونت استفاده کنید.در این روش می‌توانید از SDK یونکسو استفاده کنید. به این منظور دستور ()novin.event.send که در window موجود است را با پارامترهای مشخص شده برای هر ایونت که در ادامه با عنوان body مشخص شده است، اجرا نمایید. در این روش نیازی به ارسال token نیست.

نکته: در صورت استفاده از SDK برای ارسال ایونت نیازی به قراردادن پارامترهای anonymousId و novinAB نیست. SDK به صورت خودکار این پارامترها را در body اضاف میکند.

نکته: ایونت purchaseComplete از سمت فرانت قابل ارسال نیست.

بک‌اِند:

برای ارسال ایونت از سمت بک‌اِند از وب‌سرویس یونکسو   با مشخصات زیر استفاده کنید. پارامترهای مشخص شده برای هر ایونت در ادامه مشخص شده است. در این روش باید حتما token در header قرار بگیرد.

وب‌سرویس ارسال ایونت و پارامترهای هر ایونت

در ادامه best practice ایونت های یک فروشگاه ایکامرسی را برای مثال آورده‌ایم. لزومی ندارد این ایونت‌ها دقیقا در بزینس شما نیز استفاده شود و می‌تواند ایونت با نام متفاوت و از همه مهمتر  با properties  متفاوت ارسال شود.

Method: POST

Endpoint: https://events.dp.unexo.ir/api/events

Header: Authorization: Bearer accessToken

—-------------------------------- pageView       —---------------------------

ایونت pageView را تنها زمانی ارسال کنید که کاربر از قبل لاگین باشد. یعنی ابتدا چک کنید اگر کاربر لاگین است این ایونت ارسال شود و باید حتما در body درخواست هر دو پارامتر userId و anonymousId وجود داشته باشد.

Body: {
"userId":"string",
"anonymousId":"string",
"name":"pageView",
“novinAB”: "novinABCookieValue",
"properties": {
“fullUrl”:"string”
}
}
—-------------------------------- categoryView       —---------------------------
Body: {
"userId and/or anonymousId":"string",
"name":"categoryView",
“novinAB”: "novinABCookieValue",
“categoryId”:"string”,
"properties": {
“categoryName”: “string”,
fullUrl”:"string”
}
}
—-------------------------------- itemView       —---------------------------
Body: {
"userId and/or anonymousId":"string",
"name":"itemView",
“itemId”:"string”,
“novinAB”: "novinABCookieValue",
"properties": {
“itemName”:"string”,
"itemUrl": "string",
"itemImageUrl":"string",
fullUrl”:"string”,
}
}
—-------------------------------- itemAddToCart       —---------------------------
Body: {
"userId and/or anonymousId":"string",
"name":"itemAddToCart",
“itemId”:"string”,
“novinAB”: "novinABCookieValue",
"properties": {
“itemName”:"string”,
itemsList”: [
                    {
                        "itemId",
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemImageUrl",
"itemUrl"
                    },
                    {
                        "itemId",
                       "itemName",
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemImageUrl",
"itemUrl"
                    }
] // آیتم های موجود در سبد خرید
}
}
—-------------------------------- itemAddToWishList       —---------------------------
Body: {
"userId and/or anonymousId":"string",
"name":"itemAddToWishList",
“itemId”:"string”,
“novinAB”: "novinABCookieValue",
"properties": {
“itemName”:"string”,
itemsList”: [
                    {
                        "itemId",
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemImageUrl",
"itemUrl"
                    },
                    {
                        "itemId",
                       "itemName",
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemImageUrl",
"itemUrl"
                    }
] // آیتم های موجود در لیست دلخواه
}
}
—-------------------------------- itemRemoveFromCart       —---------------------------
Body: {
"userId and/or anonymousId":"string",
"name":"itemRemoveFromCart",
“itemId”:"string”,
“novinAB”: "novinABCookieValue",
"properties": {
“itemName”:"string”,
}
}
—-------------------------------- checkOut      —---------------------------
Body: {
"userId and/or anonymousId":"string",
"name":"checkOut",
“novinAB”: "novinABCookieValue",
"itemIdList": ["itemId1", "itemId2", ... ],
"properties": {
stepNumber”:  number,
stepTitle”:"string",
itemsList”: [
                    {
                        "itemId",
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemImageUrl",
"itemUrl"
                    },
                    {
                        "itemId",
                       "itemName",
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemImageUrl",
"itemUrl"
                    }
],
“totalPrice”: number,// Toman
“totalQuantity”: number,
“couponCode”:"string",
“couponPercentage”: number,
“couponValue”: number,
}
}
—-------------------------------- couponApplied     —---------------------------
Body: {
"userId and/or anonymousId":"string",
"name":"couponApplied",
“novinAB”: "novinABCookieValue",
"properties": {
“couponCode”:"string",
“couponCategory”:"string",
“couponPercentage”: number,
“couponValue”: number,
}
}
—-------------------------------- couponNotApplied     —---------------------------
Body: {
"userId and/or anonymousId":"string",
"name":"couponApplied",
“novinAB”: "novinABCookieValue",
"properties": { ,
“couponCode”:"string",
“couponCategory”:"string",
“couponPercentage”: number,
“couponValue”: number,
“reason”:"string"
}
}
—-------------------------------- registerOrder: فشردن دکمه پرداخت     —---------------------------
Body: {
"userId and/or anonymousId":"string",
"name":"registerOrder",
“novinAB”: "novinABCookieValue",
"itemIdList": ["itemId1", "itemId2", ...],
"properties": {
“purchaseId”:"string",
itemsList”: [
                    {
                        "itemId",
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemImageUrl",
"itemUrl"
                    },
                    {
                        "itemId",
                       "itemName",
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemImageUrl",
"itemUrl"
                    }
],
“totalPrice”: number,// Toman
“totalQuantity”: number,
“couponCode”:"string",
“couponPercentage”: number,
“couponValue”: number,
}
}
—-------------------------------- purchaseComplete: بازگشت از درگاه پرداخت     —---------------------------
Body: {
"userId and/or anonymousId":"string",
"name":"purchaseComplete",
“novinAB”: "novinABCookieValue",
"itemIdList": ["itemId1", "itemId2", ... ],
"properties": {
purchaseId”:"string",
itemsList”: [
                    {
                        "itemId",
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemImageUrl",
"itemUrl"
                    },
                    {
                        "itemId",
                       "itemName",
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemImageUrl",
"itemUrl"
                    }
],
“totalPrice”: number,// Toman
“totalQuantity”: number,
“couponCode”:"string",
“couponPercentage”: number,
“couponValue”: number,
}
}
—-------------------------------- purchaseApproved: تایید خرید توسط ادمین     —---------------------------
Body: {
"userId":"string",
"name":"
purchaseApproved",
"itemIdList": ["itemId1", "itemId2", ... ],
"properties": {
“purchaseId”:"string",
“itemsList”: [
                    {
                        "itemId",
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemImageUrl",
"itemUrl"
                    },
                    {
                        "itemId",
                       "itemName",
                       "itemName",
                       "itemPrice",
                        "itemCount",
"itemImageUrl",
"itemUrl"
                    }
],
“totalPrice”: number,// Toman
“totalQuantity”: number,
“couponCode”:"string",
“couponPercentage”: number,
“couponValue”: number,
}
}
—--------- itemComment: پس از تایید ادمین    -----------------
Body: {
"userId":"string",
"name":"itemComment",
“itemId”:"string",
“properties”: {
    “itemName”:"string",
}
}
—------------------ itemRate: پس از تایید ادمین    —-----------------
Body: {
"userId":"string",
"name":"itemRate",
“itemId”:"string",
"properties": {
“itemName”:"string",
“rate”: number
}
}
—-------------------------------- searchItem       —---------------------------
Body: {
"userId and/or anonymousId":"string",
"name":"search",
“novinAB”: "novinABCookieValue",
"properties": {
“searchQuery”:"string”
}
}
—-------------------------------- tryToSignUp: با زدن دکمه ثبت نام       —---------------------------
Body: {
"anonymousId":"anonymousId", 
"name":"tryToSignUp",
“novinAB”: "novinABCookieValue",
"
"properties": {
"mobile": string, // if availabe
"email": string, // if availabe
"mobile": string, // if availabe
"email": string, // if availabe
"firstName": string, // if availabe
"lastName": string // if availabe
}
}
—-------------------------------- signUp       —---------------------------
// both userId and anonymousId are required 
Body: {
"userId":"string",
"anonymousId":"anonymousId", 
"name":"signUp",
“novinAB”: "novinABCookieValue",
}
—-------------------------------- tryToSignIn: با زدن دکمه ورود       —---------------------------
Body: {
"anonymousId":"anonymousId", 
"name":"tryToSignIn",
“novinAB”: "novinABCookieValue",
"
"properties": {
"mobile": string, // if availabe
"email": string, // if availabe
}
"mobile": string, // if availabe
"email": string, // if availabe
}
}
—-------------------------------- signIn       —---------------------------
// both userId and anonymousId are required 
Body: {
"userId":"string",
"anonymousId":"anonymousId", 
"name":"signIn",
“novinAB”: "novinABCookieValue",
}
—-------------------------------- signOut       —---------------------------
Body: {
"userId":"string",
"anonymousId":"anonymousId", 
"name":"signOut",
“novinAB”: "novinABCookieValue",
}

۵. دریافت اطلاعات آیتم‌ها

اگر در یک ورکفلو بخواهید از قیمت یا موجودی آیتم هایی که قرار است به کاربر پیام فرستاده شود، استفاده کنید لازم است که این اطلاعات در لحظه به روز باشد. پس نیاز به یک وب‌سرویس برای گرفتن اطلاعات ایتم ها است که باید سمت سرور شما پیاده سازی شود.

روش: POST

آدرس: https://yourdomain/api/items

بدنه درخواست:

 

{
 "itemIdList": ["itemId1", "itemId2", ... ]
}

بدنه جواب:

 

{
[
{
  "itemId": "string",
  "name": "string",
  "quantity": "number",
  "price": "number",// Toman
  "discountPercentage": "number",
  "discountValue": "number",
  "fullPath": "string",
 "imagesUrl": ["string"]
},
{
  "itemId": "string",
  "name": "string",
  "quantity": "number",
  "price": "number",// Toman
  "discountPercentage": "number",
  "discountValue": "number",
  "fullPath": "string",
 "imagesUrl": ["string"]
}
]}

۶. اجرای ورکفلو با ارسال ایونت

در صورتیکه قصد دارید به محض ارسال یک  ایونت، ورکفلوی خاصی اجرا شود باید در body از پارامتر workflowPath استفاده کنید.  توجه داشته باشید که workFlowPathName را در گره event trigger در ورکفلوساز مقداردهی کرده اید. برای مثال signUpEventTrigger را در گره event trigger شروع ورکفلو در نظر میگیرید و در بادی هم خواهیم داشت: “workFlowPath”:”webhook/signUpEventTrigger

Body: {
...
"workFlowPath":"webhook/workFlowPathName"
}

برای تست ورکفلو و دیباگ کردن ورکفلو از مقدار webhook-test/workflowPathName استفاده کنید.

۷. باشگاه مشتریان (به زودی)

به منظور امتیازدهی به هر رفتار کاربر مثل خرید، کامنت گذاری، اشتراک گذاری، دادن سرنخ و … می توان در ارسال ایونت ها از پارامتر aggregations استفاده کرد.

فیلد userAggregationfield و مقدار امتیاز آن برای ایونت های فرانت اندی باید از قبل برای پروژه شما تعریف شود.

در ایونت های فرانت اندی ارسال مقدار point بی اهمیت بوده و مقدار point برای هر userAggregationField از قبل مشخص شده است.

 
{
"userId or/and anonymousId":"string",
  "name": "eventName",
  "aggregations": [
    {
        "userAggregationfield": "mobileLead",
        "operation": "+"
    },
    {
        "userAggregationfield": "emailLead",
        "operation": "+"
    }
  ],
}
 

اما برای ایونت های بک اند نیازی به تعریف فیلد نیست و علاوه بر آن می توانند امتیاز را ارسال کنند. همچنین این نوع ایونت ها می توانند چندین بار باعث افزایش یا کاهش مقدار فیلد کاربر شوند.

 
{
"userId or/and anonymousId":"string",
  "name": "eventName",
  "aggregations": [
    {
        "userAggregationfield": "purchasePoints",
        "point": 240 // positive or negetive
    },
  ],
}