Business SMS uses optional settings.sms.senderNumber (else advertising shortcode) with SendQuick for one recipient and SendBulk for quantity.
Co-authored-by: Cursor <cursoragent@cursor.com>
Website agents must add variants to a local guest cart and redirect to customer.{domain} for login and checkout instead of building those pages on the shop.
Co-authored-by: Cursor <cursoragent@cursor.com>
This API VM's Node 20 build has no node:undici, so require() crash-looped the process and took login down.
Co-authored-by: Cursor <cursoragent@cursor.com>
Node fetch was aborting at undici's 5-minute headers timeout, so Super Admin marked long npm ci / next builds as failed while the websites VM was still compiling.
Co-authored-by: Cursor <cursoragent@cursor.com>
Store product/category translations in entity_translations, expose CMS APIs, and gate the MultiLanguage Data module for businesses.
Co-authored-by: Cursor <cursoragent@cursor.com>
Update DNS writes @, www, business, customer, and api records on the chosen provider instead of Arvan only.
Co-authored-by: Cursor <cursoragent@cursor.com>
Provision uses the same websites-VM agent as Businesses; DNS still goes through Arvan ensureTenantRecords.
Co-authored-by: Cursor <cursoragent@cursor.com>
The API VM resolver often NXDOMAINs business.* / customer.* CNAMEs even when the certs are valid, which made the SSL button always fail after a successful issue.
Co-authored-by: Cursor <cursoragent@cursor.com>
PM2 was restarting at 512MB while Sharp cached buffers, which returned 502 to the migrate UI after categories had already succeeded.
Co-authored-by: Cursor <cursoragent@cursor.com>
Storefront SSL now follows apex expiry instead of requiring www, prompt links include domain and prompt name, and extra color variations merge instead of aborting migrate.
Co-authored-by: Cursor <cursoragent@cursor.com>
pm2 restart --update-env leaked PORT=9050 onto Next sites and left nginx 502 when a build dropped standalone output.
Co-authored-by: Cursor <cursoragent@cursor.com>
Expose /sitemap-user-products.xml when customer_products is enabled, invalidate on listing mutations, and proxy the new path from nginx provision scripts.
Co-authored-by: Cursor <cursoragent@cursor.com>
Document that product specs need /technical-info for labels, auto-verify admin-created business owners, and expand category color presets with Farsi aliases.
Co-authored-by: Cursor <cursoragent@cursor.com>
Move blogs, portfolios, videos, instructions, and workshops out of sitemap-main into dedicated files like products, and allow saving migrated Farsi category color labels without wiping store-item links.
Co-authored-by: Cursor <cursoragent@cursor.com>
Also create origin HTTPS with a self-signed cert on provision so Cloudflare Full does not fall through to another site's default SSL vhost.
Co-authored-by: Cursor <cursoragent@cursor.com>
Manage reusable templates in Super Admin, attach editable per-site prompts with Meshkee API public links that require no auth.
Co-authored-by: Cursor <cursoragent@cursor.com>
Issue SSL on one domain now passes tenantApex to the dashboards agent instead of renewing the shared multi-tenant cert.
Co-authored-by: Cursor <cursoragent@cursor.com>
Track storefront views via POST /tenants/{domain}/analytics/views, expose business activity API, and add product/website/portfolio/blog 30-day chart types for super-admin selection.
Co-authored-by: Cursor <cursoragent@cursor.com>
Expose GET /tenants/{domain}/website/favicon for storefront tab icons, allow faviconMediaId on profile PATCH, and sync website API docs.
Co-authored-by: Cursor <cursoragent@cursor.com>
Store logo_dark_media_id on businesses, expose logoDarkUrl on tenant/website APIs, prepend awaiting-payment steps to order workflows, and surface clearer Arvan API network errors.
Co-authored-by: Cursor <cursoragent@cursor.com>
ZarinPal rejects api.meshkee.com when the terminal is registered to the store apex; nginx now proxies /meshkee/payments/{gateway}/callback to a host-scoped API route.
Co-authored-by: Cursor <cursoragent@cursor.com>
Super Admin was only showing "exited with code 1" because the ERR trap never copied the last compiler or module-not-found line from the deploy log.
Co-authored-by: Cursor <cursoragent@cursor.com>
Order by sort_order descending and assign new items the next highest sort value so create and move-up stay consistent.
Co-authored-by: Cursor <cursoragent@cursor.com>
sitemap.xml is now an index of main + products; category loc paths use /products/category/{id}/{nameFaSlug} with a public by-id lookup for storefronts.
Co-authored-by: Cursor <cursoragent@cursor.com>
Adds /products/category/{slug} to default sitemap generation and a public categories/by-slug endpoint for storefront category pages.
Co-authored-by: Cursor <cursoragent@cursor.com>
Stop percent-encoding path slugs so <loc> shows UTF-8 Persian text while still sanitizing unsafe URL characters.
Co-authored-by: Cursor <cursoragent@cursor.com>
Default sitemap templates now emit SEO-friendly Farsi path segments with stable CMS ids; storefronts resolve content via new by-id public endpoints.
Co-authored-by: Cursor <cursoragent@cursor.com>
Storefronts can filter published content by metadata.tags the same way as products; website API docs are updated to match.
Co-authored-by: Cursor <cursoragent@cursor.com>
Stores synced route config from /meshkee/sitemap-config.json, serves sitemap.xml and robots.txt per tenant, and invalidates cache on CMS writes.
Co-authored-by: Cursor <cursoragent@cursor.com>
Includes SQL migrations, Prisma models, dashboard CRUD, registration status workflow, and website OpenAPI updates for workshop listing and signup.
Co-authored-by: Cursor <cursoragent@cursor.com>
Cross-site register now updates the password to the signup value and documents passwordUpdated for storefronts.
Co-authored-by: Cursor <cursoragent@cursor.com>
Let businesses choose product vs store_item sourcing, defaulting from the store module, and expose it on tenant resolve and store-specials.
Co-authored-by: Cursor <cursoragent@cursor.com>
Domain add/edit only upserts Arvan records when updateDns is true, and super-admin user PATCH now accepts firstNameEn and lastNameEn.
Co-authored-by: Cursor <cursoragent@cursor.com>