کاتالوگ محصولات: پر کردنش و نگه داشتنش
فید دورهای، بارگذاری فایل و یادگیری از سفارشها. سه قالب فید، واحد قیمت، و شناسهای که اگر با رویدادها یکی نباشد هیچ پیشنهادی ساخته نمیشود.
کاتالوگ، فهرست محصولات شماست همانطور که سگمنتیک میبیندشان: شناسه، نام، قیمت، تصویر، لینک و موجودی. تا وقتی این فهرست خالی باشد، بلوک «پیشنهاد محصول» در ایمیلها هیچ چیزی نشان نمیدهد و هیچ خطایی هم نمیدهد؛ فقط یک قسمت خالی. این صفحه میگوید چطور پرش کنید و کدام تصمیمها بیسروصدا خرابش میکنند.
کاتالوگ به چه کار میآید
به سه چیز، و هر سه فقط با کاتالوگ کار میکنند:
- بلوک پیشنهاد محصول در ایمیل، که چهار محصول را در یک شبکهٔ دو در دو میکشد.
- سناریوی سبد رهاشده، که باید بداند در سبد چه بود تا بتواند نشانش بدهد.
- پیشنهاد «مشابه» و «دیگران هم خریدند»، که روی ماتریس همخریدی سوارند و آن ماتریس هم فقط محصولاتی را میشناسد که در کاتالوگ باشند.
نکتهٔ آخر مهمتر از آن است که به نظر میرسد: تاریخچهٔ رفتار از رویدادها میآید، ولی هر شناسهای که در کاتالوگ نباشد از فهرست پیشنهادها حذف میشود. یعنی حسابی با میلیونها رویداد product_viewed و کاتالوگ خالی، صفر پیشنهاد تولید میکند.
شناسهای که باید یکی باشد
این مهمترین جملهٔ این صفحه است.
شناسهٔ محصول در کاتالوگ باید بایتبهبایت همان چیزی باشد که رویدادهایتان در product_id میفرستند.
اگر سایت SKU-1024 میفرستد و فید 1024 میدهد، هر دو طرف درست به نظر میرسند: کاتالوگ پر است، رویدادها میآیند، هیچ خطایی در هیچ لاگی نیست، و هیچ پیشنهادی هرگز ساخته نمیشود. این تنها اشتباهی است در کل این صفحه که هیچ نشانهای از خودش نشان نمیدهد.
پیش از پر کردن کاتالوگ، یک بار رویدادهایتان را در صفحهٔ «داده» باز کنید و ببینید product_id واقعا چه شکلی است. بعد فید را با همان شکل بسازید.
سه راه پر کردن
| راه | برای چه کسی | چند وقت یک بار |
|---|---|---|
| فید دورهای | فروشگاهی که آدرس فید دارد یا میتواند بسازد | هر شش ساعت، خودکار |
| بارگذاری فایل در پنل | کاتالوگ کوچک یا ثابت، یا شروع سریع | دستی |
| وبهوکهای فروشگاه | هر حسابی که شاپیفای، ووکامرس یا دیجیکالا وصل کرده | با هر سفارش |
این سه با هم تداخل ندارند و میتوانید هر سه را داشته باشید. ترتیب اولویتشان در بخش وقتی چند منبع دارید توضیح داده شده.
فید دورهای
در پنل، «کاتالوگ» و بعد «فید محصولات». آدرس فید و قالبش را بدهید و فعالش کنید.
از آن به بعد هر شش ساعت خوانده میشود. نتیجهٔ آخرین اجرا بالای همان صفحه مینشیند: چند محصول خوانده شد، کی، و اگر شکست خورد چرا. اگر بیش از دو روز هیچ اجرای موفقی نداشته باشد، صفحهٔ کاتالوگ هشدار میدهد، چون فیدی که بیصدا از کار افتاده همان چیزی است که قیمت فصل قبل را در کمپین بعدی مینشاند.
سه محدودیت که خوب است بدانید: هر بار حداکثر دو دقیقه فرصت دارد، حداکثر ۶۴ مگابایت خوانده میشود، و حداکثر دویست هزار محصول از یک فایل برداشته میشود.
آدرس فید باید عمومی باشد. آدرسی که به شبکهٔ داخلی، به localhost یا به رنجهای خصوصی برسد رد میشود، و ریدایرکت به چنین آدرسی هم رد میشود. این یک محدودیت عمدی است، نه یک نقص: سروری که آدرس دلخواه شما را واکشی میکند، بدون این بررسی یک ابزار حمله به شبکهٔ داخلی ماست.
قالب هرگز حدس زده نمیشود. هرچه در فرم انتخاب کنید همان خوانده میشود، چون حدسی که یک بار اشتباه دربیاید یک کاتالوگ بیمعنی را روی کاتالوگ سالم مینویسد، و دقیقا وقتی اشتباه درمیآید که پلتفرم شما چیزی را عوض کرده و کسی حواسش نیست.
قالب CSV
سطر اول باید نام ستونها باشد. این نامها شناخته میشوند و بقیه نادیده گرفته میشوند:
| فیلد | نامهای پذیرفتهشده | لازم |
|---|---|---|
| شناسه | sku, id, product_id, code | بله |
| نام | title, name, product_name | بله |
| قیمت | price, price_rial, amount | برای دیده شدن، بله |
| قیمت پیش از تخفیف | compare_at_price, old_price, list_price | نه |
| دسته | category, product_type, categories | نه |
| برند | brand, manufacturer, vendor | نه |
| تصویر | image, image_url, image_link | نه |
| آدرس صفحه | url, link, product_url, permalink | نه |
| موجودی | in_stock, stock, availability, quantity | نه |
| توضیح | description, desc | نه |
یک سطر خراب کل فایل را رد نمیکند: شمرده میشود و بقیه وارد میشوند. اگر ستون شناسه یا ستون نام اصلا پیدا نشود، آنوقت کل فایل رد میشود، چون فایلی بدون این دو، فایل اشتباهی است نه فروشگاه خالی.
قالب JSON
یا یک آرایه، یا یک شیء با کلید products:
{
"products": [
{
"sku": "SHOE-1024",
"title": "کفش ورزشی مدل رانر",
"price_rial": 24000000,
"compare_at_rial": 30000000,
"category": "کفش",
"brand": "نایک",
"image_url": "https://shop.example.ir/img/1024.jpg",
"url": "https://shop.example.ir/p/1024",
"in_stock": true
}
]
}
name به جای title، id یا product_id به جای sku، image به جای image_url و link به جای url هم پذیرفته میشوند.
اگر in_stock را ننویسید، محصول موجود حساب میشود. این عمدی است: فروشگاهی که فقط چیزهای فروختنیاش را export میکند حالت رایج است، و خواندن نبودن این فیلد به معنی ناموجود یعنی وارد کردن کاتالوگی که هیچچیزش قابل پیشنهاد نیست.
قالب XML، یعنی گوگل مرچنت
اگر فروشگاهتان برای سایتهای مقایسهٔ قیمت فید میدهد، همان فید احتمالا همین است و لازم نیست چیز تازهای بسازید.
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
<channel>
<item>
<g:id>SHOE-1024</g:id>
<g:title>کفش ورزشی مدل رانر</g:title>
<g:price>24000000 IRR</g:price>
<g:sale_price>19000000 IRR</g:sale_price>
<g:availability>in stock</g:availability>
<g:image_link>https://shop.example.ir/img/1024.jpg</g:image_link>
<g:link>https://shop.example.ir/p/1024</g:link>
<g:brand>نایک</g:brand>
<g:product_type>کفش</g:product_type>
</item>
</channel>
</rss>
وقتی sale_price باشد و از price کمتر باشد، همان قیمت فروش است و price به خط خوردهٔ «قیمت قبل» تبدیل میشود. availability مقدارهای خود استاندارد را میگیرد، و out of stock تنها مقداری است که محصول را ناموجود میکند.
XML تنها قالبی است که واحد پول را خودش حمل میکند، و همین باعث میشود کمریسکترین قالب باشد.
قیمت و واحدش
قیمت در دیتابیس ریال ذخیره میشود و در پیامها به تومان نمایش داده میشود.
این تنها جایی است که یک اشتباه ساکت، عددی غلط را به دست مشتری شما میرساند، پس قاعدهاش سختگیرانه است:
| قالب | چطور خوانده میشود |
|---|---|
| CSV و JSON | عدد را ریال فرض میکند. اگر فایل شما تومان است، در خود فایل ضربدر ده کنید. |
XML با IRR | ریال |
XML با IRT یا TOMAN | ضربدر ده |
| XML با هر واحد دیگری | بدون قیمت ذخیره میشود |
سطر آخر عمدی است. محصولی که قیمت ندارد در پنل دیده میشود و در هیچ پیامی نمیآید، یعنی یک جای خالی که کسی پیدایش میکند. قیمتی که ده برابر غلط باشد عددی است که کسی به آن شک نمیکند و روی آن سفارش میدهد.
جداکنندهها اهمیتی ندارند: ۲۴۰۰۰۰۰۰، 24,000,000 و 24.000.000 هر سه یک عدد خوانده میشوند.
محصولی با قیمت صفر هرگز پیشنهاد نمیشود. اگر کاتالوگ پر است و پیشنهادها خالیاند، اول ستون قیمت را نگاه کنید.
موجودی، و محصولی که از فید میرود
محصولی که ناموجود باشد در هیچ پیامی نمیآید. دلیلش این است که پیشنهاد چیزی که فروخته نمیشود، در مقیاس یک کمپین یعنی یک کلیک به بنبست ضربدر کل ارسال.
محصولی که در اجرای بعدی فید دیگر نباشد ناموجود علامت میخورد، نه پاک. پاک کردنش تاریخچهٔ همخریدیاش را از بین میبرد و فردا با اولین سفارش دوباره برمیگردد؛ علامتخوردن یعنی سطر در پنل میماند و کسی میبیند که نصف کاتالوگ ساکت شده است.
یک محافظ هم هست که خوب است بدانید وجود دارد: اگر یک اجرا کمتر از نصف اجرای موفق قبلی محصول بخواند، محصولات خواندهشده نوشته میشوند و هیچ چیزی ناموجود نمیشود. فایل نصفه، صفحهٔ ورود بهجای فید، یا export ناتمام، هیچکدام نباید بتوانند یک کاتالوگ سالم را ساعت سه بامداد خالی کنند.
بارگذاری از فایل در پنل
در صفحهٔ «فید محصولات»، زیر تنظیمات فید. یک فایل CSV بدهید، ستونها را که خودش حدس زده اصلاح کنید، و پیش از ارسال ببینید چند محصول ساخته شده و اولینشان چه قیمتی گرفته است.
دو چیز که این صفحه دارد و فید ندارد: واحد قیمت را همانجا انتخاب میکنید (تومان یا ریال)، و شناسهٔ تکراری داخل یک فایل را با شمارهٔ سطرش به شما نشان میدهد.
فایل بزرگ خودش تکهتکه فرستاده میشود و نوار پیشرفت را میبینید. اگر وسط کار شکست بخورد، متوقف میشود و میگوید تا آن لحظه چند محصول وارد شده، چون واردات نیمهتمامی که کسی فکر کند کامل است بدتر از واردات شکستخورده است.
پیشنمایش پیشنهاد برای یک کاربر
در پایین صفحهٔ «کاتالوگ»، بخش پیشنمایش همیشه در دسترس است. با نوشتن دو کاراکتر، جستجو همزمان بین شناسه، شماره موبایل و ایمیل انجام میشود؛ مثلا 09 هم شمارههای دارای این عبارت را پیدا میکند و هم شناسه یا ایمیلی را که 09 در آن باشد. کاربران همان لحظه زیر فیلد جستجو نمایش داده میشوند. یک نفر را انتخاب کنید، اولویت پیشنهاد را روی حالت خودکار بگذارید یا یک اولویت مشخص انتخاب کنید، سپس نتیجه را پیش از ارسال ببینید.
اگر یک عبارت به چند کاربر بخورد، همهٔ نتیجهها به شکل کارت نمایش داده میشوند. با انتخاب یک نفر، کارتهای دیگر کنار میروند و همان کارت انتخابشده باقی میماند. این انتخاب مهم است، چون پیشنهاد هر کاربر از تاریخچهٔ رفتار همان کاربر ساخته میشود و حدس زدن اولین نتیجه میتواند پیشنمایش فرد دیگری را نشان دهد.
از وبهوکهای فروشگاه
اگر شاپیفای، ووکامرس یا دیجیکالا را وصل کردهاید، هر سفارشی که میآید نام و شناسه و قیمت محصولاتش را هم دارد. اینها خودبهخود وارد کاتالوگ میشوند، بدون هیچ تنظیمی.
با یک قاعده که مهم است: وبهوک فقط جای خالی را پر میکند و هرگز چیزی را بازنویسی نمیکند. یک سطر سفارش کمترین چیز را دربارهٔ محصول میداند: نه تصویر دارد، نه دستهبندی، نه قیمت پیش از تخفیف. پس اگر فید یا فایلی قبلا آن محصول را نوشته باشد، سفارش دست بهش نمیزند. اگر برعکس بود، فروشگاهی با فید سالم میدید که کاتالوگش با هر سفارش کمی بدتر میشود.
واحد پول از خود پلتفرم خوانده میشود. اگر پلتفرم واحدی بگوید که نمیشناسیم، محصول بدون قیمت ذخیره میشود، دقیقا مثل فید.
سفارش لغوشده و مرجوعی چیزی یاد نمیدهند. محصول مرجوعی هنوز یک محصول واقعی است، ولی پیامی که برای پس گرفتن چیزی آمده، اولین جای خوبی برای دیدن یک محصول نیست، و سفارش بعدی همان سطرها را دارد.
همگامسازی از بکاند
برای همگامسازی خودکار، داده کاتالوگ را بهشکل یک فید JSON روی یک نشانی HTTPS منتشر کنید و آن نشانی را در پنل بدهید. سگمنتیک فید را دورهای دریافت میکند و وضعیت آخرین اجرا را در همان صفحه نشان میدهد.
عیبیابی سریع
| نشانه | محتملترین دلیل |
|---|---|
| کاتالوگ پر است، پیشنهادها خالی | شناسهها با product_id رویدادها یکی نیستند. بخش شناسه |
| بعضی محصولات هرگز پیشنهاد نمیشوند | قیمتشان صفر است یا ناموجودند |
| قیمتها ده برابرند | فایل تومان بوده و ریال خوانده شده. بخش قیمت |
| فید ذخیره میشود ولی هیچ اجرایی نمیبینم | فید فعال نیست، یا آدرسش خصوصی است و رد شده. متن خطا بالای همان صفحه است |
| کارت سلامت فید «نیازمند بررسی» است | بیش از دو روز است هیچ اجرای موفقی نبوده. دلیلش در last_error صفحهٔ فید است |
| محصولات دیروز ناموجود شدند | از فید حذف شدهاند. اگر عمدی نبوده، فید را نگاه کنید |
بعد چه بخوانید
- گذاشتن رویداد اگر هنوز
product_viewedوorder_completedنمیفرستید. بدون آنها کاتالوگ پر هم تاریخچهای برای پیشنهاد دادن ندارد. - فرهنگنامهٔ رویدادها برای فهرست رویدادهای یک فروشگاه اینترنتی.
- سناریوها برای ساختن سبد رهاشده.