# Custom actions API Source: https://docs.molin.ai/apis/custom-actions Define HTTP endpoints your AI can call mid-chat to issue coupons, look up orders, book callbacks, and take other real actions for your customers. The custom actions API allows you to define custom actions that can be triggered by users when they chat with your AI. ## Examples Examples of custom actions include: * Sending an email to the user with a discount code when they request one. * Sending a message to a Slack channel when the user requests a callback. * Providing product recommendations from your own database or inventory system. * Collecting feedback from users and storing it in your own database. * Collecting leads and storing them in your CRM system. ## How it works 1. You need to define a custom action in the [molin.ai](https://molin.ai) dashboard. You can define the name, description, and parameters that the action requires (e.g. email address, phone number, etc). 2. Your team needs to implement an API endpoint. This endpoint should accept the parameters defined in the dashboard and perform the action (e.g. generate a coupon and email it to the user). 3. You should enable the action from the dashboard and test it in the chat preview. ## How to create a custom action 1. Go to the [Actions page](https://molin.ai/app/actions) and click on the **New custom action** button. 2. Fill in a **name** and **description**. The **name** should describe succinctly what the action does. The **description** should provide more details about the action. Both the **name** and the **description** will be given to our AI so that it knows *when* to call the action. *See the example screenshot below* 3. Define the parameters that the action requires. For example, if the action is to email the user a coupon, you might need the user's email address. You must define correctly the type of each parameter (e.g. string, number, or boolean). 4. Choose the HTTP method (**POST** or **GET**) and define the endpoint URL where the action will be triggered. This URL should be accessible from the internet and should accept the parameters defined in the previous step. The endpoint should return plain text or JSON. The entire response body from your endpoint will be given to the AI so it can respond to the user. Although the AI will only use the body to formulate its own answer, assume that the body *can* be shown to the user. ![Example custom action](https://imagedelivery.net/JWssb2diw2B-JHR2ojV3Ow/41c41340-b779-44a0-b671-fe7079160400/fit=scale-down,q=75,dpr=1) ![Example chat](https://imagedelivery.net/JWssb2diw2B-JHR2ojV3Ow/393fd33a-c3a6-4a8e-3d15-02bdce802d00/fit=scale-down,q=75,dpr=1) ## How to create your endpoint You can use any stack to create an HTTP web server that conforms to the following requirements. Only HTTPS endpoints are supported. ### Requirements #### Request The request uses the HTTP method you chose when defining the action, **POST** by default. You can read the `x-molin-` headers to get additional information about the widget and conversation. For a **POST** action, the parameters defined in the dashboard are sent as a JSON body: ``` POST https://your-endpoint.com/your-action Content-Type: application/json x-molin-custom-actions-version: 2024-11-01 x-molin-widget-id: widget-id x-molin-conversation-id: conversation-id { "your_defined_param": "some value from user input" } ``` For a **GET** action, parameters are sent as query params instead, and no body is sent: ``` GET https://your-endpoint.com/your-action?your_defined_param=some+value+from+user+input x-molin-custom-actions-version: 2024-11-01 x-molin-widget-id: widget-id x-molin-conversation-id: conversation-id ``` ##### URL path placeholders If your endpoint expects a value as part of the URL path rather than a query param or body field, wrap a parameter name in curly braces in the endpoint URL, e.g. `https://your-endpoint.com/products/{productId}/availability`. Any parameter matching a `{paramName}` placeholder fills that path segment instead of being sent as a query param or body field; the remaining parameters are still sent normally for the chosen HTTP method. This works for both GET and POST actions. Every placeholder in the endpoint URL must have a matching parameter defined in the dashboard, otherwise the action fails instead of calling your endpoint with an unresolved placeholder still in the URL. #### Response The response should be plain text or JSON. The entire body will be given to the AI so it can respond to the user. ``` Content-Type: text/plain or application/json any plain text or JSON ``` The response will be trimmed down to 8000 characters before being given to the AI. Make sure you don't exceed this length limit. ### Example ``` POST https://molin.your-shop.com/actions/generate-coupon-code Content-Type: application/json x-molin-custom-actions-version: 2024-11-01 x-molin-widget-id: widget123 x-molin-conversation-id: fce602af-39f2-4717-b2e0-698357b4f109 { "email": "john@testington.com" } ``` ``` Content-Type: text/plain Success. Generated coupon code: LUCKY53215 ``` ## Response format recommendations While the AI can understand JSON and XML, we recommend that you format your response as human readable plain text or markdown. The response will be trimmed down to 8000 characters before being given to the AI. Make sure you remove any unnecessary information to stay under the 8000 character limit. For example, if your custom action returns the order history for your customer, we recommend the following format: ``` Order ID: SHOP123 Creation date: 2025-01-01 Items: - 1 x Blue jumper - 2 x Red socks Total cost: 100 USD Order ID: SHOP456 … ``` ## Special UI card responses Your custom action endpoint can return structured data that will be rendered as interactive UI cards in the chat. This provides a richer user experience for certain types of data like products and orders. ### Product Card ```json theme={null} { "url": "https://shop.com/product/123", "name": "Product Name", "description": "Product description", "price": "$100" } ``` ### Order Card ```json theme={null} { "order_id_label": "Order ID", "order_id_value": "RTX-789012", "timeline": { "step": [ { "label": "Order Placed", "status": "completed" }, { "label": "Processing", "status": "completed" }, { "label": "Shipped", "status": "in_progress" } ] }, "items": { "item": [ { "name": "Premium Cotton T-Shirt", "quantity": "2", "price": "$29.99", "image": "https://placehold.co/400x300/orange/white/png" }, { "name": "Leather Wallet", "quantity": "1", "price": "$45.00" } ] }, "total_label": "Total", "total_amount": "$104.98", "customer_name": "John Doe", "shipping_label": "Shipping", "shipping_method": "FedEx Express", "payment_label": "Payment", "payment_method_label": "Method", "payment_method_value": "Credit Card", "payment_status_label": "Status", "payment_status_value": "Paid", "order_tracking_label": "Track Order", "order_tracking_url": "https://fedex.com/track/RTX-789012" } ``` #### Order Card with XML You can also return order data in XML format: ```xml theme={null} Order ID RTX-789012 completed in_progress Premium Cotton T-Shirt 2 $29.99 https://placehold.co/400x300/orange/white/png Total $104.98 John Doe https://fedex.com/track/RTX-789012 ``` Timeline can have 1–5 steps. Status values must be one of: `completed`, `in_progress`, `pending`, or `failed`. Use `failed` for a step that encountered an error. ## Using a test endpoint for development If you wish to test quickly, you can use [Beeceptor](https://beeceptor.com/), a free service that allows you to create a temporary endpoint that you can use to test your custom action. You can use the following URL as your endpoint in your custom action: ``` https://custom-action-generate-coupon-code.free.beeceptor.com ``` You can view requests sent to it [here](https://app.beeceptor.com/console/custom-action-generate-coupon-code). ## Static IPs All calls on behalf of custom actions sent to your server are made through the following IPs: ``` 35.207.69.21 209.38.162.129 ``` Make sure you allowlist all of them if your server has IP restrictions. # Personalization API Source: https://docs.molin.ai/apis/experimental/personalization-api Personalize conversation for your user by passing personal data to Molin automatically. Also, instruct the AI dynamically with custom AI instructions. ## Intro You can pass 2 types of data to your AI on your website: 1. User data (e.g. your customer's email, name, ID) in a simple JSON format 2. Custom instructions for the AI to follow (in addition to the instructions configured via our dashboard on the [Personality page](https://molin.ai/app/shop-ai/personality)) Both of these will appear in the dashboard (on the Inbox page) for your agents to see. Both of these will be passed to your AI to help it generate relevant responses to your user. ## Demo We prepared a demo environment that shows you an example implementation: [Demo: Personalization API | StackBlitz](https://stackblitz.com/edit/molin-ai-inject-user-data-2025-01?file=index.html). ## How to pass data You will pass data through the Molin AI widget. The widget is either installed automatically (if your platform uses our plugin, e.g. Shopify, UNAS, Shoprenter) or it is embedded manually (if you use a custom platform). The snippet for manually embedding the widget looks like this: ```html theme={null} ``` You can always find yours on the [Publish](https://molin.ai/app/publish) page in our dashboard. ### Option 1. Automatic injection (recommended) Simply include your data in a ` ``` When the widget loads, it will automatically read the data from `window.molinSettings`. Using this method, you must ensure that the ` ``` If you set `hidden: true`, the widget launcher will be hidden when it loads, in all cases, on both mobile and desktop. If you set `hidden: false`, the widget launcher will be visible when it loads, in all cases, on both mobile and desktop, even if the page was loaded inside an iframe. If you do not set `hidden` to any value, then the default behavior explained above will apply. ### Option 2. Programmatically using JavaScript (advanced) The widget exposes these methods: ```javascript theme={null} // Show the widget launcher (floating bubble) window.Molin.showLauncher(); // Hide the widget launcher (floating bubble) window.Molin.hideLauncher(); // Open the chat window (as if the launcher was clicked) window.Molin.openChat(); // Close the chat window (as if the launcher was clicked) window.Molin.closeChat(); ``` `window.Molin` is only available after the widget script has fully loaded. We use various algorithms to delay the loading of the script to minimize impact on your website's performance. The widget's visibility methods are only available after the widget script has loaded. The recommended way to know when the widget is ready is to listen for the [`molin:ready`](/home/marketing/javascript-events#molinready) event: ```javascript theme={null} window.addEventListener('molin:ready', () => { window.Molin.showLauncher(); }); ``` Alternatively, you can check if `window.Molin` is defined: ```javascript theme={null} if (window.Molin) { window.Molin.showLauncher(); } ``` ## Examples ### Hide on specific pages Either implement some logic on your backend that controls the value assigned to the `hidden` property inside `window.molinSettings`: ```html theme={null} ``` or use JavaScript to hide the widget on specific pages: ```javascript theme={null} // hide widget launcher on checkout pages if (window.location.pathname.includes('checkout')) { window.Molin.hideLauncher(); } ``` ### Show chat window on button click You can add a "Chat with us" button to your page that opens the chat window when clicked: ```html theme={null} ``` # Introduction Source: https://docs.molin.ai/apis/get-started/api-introduction Start integrating with the Molin API: how versioning works, which APIs are available, and what you need before sending your first request. ## Versioning The Molin API is versioned. Whenever you configure a webhook via our dashboard, you will need to select a version. The version you select will determine the format of the request that Molin will send to you and the format of the response you must respond with. ## Available APIs Supercharge your AI so it can take any action for your users Sync your products using Schema.org structured data format # Security Source: https://docs.molin.ai/apis/get-started/security Keep your Molin API integration safe with HMAC signature verification and rules for handling sensitive information in responses. ## Sensitive information in responses Do not include sensitive information in any response. You should assume that the response will be visible to the user in its entirety. If you need to include sensitive information, you should provide a link to a secure page where the user can view the information. ## HMAC signature verification We are working on implementing HMAC signatures on all requests so you can verify that the request is coming from Molin. This feature is not yet available, but we will update this document when it is. ## Encryption You must use `https` to ensure that the data is encrypted in transit. Our API does not support `http` connections. # Validation Source: https://docs.molin.ai/apis/get-started/validation Use our published Valibot schemas to validate Molin API request and response payloads and get full type-safety in your integration. ## Intro We use [valibot](https://valibot.dev/) schemas to validate the request and response payloads. We also publish these schemas via npm at [@molin.ai/api](https://www.npmjs.com/package/@molin.ai/api) so you can use them to validate the response payloads in your code. Using the [@molin.ai/api](https://www.npmjs.com/package/@molin.ai/api) package is optional as long as your implementation is compliant and follows the schemas of each API. ## Required fields Unless a field is marked as optional using `v.optional()`, it is required and cannot be `null` or `undefined`. Generally, all top-level fields are required, nested fields may be optional, and you may provide additional data in the `extra` field. ## Example Install our npm package, including `valibot` because it is a required peer dependency: ```sh theme={null} npm install --save @molin.ai/api valibot ``` Then, whenever your server receives a request from our API, make sure you run your response through the validator: ```js theme={null} // make sure you use the correct API version import { OrderCancellationResponseSchema } from '@molin.ai/api/v20240910.js'; // valibot is required for schema validation import * as v from 'valibot'; // respond with the data required depending on the request received const response = { cancelled: false, reason: 'Invalid order ID', }; // use valibot's parse or safeParse v.parse(OrderCancellationResponseSchema, response); // if validation passes, your response is valid // if it fails, please double check the schema ``` # Product Sync with Schema.org Source: https://docs.molin.ai/apis/product-sync-with-schema-org Sync your product catalog to Molin with a JSON-LD API built on the Schema.org standard, using header-based authentication. This spec describes a JSON API served via HTTP that uses the [Schema.org](https://schema.org/) structured data format for product synchronization, with header-based authentication. ## Intro We chose the [Schema.org](https://schema.org/) format with [JSON-LD spec](https://json-ld.org/) because it's the web standard for structured data that most e-commerce platforms already use. If you visit any product page hosted by Shopify, WooCommerce, or other major platforms, you'll find a `type="application/ld+json"` script tag encoding product information in Schema.org format. This API leverages that same standardized structure to make product data integration seamless. ## Endpoints We require the following endpoints if you are creating a custom API for Molin. ### Retrieving all products We need an endpoint that we can call frequently to download your products. #### Spec * Content-Type must be **application/json** * The body must contain a list of products encoded as a JSON string * Each product object must be of type [schema.org/Product](https://schema.org/Product) #### Example GET `https://shop.example/molin/products.json` ```json theme={null} [ { "@context": "http://schema.org", "@type": "Product", "name": "Coffee Lenoa | Espresso", "description": "The best coffee beans imported from...", "brand": "Coffee Lenoa", "image": "//lenoacoffeeandshop.hu/cdn/shop/files/...", "url": "https://lenoacoffeeandshop.hu/products/lenoa-espresso", "offers": { "@type": "AggregateOffer", "priceCurrency": "USD", "lowPrice": "12.99", "highPrice": "19.99", "itemCondition": "http://schema.org/New", "availability": "http://schema.org/InStock", "offerCount": "2", "offers": [ { "@type": "Offer", "name": "Coffee Lenoa | Espresso — 1000 gramm", "availability": "http://schema.org/InStock", "priceCurrency": "USD", "price": "19.99" }, { "@type": "Offer", "name": "Coffee Lenoa | Espresso — 250 gramm", "availability": "http://schema.org/InStock", "priceCurrency": "USD", "price": "12.99" } ] }, "additionalProperty": [ { "@type": "PropertyValue", "name": "Origin", "value": "Ethiopia" }, { "@type": "PropertyValue", "name": "Roast Level", "value": "Medium" }, { "@type": "PropertyValue", "name": "Caffeine Content", "value": "High" } ] } ] ``` The above response contains 1 product along with price and stock information. You don’t have to use an [schema.org/AggregateOffer](https://schema.org/AggregateOffer), you can just return a single [schema.org/Offer](https://schema.org/Offer). #### Mandatory fields * **name** * **offers** (so we can extract a price — must include **price** and **priceCurrency**) * **url** (so we can uniquely identify the product) #### Optional but recommended fields * **image** * **sku** or **mpn** (set at the **Product** level — see [Product identifiers](#product-identifiers) below) ### Handling of multiple offers Each entry in your feed represents **one indexed product row**. If a `Product` contains multiple `Offer` entries (or an `AggregateOffer` wrapping multiple inner offers), Molin only reads the **first offer** to extract `price`, `priceCurrency`, `availability`, and `mpn`. **All subsequent offers are ignored.** If you sell product variants (different sizes, colors, SKUs, etc), you must return them as **separate `Product` objects** in the feed, each with its own `url`, `price`, and identifiers. Putting variants inside the `offers` array will cause every variant except the first to be silently dropped. ### Product identifiers Molin stores a single `sku` value per product, used for keyword search (e.g. when a customer searches by part number). The value is resolved in this priority order: 1. `Product.sku` (top-level) — **recommended** 2. `Product.mpn` (top-level) — fallback when `sku` is missing 3. `offers[0].mpn` — fallback for feeds that put MPN only on the first offer 4. A `PropertyValue` named `MPN`/`SKU` inside `additionalProperty` 5. `Product.productGroupID` or `Product.isVariantOf.productGroupID` — see [Grouping variants](#grouping-variants) 6. `Product.productID` — per-variant identifier, used as a last resort Setting `mpn` on each `Offer` variant inside a single `Product` does **not** work for variant lookup. Only the first offer's `mpn` is read, and the rest are dropped. To make every MPN searchable, return each variant as its own top-level `Product` with the MPN set at the Product level (or inside its first/only `Offer`). GTIN values are read from `gtin14`, `gtin13`, `gtin12`, `gtin8`, or `gtin` at the Product level (in that order of preference). ### Grouping variants Variants must be emitted as **separate `Product` objects**, each with a **unique `url`** since rows are keyed by URL. To express that several rows belong to the same product line, use the standard schema.org [ProductGroup](https://schema.org/ProductGroup) fields: * **`productID`** — unique identifier for the variant (per-Product). Used as a last-resort `sku` fallback when no `sku`/`mpn`/`gtin`/`productGroupID` is present. * **`productGroupID`** — identifier shared by every variant in the same group. Either set it directly on each variant `Product`, or use the canonical nested form `isVariantOf: { "@type": "ProductGroup", "productGroupID": "..." }`. When no first-class `sku`/`mpn`/`gtin` is present, this value becomes the row's `sku` so all sibling variants are searchable by the group identifier. #### Example: two variants of the same product line ```json theme={null} [ { "@context": "http://schema.org", "@type": "Product", "name": "Coffee Lenoa | Espresso — 250 g", "url": "https://shop.com/products/espresso?variant=250g", "productID": "ESP-250", "productGroupID": "ESPRESSO", "sku": "ESP-250", "offers": { "@type": "Offer", "price": "12.99", "priceCurrency": "USD", "availability": "http://schema.org/InStock" } }, { "@context": "http://schema.org", "@type": "Product", "name": "Coffee Lenoa | Espresso — 1000 g", "url": "https://shop.com/products/espresso?variant=1000g", "productID": "ESP-1000", "isVariantOf": { "@type": "ProductGroup", "productGroupID": "ESPRESSO" }, "sku": "ESP-1000", "offers": { "@type": "Offer", "price": "19.99", "priceCurrency": "USD", "availability": "http://schema.org/InStock" } } ] ``` ### Providing extra attributes You can include additional product attributes using the `additionalProperty` field from the [schema.org](https://schema.org/) specification. This allows you to provide custom properties that aren't part of the standard Product schema. The `additionalProperty` field accepts an array of [PropertyValue](https://schema.org/PropertyValue) objects, each containing: * **name** - The property name (e.g., "Origin", "Material", "Size") * **value** - The property value (e.g., "Ethiopia", "Cotton", "Large") #### Example usage ```json theme={null} "additionalProperty": [ { "@type": "PropertyValue", "name": "Origin", "value": "Ethiopia" }, { "@type": "PropertyValue", "name": "Roast Level", "value": "Medium" }, { "@type": "PropertyValue", "name": "Caffeine Content", "value": "High" } ] ``` This is particularly useful for: * Product specifications (dimensions, materials, etc.) * Custom categorization * Brand-specific attributes * Technical details that customers might ask about Molin uses these additional properties to provide more detailed and accurate responses about your products when customers ask specific questions. There is a limit of 20 attributes per product. Molin will ignore any additional attributes beyond this limit. Product descriptions are limited to 4000 characters. Longer descriptions will be truncated. ### Retrieving 1 product This is an optimization that we have not built yet. If you have lots of products, it is more efficient to also offer a single product endpoint. For example, if a customer asks Molin about the stock of 1 specific product, we will update only this specific product (quicker than downloading all of them). ## Authentication You may add header-based authentication that relies on a simple shared secret (token). ### Example If you give us the token `M123ABC`, we will include the following header in all requests: ``` Authorization: M123ABC ``` # Feature releases Source: https://docs.molin.ai/changelog/changelog Stay updated with the latest Molin AI features, updates, and product improvements for your shop, from new channels to a smarter AI and a faster dashboard. * Ninja users: attach files up to 100 MB, twice the previous limit * Ninja users: attach Word, PowerPoint, RTF, and ZIP files, plus MP3, WAV, and M4A audio, on top of the [file types Ninja already accepted](/ninja/features#upload-files) * Ninja users: an MP4 or an audio file you attach now plays inside the chat, and you can jump to any point in it instead of downloading it first * Ninja users: ask for a video in 360p to try an idea cheaply, then re-run the one you like in 720p, 1080p, or 4K. A 360p draft costs a third of 720p and arrives faster * Ninja users: give Ninja a first picture and a last picture, and it creates the movement from one to the other * Ninja users: ask Ninja to continue a video it already made, and it adds to the clip instead of starting over. You are charged only for the part it adds * All shops: we fixed how we count the orders your assistant helped with. Each purchase now counts, but a conversation stops earning credit after 28 days. Across all shops, July's corrected total is about 1% higher than before, although an individual shop's result may rise or fall by much more * Vector Webshop shops: pick [Vector Webshop](/home/platforms/vector-webshop-feed) when you set up your assistant and paste the token from your Vector admin. Every variant of a product stays searchable on its own, so a monitor sold in 14 sizes is 14 products rather than one * Shops on any platform where something covers the chat bubble, like an add-to-cart bar that slides in when visitors scroll: [move the bubble out of the way](/home/widget/bubble-offset) with a CSS variable in your theme, and it returns to its normal spot when the bar goes away * All shops: ask the assistant for a product section and it now searches the whole section, not just the products filed directly at the top of it. Shops whose categories are several levels deep gain the most * UNAS shops selling spare parts: when a product description lists the machines a part fits, shoppers can ask for a part for their exact model and get it * [Search API](/home/general/search-api): a `category` filter now covers everything below that category, so you can build a category page from whichever level you want to show * Shopify and Shoprenter shops on a [product feed](/home/general/product-feeds): connect your platform directly to the assistant you already have, from Products → Source. You keep its settings, conversations, billing; and a direct connection gives you live stock, order status, and add-to-cart in chat * Shopify shops: uninstalling the app no longer deletes an assistant you had before you installed it. It now just disconnects your shop and leaves your products and chat history in place * Ninja users: rate answers with a thumbs up or down. We may also ask for a quick 0-10 score * UNAS shops: the assistant now recommends products whose stock has run out, as long as the shop is set to keep accepting orders for them. Previously it treated them as unavailable even while the storefront was still selling them * All new shops: out-of-stock products are recommended by default. Turn this off under Products settings * See delivery and bounce status on the emails you send from the Inbox * A faster dashboard and accessibility fixes across the app A big release: dynamic pop-ups, cart management in chat, and message feedback. * [Dynamic pop-up](/home/widget/dynamic-popup): the AI writes a fresh pop-up message for every visitor, based on the page they're viewing, their cart, previous conversations, and whether they arrived from an ad campaign * Shoppers and the AI can now add products to the cart directly from chat, and edit or view it too * Chat messages now have thumbs up/down buttons, so you get feedback from your shoppers * An AI disclosure label on the widget for EU AI Act compliance * Inbox: Chrome's built-in translation now works, and live chat status messages are translated into your widget's language * Improved email folders UI * Voice mode and phone calls now use a new transcription model for noticeably better accuracy * Compose brand-new emails from a Gmail-style dock in the Inbox * Reply drafts are saved server-side, so they follow you across devices and sessions * AI email replies are now generated on demand, when you ask for them * Your Inbox now automatically sorts conversations into folders * [Customers](/home/crm/customers): your chats turned into a lightweight CRM with orders, ticket history, notes, and tags * A new Analytics overview page with summary cards * A currency exchange tool, so the AI can answer price conversion questions * A redesigned link clicks table in Analytics * Fixed the dashboard showing an old logo after you upload a new one The AI now searches your product catalog in your shop's language first, which fixes irrelevant results on non-English catalogs, plus more product search relevance fixes. * [Elements](/home/general/elements): prebuilt components you embed on your store with a single HTML tag, no JavaScript needed * A new Intercom-style [floating bar](/home/widget/floating-bar) * Full-screen mode for the chat widget * [Instagram DM support](/home/channels/instagram): connect your Instagram Professional account and let Molin answer DMs * Web search is now available for all widgets, and the AI retries it automatically when it detects a hallucinated answer * Reports is now called Analytics * Web search tool: the AI can search the live web for answers, enable it per widget * Faceted search: shoppers can filter product results by attributes like brand or color, based on what your catalog provides * [Email channel](/home/channels/email): your support emails now land in the Inbox and the AI drafts replies, with a custom sending domain and an onboarding wizard * Faster, more stable AI responses with Google's priority mode and OpenAI's latest API * Product discovery: the AI recommends products more proactively and accurately * Live chat emails are now translated (EN, HU, RO, DE) with Molin branding * Shopify event tracking: checkouts, product views, and cart events flow into your analytics * Google feeds now read item\_group\_id as a SKU fallback * Shoppers see a friendly modal when they hit your conversation limit * The widget now previews inside the Shopify theme editor * Live chat labels and streaming text are translated into your widget's language * Redesigned priority selector for conversations * Inbox: search, archive, read status, and email forwarding * Voice dictation in the chat widget * Priority levels for conversations * [Facebook](/home/channels/facebook-messenger): native product cards in Messenger * Customer contact details are saved and shown in the Inbox * Expand/collapse the chat dialog * UNAS multi-language support * Search by SKU * Add-to-cart links for Shopify products in chat * Molin-branded layout for live chat emails * Inbox message translation * More reliable Facebook page connections * Shipping cost on the order card * The Inbox is now translated into your language * Gemini models available for your chatbot * Image viewer polish: ESC to close, loading states * GPT-5 now powers chatbots * New order cancellations metric for Shopify in Analytics * The live chat typing indicator shows the agent's photo * Shopify metafields support for products and orders * Document auto-refresh, with a toggle in settings * A new Publish page on all platforms * A faster products table with search * Shoppers can now send images to your chatbot * Full-screen image viewer in chat * [Documents](/home/knowledge/documents) auto-refresh to keep the AI's knowledge fresh * An optional AI disclaimer in the widget * Much faster product search * Semantic product search: the AI finds products by meaning, not just keywords * [Google Analytics tracking](/home/marketing/integrations/google-analytics): widget events flow into your GA via dataLayer * Product images in chat answers * The floating Ask AI element is now available on all plans * Lead collection emails now include the store URL * Custom bubble icon and bubble sizing (Scale plan) * A [showChat API](/apis/experimental/show-hide-widget) to open the chat programmatically * Unified GTIN product identification * Better link click analytics Order statuses now include parcel tracking data. * A redesigned onboarding flow * [Working hours](/home/inbox/working-hours) with proper timezone handling * Heureka feed support For all shops connected via [Plugins](https://molin.ai/integrations), we're rolling out the full personalisation feature for logged in user. If a user is logged in, the Molin knows the personal details such as name, email, location, and also order history, current items in the cart, loyalty points and coupon codes. This way the AI can tailor its responses and product recommendations to the customer offering a fully personalized conversational shopping experience. Watch this video: [https://www.loom.com/share/6e7c9112187649e487913ba2907c4b53?sid=16b90ad4-62ee-4d03-82f8-105c7d0f24f9](https://www.loom.com/share/6e7c9112187649e487913ba2907c4b53?sid=16b90ad4-62ee-4d03-82f8-105c7d0f24f9) After we added full website downloads, we're bringing you the first built in personalization feature – current page context. Molin knows the current page of the user and can answer vague questions, such as, "Do you have this in size 9?". As these questions were lacking context traditionally, Molin always had to ask back and then do a search. This is changing now. See the example below: ![](https://imagedelivery.net/JWssb2diw2B-JHR2ojV3Ow/0fd5040a-05f9-42e4-c285-a8683a782e00/q=75,dpr=1) Today, we're releasing Document support for all Molin chatbots. From now on, you can submit entire websites, sitemaps, single pages and PDFs to train Molin on all of your data. As soon as you add documents, Molin learns them and answers questions accordingly. We hope this will help a lot with training your AIs and keeping them up-to-date. Furthermore, we refresh the uploaded pages every 7 days to keep the knowledge fresh. Navigate to the [Documents](https://molin.ai/app/documents) page and start uploading your data [here](https://molin.ai/app/documents#add)! ![](https://imagedelivery.net/JWssb2diw2B-JHR2ojV3Ow/0c6d7453-b584-4f26-2a4d-bccf9cbd3400/fit=scale-down,q=75) We have moved from an embedded Shopify app to a standalone application and added new AI actions. From now on, you can manage your Shopify app support via the Molin [Dashboard](https://molin.ai/app). New AI actions: * Order statuses with tracking link * Order cancellations with automatic refunds and restocking * Human handover with live chat Install our brand new app from the Shopify app store [here](https://apps.shopify.com/molin-ai). Use our new API to inject specific user data or custom prompt to the AI for each user session. This way Molin's knowledge can be tailord to the end user and the user's current section. Read the docs [here](/apis/experimental/personalization-api) You can programmatically control when the Molin AI widget is shown or hidden on your pages. This is useful for hiding the chatbot on specific pages (e.g. checkout, terms of service), showing the widget only after certain conditions are met, managing widget visibility inside iframes. Read the docs [here](/apis/experimental/show-hide-widget) The chatbot can now render UI elements, such as product cards, lists, order details, order tracking card in chat on demand. The UI elements support all the languages and can be renderred in many ways. We made the script lighter and faster. Now the chatbot loads in a few miliseconds, not slowing down the page speed of the website. When users click on links in the Molin chat, UTM parameters are automatically added to the links provided by the AI. This way you can track the activity of the AI right in your analytics tool automatically, such as Google Analytics. Read more [here](/home/general/utm). We have launched the custom AI actions API to allow any kind of custom actions to work with Molin. Connect Molin to all your systems with a generalised custom AI action solution. Invite your colleagues to Molin and work in a team. Team members can have 2 roles - Admin and Agent. Admin has access to all functionality, whereas agents only get to operate the Inbox and their own Sidekick. This way the agents cannot reset the settings of the AI. Create and manage an unlimited number of chatbots in one account. Each chatbot works as a separate entity within the same team account, so each of them can be connected to any platform. For example, 1 can be connected to your Shopify shop, the other one to your Woocommerce shop all in the same account. Released a brand new design for the chatbot layout to make it unique. # Analytics & reports Source: https://docs.molin.ai/home/analytics/reports See how many people chat with your AI, how much time and money it saved you, and how much it contributes to your sales. The Analytics page shows what your chatbot has been doing over the time period you pick. Find it in your dashboard under [**Analytics**](https://molin.ai/app/reports). ## The three tabs ### Customer support * **Conversations**: how many chats happened. * **Messages**: how many messages were exchanged. * **Time saved**: how much support time the AI handled for you. * **Money saved**: an estimate of the support cost the AI saved. * **Order status resolutions**: how many times the AI helped a customer with their order. * **Order cancellations**: how many cancellations went through the chat. * **Conversation length avg.**: how long an average chat lasts. * **Response time**: how fast the AI replies. ### Sales * **Visitor checkouts**: how many people who chatted went on to check out. * **AI-assisted checkout details**: the individual checkouts behind the visitor checkout count. * **Leads collected**: how many leads the AI captured. * **Estimated revenue uplift**: an estimate of the extra revenue from chats. * **Revenue per lead**: average value of a lead. An AI-assisted checkout means the checkout was detected after the visitor received a chatbot response. ### Live Chat * **Total Sessions**: how many live chats your team handled. * **Agents**: who was on live chat. * **CSAT**: customer satisfaction score for live chat sessions. ## How to use it * **Pick a time range** at the top of the page. * **Switch tabs** to look at support, sales, or live chat. * **Check it once a week** to see if numbers are going up. # Email Source: https://docs.molin.ai/home/channels/email Forward your support inbox to Molin so the AI can read incoming customer emails, draft replies in your tone, and send them for you. Connect your support email to Molin so the AI can read incoming customer emails, draft replies in your tone, and send them on your behalf. All email conversations show up in the [Inbox](https://molin.ai/app/inbox) alongside web chat, Messenger, and Instagram. ## How it works Molin gives each widget a unique inbound address (for example `panda-pod-trick@gt010n7t.molin.email`). You set up a forwarding rule in your existing email provider so a copy of every incoming customer email is delivered to that address. From there, Molin: * detects the customer, threads the conversation, and routes attachments * generates a draft reply with one click in the Inbox, using the same AI and instructions that power your web widget * sends the reply from your domain (or from `@molin.email` until you connect a custom domain) You keep using your existing inbox. Molin acts as an additional recipient, not a replacement. ## Set up forwarding Pick your email provider and follow the step-by-step guide. Google Workspace and personal Gmail accounts Microsoft 365, Outlook.com, and Hotmail Apple iCloud and `@icloud.com` addresses Yahoo Mail (requires Yahoo Mail Plus) If your provider isn't listed, look for "forwarding" or "auto-forward" in its settings. The Molin inbound address is the only thing you need from us. ## Platform-specific guides If your support email is tied to your ecom platform's domain hosting (rather than to a separate mail provider), use these guides instead. Forward from a Shopify-managed custom domain Forward from an UNAS-hosted domain ## Send from your own domain By default Molin sends replies from a `@molin.email` subdomain, which works immediately but shows the Molin domain to your customers. To send from your own domain (for example `support@yourshop.com`), connect a custom domain from the email setup wizard. You'll add 4 NS records at your registrar that delegate a subdomain (for example `molin.yourshop.com`) to Molin, so we manage email authentication (DKIM, SPF, MX) for you and your replies don't land in spam. Step-by-step guides for adding the records at common registrars: Add the NS records on Cloudflare DNS Add records via the GoDaddy DNS manager Add records via Namecheap Advanced DNS Workarounds for Shopify-managed domains Find your registrar and add the records there Find your registrar and add the records there If your registrar isn't listed, the wizard still shows the exact records to add and verifies them automatically — most registrars have an **Add record** form with the same Type / Name / Value fields. # Add Molin DNS records on Cloudflare Source: https://docs.molin.ai/home/channels/email/dns/cloudflare Publish the four NS records Molin gives you when connecting a custom sending domain, using Cloudflare's DNS dashboard. When you connect a custom sending domain in Molin, the wizard shows you 4 NS records to add at your registrar. This guide covers adding them in Cloudflare's DNS dashboard. You only need this guide if Cloudflare manages DNS for the domain you're connecting. If your domain is registered at Cloudflare but uses another DNS provider's nameservers, follow the guide for that provider instead. ## Prerequisites * A Cloudflare account with the domain you want to use already added * The exact records Molin shows you in the [email setup wizard](https://molin.ai/app/channels/email) (4 NS records) ## Steps 1. Open the [Cloudflare dashboard](https://dash.cloudflare.com/) and select the domain you want to use 2. Click **DNS → Records** in the left sidebar 3. For each **NS** record shown in the Molin wizard: 1. Click **Add record** 2. Set **Type** to `NS` 3. Set **Name** to the value shown in the wizard's **Name** column — this is the subdomain you chose to connect (e.g. enter `molin` if you connected `molin.yourshop.com`, or `@` for a root domain) 4. Paste the nameserver value (e.g. `ns1.molin.ai`) into **Server** 5. Click **Save** 6. Repeat for the remaining 3 NS records ## Critical: keep the proxy off Cloudflare's orange-cloud proxy must be **off** for NS records. NS records cannot be proxied at all (Cloudflare will reject the save). For each record you add, ensure the proxy column shows the grey cloud (DNS only), not the orange cloud (proxied). New NS records are forced to grey by default; double-check after saving. ## Verify 1. Return to the Molin email setup wizard 2. Click **Verify now** 3. The wizard polls every 30 seconds automatically, so you can also wait — verification typically completes within 5 minutes of saving in Cloudflare If verification fails, Cloudflare DNS changes take effect in under a minute, so the cause is almost always a typo in the subdomain or a missing record. The wizard tells you which specific record didn't match. ## Reference For Cloudflare's own documentation, see [Add DNS records](https://developers.cloudflare.com/dns/manage-dns-records/how-to/create-dns-records/). # Add Molin DNS records on GoDaddy Source: https://docs.molin.ai/home/channels/email/dns/godaddy Publish the four NS records Molin gives you when connecting a custom sending domain, using GoDaddy's DNS management page. When you connect a custom sending domain in Molin, the wizard shows you 4 NS records to add at your registrar. This guide covers adding them in GoDaddy. You only need this guide if GoDaddy manages DNS for the domain you're connecting. If you transferred DNS to another provider (e.g. Cloudflare), follow that provider's guide instead. ## Prerequisites * A GoDaddy account with the domain you want to use * The exact records Molin shows you in the [email setup wizard](https://molin.ai/app/channels/email) (4 NS records) ## Steps 1. Sign in at [godaddy.com](https://godaddy.com/) and open the [Domain Portfolio](https://dcc.godaddy.com/control/portfolio) 2. Select your domain to open the **Domain Settings** page 3. Select **DNS** to view your DNS records 4. For each **NS** record shown in the Molin wizard: 1. Click **Add New Record** and choose **NS** from the **Type** menu 2. Set **Name** to the value shown in the wizard's **Name** column — this is the subdomain you chose to connect (e.g. enter `molin` if you connected `molin.yourshop.com`, or `@` for a root domain) 3. Paste the nameserver value (e.g. `ns1.molin.ai`) into **Value** 4. Leave **TTL** at the default (1 hour) 5. Click **Save** (or **Save All Records** if you added multiple at once via **Add More Records**) ## Verify 1. Return to the Molin email setup wizard 2. Click **Verify now** GoDaddy DNS changes usually take effect in 30 seconds to a few minutes, occasionally up to an hour. The Molin wizard checks every 30 seconds, so you can leave it open while you wait. ## Troubleshooting * **GoDaddy strips the trailing dot from NS values** — that's fine. Paste `ns1.molin.ai` (no trailing dot) and let GoDaddy normalize it. * **"This record already exists" error on an NS record** — GoDaddy creates default NS records for new subdomains. Delete any existing NS records on the same Name before adding the Molin ones, otherwise they clash and verification fails. ## Reference For GoDaddy's own documentation, see [Add an NS record](https://www.godaddy.com/help/add-an-ns-record-19212) for the NS-specific flow and [Manage DNS records](https://www.godaddy.com/help/manage-dns-records-680) for the general DNS editor. # Add Molin DNS records on Namecheap Source: https://docs.molin.ai/home/channels/email/dns/namecheap Publish the four NS records Molin gives you when connecting a custom sending domain, using Namecheap's Advanced DNS panel. When you connect a custom sending domain in Molin, the wizard shows you 4 NS records to add at your registrar. This guide covers adding them in Namecheap's Advanced DNS panel. This guide assumes you're using **Namecheap BasicDNS** or **PremiumDNS** (the default for domains registered at Namecheap). If you pointed your domain's nameservers at a third party (e.g. Cloudflare or Google Domains), follow that provider's guide instead — records added in Namecheap will be ignored. ## Prerequisites * A Namecheap account with the domain you want to use * The exact records Molin shows you in the [email setup wizard](https://molin.ai/app/channels/email) (4 NS records) ## Steps 1. Sign in at [namecheap.com](https://namecheap.com/) and open the [Domain List](https://ap.www.namecheap.com/domains/list/) 2. Click **Manage** next to the domain you want to use 3. Open the **Advanced DNS** tab 4. Confirm the **Nameservers** field at the top says **Namecheap BasicDNS** or **Namecheap PremiumDNS**. If it says **Custom DNS**, your records belong elsewhere — see the warning above 5. Under **Host Records**, click **Add New Record** for each Molin NS record: 1. Set **Type** to `NS RECORD` 2. Set **Host** to the value shown in the wizard's **Name** column — this is the subdomain you chose to connect (e.g. `molin` if you connected `molin.yourshop.com`) 3. Paste the nameserver value into **Nameserver** (e.g. `ns1.molin.ai`) 4. Leave **TTL** at **Automatic** 5. Click the green checkmark to save the row 6. Repeat for the remaining 3 NS records 6. Click **Save All Changes** at the top of the Host Records table ## Verify 1. Return to the Molin email setup wizard 2. Click **Verify now** Namecheap BasicDNS changes usually take effect in 1–2 minutes. PremiumDNS is faster, often under 30 seconds. ## Troubleshooting * **The Advanced DNS tab is missing** — you're on the **Domain** tab. Look for the tab strip at the top of the page; **Advanced DNS** sits next to **Sharing & Transfer**. * **NS records won't save because of "duplicate host"** — Namecheap auto-creates default NS records on new subdomains. Delete any existing rows on the same Host before adding the Molin ones, then save. * **Verification fails after a clean copy** — confirm the **Host** field matches Molin's subdomain prefix exactly, a missing or mistyped prefix is the most common cause. ## Reference For Namecheap's own documentation, see [How can I set up Custom DNS records](https://www.namecheap.com/support/knowledgebase/article.aspx/9776/2237/how-can-i-set-up-custom-dns-records-acname-mx-txt-srv-aaaa-caa-for-my-domain/). # Add Molin DNS records for a Shopify domain Source: https://docs.molin.ai/home/channels/email/dns/shopify Shopify's DNS editor can't add NS records, so here are the workarounds for connecting a custom sending domain on a Shopify-managed domain. When you connect a custom sending domain in Molin, the wizard shows you 4 NS records to add at your DNS provider. This guide covers what to do when your domain is registered or managed through Shopify. Shopify's built-in DNS editor does **not** support `NS` records — it only allows `A`, `AAAA`, `CNAME`, `MX`, `TXT`, and `SRV`. You cannot add Molin's nameserver records inside Shopify directly. The two workarounds below are the only paths that work. ## Prerequisites * A Shopify store with the domain you want to use * The exact records Molin shows you in the [email setup wizard](https://molin.ai/app/channels/email) ## Option A — recommended: move DNS to Cloudflare (free) Cloudflare lets you keep the domain registered at Shopify while taking over DNS hosting, so you can add `NS` records that Shopify's editor wouldn't accept. Switching nameservers controls your entire domain, including your storefront and existing email. If a record is missed during the move, your website can go offline. We strongly recommend asking your developer or IT team to do this for you. 1. Sign up for a free [Cloudflare account](https://dash.cloudflare.com/sign-up). 2. Add your domain to Cloudflare. Cloudflare will scan your existing Shopify DNS and import the `A`, `CNAME`, and `MX` records that point at Shopify so the storefront keeps working. 3. Cloudflare will show you a pair of nameservers (e.g. `gabe.ns.cloudflare.com`, `nora.ns.cloudflare.com`). 4. In the Shopify admin, open **Settings → Domains**, click the domain, then click **DNS settings**. Find the **Nameservers** section near the top and replace Shopify's nameservers with Cloudflare's. Save. 5. Wait for the change to take effect (usually under an hour). Cloudflare will email you when it's done. 6. Once Cloudflare manages your DNS, follow the [Cloudflare guide](/home/channels/email/dns/cloudflare) to add the Molin records. ## Option B — use a subdomain on a different domain If you can't move DNS off Shopify, you can use a different domain you already own for sending (one whose DNS is managed by Cloudflare, GoDaddy, or Namecheap). 1. Click **Back** at the bottom of the custom-domain step in the Molin wizard. 2. Enter a sending subdomain on a different domain whose DNS is managed by one of the supported providers (e.g. `molin.yourshop.com` if your storefront is `yourshop.myshopify.com`). 3. Add the records there following that provider's guide. The sending domain doesn't have to match your storefront domain. ## Verify 1. Return to the Molin email setup wizard 2. Click **Verify now** 3. The wizard polls every 30 seconds, so you can also wait. Verification completes within a few minutes of the records being live. ## Reference For Shopify's documentation on DNS limitations, see [Edit your domain's DNS settings](https://help.shopify.com/en/manual/online-store/domains/managing-domains/edit-dns-settings). # Add Molin DNS records for a Shoprenter domain Source: https://docs.molin.ai/home/channels/email/dns/shoprenter Shoprenter doesn't host DNS, so find your domain registrar and add the NS records Molin shows you when connecting a custom sending domain. When you connect a custom sending domain in Molin, the wizard shows you 4 NS records to add at your DNS provider. This guide covers what to do when your shop runs on Shoprenter. Shoprenter doesn't host DNS itself. Your domain's records live at the registrar where you bought the domain — commonly [DotRoll](https://dotroll.com/) or another Hungarian registrar. This guide walks you through finding that registrar and adding the records there. ## Prerequisites * A Shoprenter admin login * Login credentials for whichever registrar manages your domain * The exact records Molin shows you in the [email setup wizard](https://molin.ai/app/channels/email) ## Step 1 — find your registrar 1. Sign in to your Shoprenter admin 2. Open **Beállítások → Domain nevek** (Settings → Domain names) 3. Note the registrar listed next to your domain — that's where you'll add the DNS records If Shoprenter's domain panel doesn't show a registrar, the registrar is whoever you paid for the domain (look at your past invoices or check email confirmations). ## Step 2 — add the records at your registrar The exact UI varies by registrar, but the steps are the same: 1. Sign in to the registrar's control panel 2. Find the **DNS** / **Zone Editor** / **Zóna szerkesztő** section for your domain 3. For each `NS` record shown in the Molin wizard: 1. Add a new record 2. Set **Type** to `NS` 3. Set **Host** / **Name** / **Név** to the value shown in the wizard's **Name** column — this is the subdomain you chose to connect (e.g. `molin` if you connected `molin.yourshop.com`) 4. Paste the nameserver value (e.g. `ns1.molin.ai`) into **Value** / **Target** / **Nameserver** / **Cél** 5. Save 6. Repeat for the remaining 3 NS records ## DotRoll specifics Many Shoprenter shops use [DotRoll](https://dotroll.com/) as their registrar: 1. Sign in at [dotroll.com](https://dotroll.com/en/login) 2. Click your domain to open it 3. Open the **DNS** tab 4. Use **Új rekord hozzáadása** (Add new record) for each NS row ## If your registrar doesn't let you edit DNS Some small registrars don't give you a DNS editor at all. The simplest fix: 1. Sign up for a free [Cloudflare account](https://dash.cloudflare.com/sign-up) 2. Add your domain and let Cloudflare scan your existing DNS 3. Cloudflare gives you a pair of nameservers — go back to your registrar and replace your domain's nameservers with Cloudflare's 4. Once it takes effect (under an hour), follow the [Cloudflare guide](/home/channels/email/dns/cloudflare) to add the Molin records ## Verify 1. Return to the Molin email setup wizard 2. Click **Verify now** 3. The wizard polls every 30 seconds — verification completes within a few minutes of the records being live If you don't know which registrar runs your DNS, use the **Send this to your developer** button in the wizard — it copies a ready-to-send message with all the records. ## Reference For Shoprenter's own documentation (Hungarian), see [Domain átirányítás](https://support.shoprenter.hu/hc/hu/articles/215106978-Domain-%C3%A1tir%C3%A1ny%C3%ADt%C3%A1s), [Rackhostnál regisztrált domain beállítása](https://support.shoprenter.hu/hc/hu/articles/5008523684509), and [MediaCenternél regisztrált domain beállítása](https://support.shoprenter.hu/hc/hu/articles/115000658588). These cover Shoprenter's general DNS flow at the two most common Hungarian registrars; for NS records specifically you'll still need to follow your registrar's own DNS editor docs. # Add Molin DNS records for a UNAS domain Source: https://docs.molin.ai/home/channels/email/dns/unas UNAS doesn't host DNS, so find your domain registrar and add the NS records Molin shows you when connecting a custom sending domain. When you connect a custom sending domain in Molin, the wizard shows you 4 NS records to add at your DNS provider. This guide covers what to do when your shop runs on UNAS. UNAS doesn't host DNS itself. Your domain's records live at the registrar (regisztrátor) where the domain was purchased — commonly [Nethely](https://www.nethely.hu/), [DotRoll](https://dotroll.com/), or another Hungarian registrar. This guide walks you through finding that registrar and adding the records there. ## Prerequisites * A UNAS admin login * Login credentials for whichever registrar manages your domain * The exact records Molin shows you in the [email setup wizard](https://molin.ai/app/channels/email) ## Step 1 — find your registrar 1. Sign in to your UNAS admin 2. Open **Beállítások → Domain** (Settings → Domain) 3. Look for the **regisztrátor** field listed against your domain — that identifies where the DNS records actually need to go If UNAS shows no registrar at all, check your past invoices or the original confirmation email from when you purchased the domain. ## Step 2 — add the records at your registrar The exact UI varies by registrar, but the steps are the same: 1. Sign in to the registrar's control panel 2. Find the **DNS** / **Zóna szerkesztő** (Zone editor) section for your domain 3. For each `NS` record shown in the Molin wizard: 1. Add a new record 2. Set **Type** to `NS` 3. Set **Host** / **Name** / **Név** to the value shown in the wizard's **Name** column — this is the subdomain you chose to connect (e.g. `molin` if you connected `molin.yourshop.com`) 4. Paste the nameserver value (e.g. `ns1.molin.ai`) into **Value** / **Target** / **Nameserver** / **Cél** 5. Save 6. Repeat for the remaining 3 NS records ## Nethely specifics If your domain is at [Nethely](https://www.nethely.hu/): 1. Sign in to the Nethely admin 2. Open **Domain kezelés** (Domain management) 3. Click your domain, then open **DNS beállítások** (DNS settings) 4. Use the **Új rekord** (New record) button for each NS row ## If your registrar doesn't let you edit DNS Some small registrars don't give you a DNS editor at all. The simplest fix: 1. Sign up for a free [Cloudflare account](https://dash.cloudflare.com/sign-up) 2. Add your domain and let Cloudflare scan your existing DNS 3. Cloudflare gives you a pair of nameservers — go back to your registrar and replace your domain's nameservers with Cloudflare's 4. Once it takes effect (under an hour), follow the [Cloudflare guide](/home/channels/email/dns/cloudflare) to add the Molin records ## Verify 1. Return to the Molin email setup wizard 2. Click **Verify now** 3. The wizard polls every 30 seconds — verification completes within a few minutes of the records being live If you don't know which registrar runs your DNS, use the **Send this to your developer** button in the wizard — it copies a ready-to-send message with all the records. ## Reference For UNAS's own documentation (Hungarian), see [DNS zóna módosítás](https://unas.hu/tudastar/hosting/dns-zona-modositas) and [Domain beállítások](https://unas.hu/tudastar/ugyfelfiok/domain-beallitasok). Note: the UNAS DNS zone editor lists support for A, CNAME, MX, and TXT records but does **not** mention NS records — that's why this guide routes you to the underlying registrar instead. # Forward Gmail to Molin Source: https://docs.molin.ai/home/channels/email/forwarding/gmail Set up Gmail or Google Workspace forwarding so a copy of every customer email reaches your Molin inbound address and the AI can reply. This guide walks you through Gmail's built-in forwarding setting so a copy of every incoming email is sent to your Molin inbound address. Works for both Google Workspace and personal `@gmail.com` accounts. The fastest way to set this up is the email setup wizard at [molin.ai/app/channels/email](https://molin.ai/app/channels/email), which guides you through these same steps and detects Google's verification email for you. ## Prerequisites * A Gmail or Google Workspace account * Your **Molin inbound address** from the email setup wizard (looks like `panda-pod-trick@gt010n7t.molin.email`) ## Steps 1. Open Gmail's [forwarding settings](https://mail.google.com/mail/u/0/#settings/fwdandpop) directly, or go to **Settings → See all settings → Forwarding and POP/IMAP** 2. Click **Add a forwarding address** 3. Paste your Molin inbound address and click **Next** 4. Click **Proceed**, then **OK**. Gmail sends a verification email to your Molin address 5. Wait for Molin to receive the verification email * In the Molin email setup wizard, the confirmation link surfaces automatically within a few seconds * If you're doing this manually, ask your team to fetch the link from the inbound address (or use the wizard) 6. Click the confirmation link Gmail sent. This proves you own the destination address 7. Back in Gmail's forwarding settings, select **Forward a copy of incoming mail to** and pick your Molin address from the dropdown 8. Choose what Gmail should do with the original — we recommend **keep Gmail's copy in the Inbox** so your team still sees the email 9. Click **Save Changes** at the bottom of the page Forwarding only applies to mail that arrives *after* you save. To also process emails received earlier, create a Gmail filter with **Forward it to:** set to your Molin address and apply the filter to existing matching conversations. ## Filter by sender (optional) If you only want to forward emails sent to a specific support alias (for example `help@yourshop.com`), use a Gmail filter instead of global forwarding: 1. Click the search bar's filter icon at the top of Gmail 2. Set **To** to your support alias and click **Create filter** 3. Tick **Forward it to:** and choose your Molin address from the dropdown 4. Click **Create filter** ## Troubleshooting * **The verification email never arrives** — check that you pasted the Molin address correctly. The part before the `@` is three lowercase words joined by dashes (for example `panda-pod-trick`). * **Forwarding option is greyed out in Google Workspace** — your Workspace admin may have disabled external forwarding. Ask them to allow forwarding to `molin.email`. ## Reference For Gmail's own documentation, see [Automatically forward Gmail messages to another account](https://support.google.com/mail/answer/10957). If you use Google Workspace and forwarding is disabled in your account, your admin needs to enable it — see [Let users automatically forward their own Gmail emails](https://support.google.com/a/answer/14724207). # Forward iCloud Mail to Molin Source: https://docs.molin.ai/home/channels/email/forwarding/icloud Set up iCloud Mail forwarding, either globally or per rule, so customer emails reach your Molin inbound address and the AI can reply. iCloud Mail supports two ways to forward: a global "forward all messages" toggle, and a per-rule forward action you create from icloud.com. The per-rule approach is better if you only want to forward specific support emails. ## Prerequisites * An iCloud Mail account * Your **Molin inbound address** from the email setup wizard ## Forward all incoming mail 1. Open [icloud.com/mail](https://icloud.com/mail) and sign in 2. Click the **Settings** button at the top of the Mailboxes list, then choose **Settings** in the menu that appears 3. Select **Mail Forwarding** in the sidebar 4. Tick **Forward my email to** and paste your Molin inbound address 5. Leave **Delete messages after forwarding** **off** so your inbox keeps the originals 6. Click **Done** ## Forward only specific emails (rule-based) If you only want to forward emails sent to your support alias, create a rule instead: 1. Open [icloud.com/mail](https://icloud.com/mail) and sign in 2. Click the **Settings** button at the top of the Mailboxes list, then choose **Settings** in the menu that appears 3. Select **Rules** in the sidebar, then **Add a Rule** 4. Under **If a message**, set the condition (for example, **is addressed to → [support@yourshop.com](mailto:support@yourshop.com)**) 5. Under **Then**, choose **Forward to** and paste your Molin inbound address 6. Click **Done** ## Verification iCloud sends a verification email to your Molin address before forwarding starts. The email setup wizard at [molin.ai/app/channels/email](https://molin.ai/app/channels/email) surfaces it as a one-click confirmation button — use it for the fastest path. If you're setting up manually, open the verification email in the Molin [Inbox](https://molin.ai/app/inbox) and click the link inside. ## Troubleshooting * **No emails arrive at Molin** — double-check the destination address in the iCloud settings. The part before the `@` is three lowercase words joined by dashes (for example `panda-pod-trick`). * **Forwarding option not visible in some regions** — Apple has occasionally restricted iCloud Mail features by region. If the **Mail Forwarding** sidebar entry is missing, sign in to icloud.com on a desktop browser (the mobile web view hides it). ## Reference For Apple's own documentation, see [Automatically forward email in Mail on iCloud.com](https://support.apple.com/guide/icloud/automatically-forward-email-mm6b1a3960/icloud). # Forward Outlook to Molin Source: https://docs.molin.ai/home/channels/email/forwarding/outlook Set up an Outlook.com, Hotmail, or Microsoft 365 forwarding rule so customer emails reach your Molin inbound address and the AI can reply. This guide covers Microsoft 365 (work / school accounts), Outlook.com, and Hotmail. The two flows are slightly different — pick the one that matches your account type. ## Prerequisites * An Outlook.com, Hotmail, or Microsoft 365 mailbox * Your **Molin inbound address** from the email setup wizard ## Microsoft 365 (work or school) Microsoft 365 lets you forward at the mailbox level (admin-controlled) or per inbox rule (user-controlled). The inbox rule is faster and doesn't need admin help. 1. Open [Outlook on the web](https://outlook.office.com/) and sign in 2. Click the **Settings** gear in the top-right corner 3. Go to **Mail → Rules → Add new rule** 4. Name the rule (e.g. `Forward to Molin`) 5. Under **Add a condition**, choose **Apply to all messages** 6. Under **Add an action**, choose **Forward to** and paste your Molin inbound address 7. Tick **Stop processing more rules** to prevent conflicts with other rules 8. Click **Save** If your Microsoft 365 admin has blocked external forwarding, the rule will save but emails won't be delivered. Ask them to allow forwarding to `molin.email`, or have them set up a transport rule at the tenant level instead. ### Tenant-level forwarding (admin) If you're a Microsoft 365 admin and want to forward at the organization level: 1. Open the [Exchange admin center](https://admin.exchange.microsoft.com/) 2. Go to **Mail flow → Rules → Add a rule → Create a new rule** 3. Set the condition to **Apply to all messages** (or restrict to a specific recipient like `support@`) 4. Set the action to **Bcc the message to** and paste your Molin inbound address 5. Save and enable the rule Using **Bcc** instead of **Redirect** keeps the original delivery to your team's inbox untouched. ## Outlook.com / Hotmail (personal) 1. Open [outlook.com](https://outlook.com/) and sign in 2. Click the **Settings** gear in the top-right corner 3. Go to **Mail → Forwarding** 4. Toggle **Enable forwarding** on 5. Paste your Molin inbound address into **Forward my email to** 6. Tick **Keep a copy of forwarded messages** so your inbox still receives the originals 7. Click **Save** Outlook.com may send a verification email to your Molin address. Use the email setup wizard at [molin.ai/app/channels/email](https://molin.ai/app/channels/email) to confirm it automatically. ## Troubleshooting * **Rule saves but no emails arrive at Molin** — Microsoft 365 blocks external forwarding by default in many tenants. Confirm with your admin that forwarding to `molin.email` is allowed under the [outbound spam policy](https://learn.microsoft.com/en-us/defender-office-365/anti-spam-policies-configure). ## Reference For Microsoft's own documentation, see [Turn on automatic forwarding in Outlook](https://support.microsoft.com/en-us/office/turn-on-automatic-forwarding-in-new-and-classic-outlook-for-windows-also-outlook-on-the-web-7f2670a1-7fff-4475-8a3c-5822d63b0c8e) for Outlook.com and the web client, [Use rules to automatically forward messages](https://support.microsoft.com/en-us/office/use-rules-to-automatically-forward-messages-45aa9664-4911-4f96-9663-ece42816d746) for rule-based forwarding, and [Configure email forwarding](https://learn.microsoft.com/en-us/microsoft-365/admin/email/configure-email-forwarding) for Microsoft 365 admin-level forwarding. # Forward Shopify-managed email to Molin Source: https://docs.molin.ai/home/channels/email/forwarding/shopify Point Shopify's built-in email forwarding at your Molin inbound address so support emails sent to your Shopify-managed domain reach the AI. If you bought your domain through Shopify (a "Shopify-managed domain"), Shopify offers a built-in email forwarding feature you can point at your Molin inbound address. No third-party provider needed. This guide only applies to **Shopify-managed domains**. If your domain is registered with a third-party (GoDaddy, Namecheap, Cloudflare, etc.), Shopify's email forwarding section doesn't appear. Set up forwarding at your provider instead, or transfer the domain to Shopify. ## Prerequisites * A Shopify-managed domain (purchased through Shopify Domains) * Your **Molin inbound address** from the email setup wizard (looks like `panda-pod-trick@gt010n7t.molin.email`) * Admin access to your Shopify store ## Steps 1. From your Shopify admin, go to **Settings → Domains** 2. Click the domain you want to set up forwarding for 3. In the **Email forwarding** section, click **Add forwarding email** 4. In **Forwarding email address**, enter the first part of the address customers will use (e.g. `support`). Do not type `@` or the domain — Shopify appends them automatically 5. In **Receiving email address**, paste your **Molin inbound address** (the full `xxx@gt010n7t.molin.email` string from the wizard) 6. Click **Save** You can repeat this for as many addresses as you want (e.g. `support@`, `help@`, `info@`). Each Shopify forwarding entry only forwards to **one** destination, so use the same Molin address for all of them. ## Test the forwarding 1. From a different email account (not the one you'd use as a destination), send a test message to the address you created (e.g. `support@yourshop.com`) 2. Open the [Inbox](https://molin.ai/app/inbox) in Molin and look for the new conversation If nothing arrives within a few minutes, double-check that the destination matches your Molin inbound address exactly. ## How replies work Shopify warns that replies from a forwarded email show the **forwarding** address as the sender, not your custom domain. This caveat doesn't apply when Molin is the destination — Molin sends replies through its own outbound, automatically setting the `From` to your custom domain (once connected) and `Reply-To` to your support address. Customers always see and reply to your address, never to a `molin.email` one. ## Reference For Shopify's own documentation on this feature, see [Setting up email forwarding for a Shopify-managed custom domain](https://help.shopify.com/en/manual/domains/email-forwarding-and-hosting/email-forwarding). # Forward UNAS email to Molin Source: https://docs.molin.ai/home/channels/email/forwarding/unas Add an UNAS email forwarder so a copy of every support message reaches your Molin inbound address, plus what to watch out for with SPF. If your domain and hosting are with UNAS, you can add an email forwarder from the UNAS admin so a copy of every incoming email is delivered to your Molin inbound address. UNAS themselves [recommend against external forwarding](https://unas.hu/blog/az-email-tovabbito-halala) because plain forwarding can break SPF/DKIM authentication and degrade deliverability when replying from another system. For Molin this is not an issue: Molin sends replies through its own authenticated outbound (with DKIM and SPF for our domain, plus your own domain once you connect it), so the original forwarded message only needs to reach us — we don't re-send from a forwarded identity. ## Prerequisites * An UNAS hosting account with at least one domain * Your **Molin inbound address** from the email setup wizard (looks like `panda-pod-trick@gt010n7t.molin.email`) ## Steps 1. Sign in to your UNAS admin and open the hosting panel 2. Go to **Email → Email továbbító** (Email forwarder) 3. Click **Hozzáad** (Add) 4. In the forwarder name field, enter the first part of the address customers will use (e.g. `support`, `info`, or `help`) 5. In the destination field, paste your **Molin inbound address**. Press **Enter** to confirm. You can add multiple destinations if needed — separate them with **Enter** — but for Molin a single destination is enough 6. Click **Ment** (Save) Repeat for each support alias you want forwarded (for example `support@`, `info@`, `rendeles@`). ## Keep a local copy (optional) By default, UNAS only delivers forwarded mail to the destination — nothing stays in UNAS. If you also want a local copy to read in UNAS WebMail: 1. Create a real mailbox under **Email → Email fiók** with the same name as the forwarder (e.g. `support`) 2. The forwarder will deliver to Molin **and** keep a copy in the local mailbox This is useful if you want a redundant archive in UNAS in addition to Molin's [Inbox](https://molin.ai/app/inbox). ## Test the forwarding 1. From a different email account, send a test message to the forwarded address (e.g. `support@yourshop.hu`) 2. Open the [Inbox](https://molin.ai/app/inbox) in Molin and look for the new conversation If nothing arrives within a couple of minutes, double-check that the destination matches your Molin inbound address exactly. ## Reference For UNAS's own documentation, see [Email továbbító](https://unas.hu/tudastar/hosting/email-tovabbito) (Hungarian). # Forward Yahoo Mail to Molin Source: https://docs.molin.ai/home/channels/email/forwarding/yahoo Set up Yahoo Mail forwarding so customer emails reach your Molin inbound address, including the Yahoo Mail Plus and AOL limitations. This guide covers Yahoo Mail. Yahoo's forwarding only delivers *new* emails after it's set up — past emails aren't backfilled. Yahoo Mail's automatic forwarding requires a **Yahoo Mail Plus** subscription and isn't offered in every locale. AOL Mail (owned by Yahoo) doesn't expose automatic forwarding at all per [AOL's current help](https://help.aol.com/products/new-aol-mail) — if you're on AOL Mail, use a Gmail/Microsoft 365 account as the forwarding source instead, or upgrade to Yahoo Mail Plus on a Yahoo address. ## Prerequisites * A Yahoo Mail Plus account * Your **Molin inbound address** from the email setup wizard ## Yahoo Mail The exact path differs slightly between the new and older Yahoo Mail interfaces: 1. Open [Yahoo Mail](https://mail.yahoo.com/) and sign in 2. Click the **More options** icon (or the **Settings** gear, depending on UI version) in the top-right, then choose **Settings** 3. In the older interface only, click **More Settings** at the bottom of the panel 4. Choose **Mailboxes** from the left sidebar 5. Click your primary account name under **Mailbox list** 6. Scroll to **Auto-forwarding** (newer UI) or **Forwarding** (older UI) and paste your Molin inbound address into the field 7. Click **Verify** — Yahoo sends a verification email to your Molin address 8. In the Molin [Inbox](https://molin.ai/app/inbox), open Yahoo's email and click the verification link 9. Back in Yahoo settings, the forwarding status flips to **Verified**. Save changes ## Verification Yahoo forwarding only activates after you click the verification link. The Molin email setup wizard at [molin.ai/app/channels/email](https://molin.ai/app/channels/email) surfaces incoming verification emails as a clickable confirmation button — use it for the fastest path. ## Reference For Yahoo's own documentation, see [Enable automatic email forwarding in New Yahoo Mail](https://help.yahoo.com/kb/SLN36684.html) (newer interface) or [Enable automatic email forwarding in Yahoo Mail](https://help.yahoo.com/kb/SLN29133.html) (older interface). AOL Mail has no equivalent feature per the [AOL Mail Help hub](https://help.aol.com/products/new-aol-mail) — its automatic forwarding section is absent and the help search returns only filter-based organisation, not destination forwarding. # Facebook Messenger Source: https://docs.molin.ai/home/channels/facebook-messenger Connect your Facebook Page so Molin AI answers Messenger conversations automatically, with every chat visible in your shared Inbox. Connect your Facebook Page to Molin so your AI chatbot can automatically respond to Facebook Messenger conversations. Your customers get instant replies, and you can monitor all conversations from the [Inbox](https://molin.ai/app/inbox). The Facebook Messenger integration is available on the **Startup** plan and above. ## Prerequisites Before connecting, make sure you have: * A **Facebook Page** for your business * Admin access to the Facebook Page you want to connect * A Molin AI widget on the **Startup** plan or higher ## Connect your Facebook Page 1. Open the [Integrations](https://molin.ai/app/integrations#facebook-messenger) page and expand the **Facebook Messenger** section 2. Click **Authorize page access** 3. You will be redirected to Facebook to authorize Molin AI 4. Select the Facebook Pages you want to make available, then confirm the permissions 5. After authorization, you will be redirected back to the dashboard 6. Use the dropdown to select which Facebook Page to connect 7. Click **Save** If you manage multiple Facebook Pages, you can authorize all of them at once. Only the page you select in the dropdown will be actively connected to Molin. ## How it works Once connected: * When a customer sends a message to your Facebook Page via Messenger, Molin AI automatically responds using the same AI and instructions that power your web widget * All Messenger conversations appear in your [Inbox](https://molin.ai/app/inbox) alongside web chat and other channels * If live chat is enabled, your support agents can take over Messenger conversations at any time ## Change the connected page 1. Open the [Integrations](https://molin.ai/app/integrations#facebook-messenger) page and expand the **Facebook Messenger** section 2. Select a different page from the dropdown 3. Click **Save** If the page you want is not in the dropdown, click **Can't find your page? Authorize again** to re-run the authorization flow and grant access to additional pages. ## Disconnect your page 1. Open the [Integrations](https://molin.ai/app/integrations#facebook-messenger) page and expand the **Facebook Messenger** section 2. Clear the page selection in the dropdown (select nothing) 3. Click **Save** After disconnecting, Molin will stop responding to Messenger conversations on that page. ## Troubleshooting ### My page doesn't appear in the dropdown * Click **Can't find your page? Authorize again** to re-authorize with Facebook * Make sure you have **Admin** access to the page * During the Facebook authorization flow, ensure you select the page you want to connect ### Messages are not being received * Check that the correct page is selected and saved on the [Integrations](https://molin.ai/app/integrations#facebook-messenger) page * Try disconnecting and reconnecting the page to refresh the authorization * Ensure you have not revoked Molin's access in your [Facebook Business settings](https://business.facebook.com/settings/) If you need further help, please contact us here. # Instagram DMs Source: https://docs.molin.ai/home/channels/instagram Connect your Instagram Professional account so Molin AI answers Direct Messages automatically, with every chat visible in your shared Inbox. Connect your Instagram Professional account to Molin so your AI chatbot can automatically respond to Instagram Direct Messages. Your customers get instant replies, and you can monitor all conversations from the [Inbox](https://molin.ai/app/inbox). The Instagram integration is available on the **Startup** plan and above. ## Prerequisites Before connecting, make sure you have: * A **Professional** Instagram account (Business or Creator). [How to switch to a Professional account](https://help.instagram.com/502981923235522) * A Molin AI widget on the **Startup** plan or higher You do **not** need a Facebook Page linked to your Instagram account. The Instagram integration uses Instagram Business Login, which connects directly to your Instagram Professional account. ## Connect your Instagram account 1. Open the [Integrations](https://molin.ai/app/integrations#instagram) page and expand the **Instagram** section 2. Click **Connect Instagram account** 3. You will be redirected to Instagram to authorize Molin AI 4. Grant the requested permissions so Molin can read and respond to your DMs 5. After authorization, you will be redirected back to the dashboard Once connected, the Instagram section shows your linked account name with a "Connected" status. ## How it works Once connected: * When a customer sends you an Instagram DM, Molin AI automatically responds using the same AI and instructions that power your web widget * All Instagram conversations appear in your [Inbox](https://molin.ai/app/inbox) alongside web chat and other channels * If live chat is enabled, your support agents can take over Instagram conversations at any time ## Disconnect your account 1. Open the [Integrations](https://molin.ai/app/integrations#instagram) page and expand the **Instagram** section 2. Click **Disconnect** 3. Confirm the disconnection After disconnecting, Molin will stop responding to Instagram DMs. ## Troubleshooting ### Authorization fails * Verify your Instagram account is a **Professional** account (Business or Creator), not a Personal account * Try logging out of Instagram in your browser, then attempt authorization again * Clear your browser cache and cookies if the issue persists ### Messages are not being received * Check that your account is still connected on the [Integrations](https://molin.ai/app/integrations#instagram) page * Disconnect and reconnect your account to refresh the authorization If you need further help, please contact us here. # Custom actions Source: https://docs.molin.ai/home/chatbot/custom-actions Let your AI take real actions in your business: issue coupons, book callbacks, look up orders, and anything else you connect to it. Custom actions let your AI do real things during a chat, not just answer questions. You set up an action in the dashboard, connect it to your own system, and the AI uses it when a customer needs it. This part needs a developer on your side because you (or someone on your team) needs to build the endpoint that the AI calls. Find it in your dashboard under [**Chatbot → Actions**](https://molin.ai/app/actions). ## Examples * Give a discount code when a customer asks for one. * Look up an order by email and order number. * Send a callback request to your CRM or Slack. * Check if something is in stock in your warehouse system. * Cancel or change an order. * Add the customer to your newsletter list (Klaviyo, Mailchimp, etc). ## How it works 1. You set up the action in the dashboard: a name, a description, the info the AI should collect (for example, the customer’s email or an order number), and whether your endpoint expects a POST or GET request. 2. The AI decides when to use the action based on the description you wrote. 3. Molin calls your endpoint with that info, as a JSON body for POST or as query params/URL segments for GET. 4. Your endpoint sends back a short answer. 5. The AI uses the answer to reply to the customer. ```mermaid theme={null} sequenceDiagram Customer->>Molin AI: "Where is order #1234?" Molin AI->>Your API: POST /lookup-order { orderNumber: "1234" } Your API->>Molin AI: { status: "Shipped", eta: "Tomorrow" } Molin AI->>Customer: "Your order shipped and arrives tomorrow." ``` The action description is what the AI reads to decide *when* to use it. Be specific. Write "Look up an order status when the customer asks about delivery" instead of just "Order lookup". ## Setup See the [Custom actions API reference](/apis/custom-actions) for the full request/response spec, security headers, and code examples. ## Best practices * **One action, one job.** Set up a separate action for each task instead of one big one that does everything. * **Send back short, clear text** from your endpoint. The AI will turn it into a reply to the customer. * **Don’t send sensitive info back.** The customer might see it in the answer. * **Test it in the chat preview** before turning it on for real customers. # Image search Source: https://docs.molin.ai/home/chatbot/image-search Let customers attach photos in the chat so the AI can identify products, answer questions about a scene, and read receipts. Customers can attach photos to any chat message. The AI reads the image alongside the text, so a shopper can send a picture of a product and ask "do you have this?" instead of guessing at search keywords. Image search is on by default for every widget. There is nothing to enable or configure. ## What customers can do with it * **Find a specific product.** A photo of an item they own, or spotted elsewhere, matched against your catalog. * **Ask about a whole scene.** A picture of a room or an outfit, answered with several products that work together. * **Get recommendations.** "What goes with this?" against a photo, answered with compatible items from your catalog. * **Support with proof.** A photo of a damaged item, or of a receipt or invoice, so the AI can see the problem instead of asking the customer to describe it. The AI treats an image as part of the conversation, so follow-up questions like "do you have it in blue?" keep working without re-attaching the photo. ## Attaching images In the chat widget, customers add images three ways: * the attachment button in the message box * drag and drop onto the chat * paste from the clipboard On phones, the attachment button opens the camera or photo library, so a shopper can photograph something and search for it without leaving the chat. ## Limits | Limit | Value | | ------------------ | ------------------------------- | | Images per message | 3 | | Maximum file size | 10 MB per image | | Accepted formats | JPEG, PNG, GIF, WebP, SVG, HEIC | Files that are empty, too large, or of an unsupported type are rejected in the widget before any upload starts. HEIC is the default camera format on iPhones, so photos taken in the chat upload without conversion. ## How images are processed 1. The widget uploads the file through Molin's upload endpoint. 2. Molin stores it and records it against the conversation. 3. The AI receives a resized copy of the image, at most 2048×2048. 4. The widget and your [inbox](/home/inbox/inbox) display a smaller copy, at most 800×800. Both copies are generated on demand from the original upload and cached at the edge, so a customer on a slow connection doesn’t download a full-resolution photo to see their own attachment. Support agents can attach images too, when replying from the inbox. Those follow the same path and the same limits. ## Content Security Policy If your shop sends a [Content Security Policy](/home/general/content-security-policy), image search needs no extra origins. Uploads and image display both go through `widget.molin.ai`, which the documented `connect-src` and `img-src` entries already allow. ## Data retention Images belong to the conversation they were sent in and follow the same lifecycle: * Attachments a customer selects but never sends are deleted when they start a new chat. * Sent images stay with the conversation history so you can see what the customer sent when you review it in the inbox. * When a conversation is erased, either through data retention or a GDPR erasure request, its images are deleted from storage and purged from the cache. ## Frequently asked questions Image search works in the web chat widget and in the inbox. Photos sent through [Messenger](/home/channels/facebook-messenger) and [Instagram](/home/channels/instagram) aren’t read by the AI today. Please give our team a nudge and we will prioritize it for a future update. Your product catalog, as synced from your platform or [product feed](/home/general/product-feeds). It recommends only products you actually sell, the same as any other answer. Yes, up to 3 per message. The AI considers them together, so a shopper can send a few references and get one answer covering all of them. Yes. This is what makes receipts, invoices, and order confirmations useful in a support conversation. Accuracy depends on how legible the photo is. # Lead collection Source: https://docs.molin.ai/home/chatbot/lead-collection Capture a customer's name, email, and phone mid-conversation, save the lead, notify your team, and push it straight to your CRM. When the AI can’t fully answer a question (or the customer wants a callback) Molin can ask for their contact details, save the lead, and notify you. Find it in your dashboard under [**Chatbot → Actions → Lead collection**](https://molin.ai/app/actions). ## When the AI collects a lead The AI asks for contact details when: * The customer asks to speak to a human or requests a callback. * The customer wants details about a specific order (and isn’t logged in). * You explicitly instruct it to (e.g. "Always ask for an email before quoting custom work"). ## What gets captured * **Customer name** * **Email or phone** (whichever the customer gave). * **What they need help with** (their reason for getting in touch). * **Priority**: low, normal, or urgent, based on the conversation. The full chat is also kept and you can read it in the Inbox. ## Where leads go * **Dashboard**: see all leads under [**Inbox**](https://molin.ai/app/inbox) by clicking the **Leads** filter. * **Email**: Molin sends a notification to the email you set under [**Chatbot → Personality → Contact details**](https://molin.ai/app/personality). # Personality & instructions Source: https://docs.molin.ai/home/chatbot/personality Tell the AI how to sound, what to say, and what to avoid, so Molin feels like your brand instead of a generic chatbot. Personality is where you tell the AI what to do, what to avoid, and how to sound. This is how you make Molin feel like *your* brand and not a generic chatbot. Find it in your dashboard under [**Chatbot → Personality**](https://molin.ai/app/personality). ## What you can control * **How the AI sounds**: formal, casual, playful, friendly. * **What language it replies in**: always English, always Hungarian, or match whatever the customer used. * **What it should and shouldn’t say**: for example, never recommend competitors, always mention your loyalty program, never promise a delivery date. * **When to bring in a human**: tell the AI when to ask the customer for contact details and pass it to your team. * **What to do with off-topic questions**: how to reply when someone asks something not related to your shop. ## How to write good instructions Use short, plain-sentence rules. One instruction per line works best. ``` You are a friendly assistant for Acme Shop. Always greet the customer by name if you know it. Never discuss our suppliers or pricing margins. If the customer asks about returns, always link to /returns. If the customer is upset, offer to connect them to a human agent. Reply in the same language the customer uses. ``` ## Limits * Up to **1,500 lines** of instructions. * Up to **5,000 characters** per line. ## Best practices * **Be specific.** "Be helpful" does nothing. Something like "Always suggest the warranty add-on for electronics" works much better. * **Show examples.** Include one or two good answers in your instructions so the AI knows what you want. * **Test and adjust.** Try it in the chat preview, spot a bad answer, add a new rule, and try again. * **Don’t repeat product info here.** The AI already knows your products from the feed. Use Personality to control how the AI behaves, not to list product details. # Stock and availability Source: https://docs.molin.ai/home/chatbot/stock-availability Control whether the AI tells customers how many units are left, and let it check live stock levels directly on your Shopify store. By default the AI only recommends products that are in stock, and it never states how many units you have. You can also let it tell customers **how many units are left** and, on Shopify, **check stock live** at the moment they ask. Both are off by default. Contact our customer support team to switch them on for your shop. ## Where stock counts come from | Platform | Stock count | | -------------------------------------------- | --------------------------------------------------------------- | | [Shopify](/home/platforms/shopify) | Units on hand per variant | | [Shoprenter](/home/platforms/shoprenter) | Summed across your stock records | | [UNAS](/home/platforms/unas) | Summed across your stock records, when inventory tracking is on | | [Shoper](/home/platforms/shoper) | Units on hand | | [Product feeds](/home/general/product-feeds) | Only when your feed carries a numeric stock value | Most feed formats state only whether an item is in stock, not how many. If yours includes a number, Molin keeps it. Some products have no count at all: made-to-order goods, or items where you have inventory tracking switched off. The AI treats these as available to order rather than sold out, and never quotes a number for them. ## Showing counts to customers Choose how much the AI discloses: * **Hidden** (default): the AI says whether an item is in stock, never how many. * **Only when low**: the AI says "only 3 left" below your threshold (5 by default), and just "in stock" above it. Good for creating urgency without publishing your inventory. * **Exact**: the AI states the number whenever it has one. Anyone can chat with your widget, including your competitors. **Exact** publishes your inventory levels to whoever asks, so most shops should use **Only when low**. ## Live stock checks on Shopify Product data syncs on a schedule, so a count can be a few hours old. With live stock checks enabled, the AI queries Shopify directly when a customer explicitly asks whether something is still available, and answers with the figure at that moment. The AI only does this when asked a direct availability question: * How many are left? * Is this still in stock? * Has it been restocked? It doesn't check on every product answer, so your Shopify API usage stays low. Live checks are available on Shopify only. On other platforms the AI answers from the last sync instead. ## Frequently asked questions Not by default. Turn on **Let the AI recommend out of stock products** under [**Products → Settings**](https://molin.ai/app/products) if you still take orders for sold-out items. Product data syncs on a schedule that depends on your plan, so counts reflect your catalog as of the last sync. Enable live stock checks on Shopify for a real-time figure. No. Molin only reads stock. It never writes to your inventory. # Customers Source: https://docs.molin.ai/home/crm/customers Turn chats into a lightweight CRM: track known customers with their orders, ticket history, follow-up status, notes, and tags. The Customers page turns your chats into a lightweight CRM. Instead of a list of separate conversations, you see profiles grouped by known contact identity, so you can track who you are talking to and what you have discussed before. Find it in your dashboard under [**Customers**](https://molin.ai/app/customers). ## How customers are grouped Every time the AI collects a customer's **email** or **phone** (through a chat, a lead, or an email reply), Molin links that conversation to a customer profile. * when an email is available, Molin recognises the person by email * when no email is available, Molin recognises the person by phone * a phone-only profile stays separate if an email becomes available later, which prevents shared household or office phone numbers from merging different people * conversations with no email or phone stay in the [Inbox](/home/inbox/inbox) but do not create a customer profile ## The customers list The list shows one row per customer, newest contact first. Each row shows: * **Customer**: name, email, and phone (whatever was collected) * **Activity**: when you last heard from them and how many tickets you have had * **Channels**: whether they reached you by web chat, email, Messenger, or Instagram * **Signals**: whether they left a **Lead** or have an **Order** * **Follow-up**: their current follow-up status, if set * **Tags**: any tags you added You can **search** by name, email, phone, or tag and filter customers by follow-up status. ## The customer profile Click any customer to open their profile: * a **header** with their name, email, phone, and totals (tickets, first contact, last contact) * recent **orders** from the connected store, when the store platform supports lookup by customer email * a **timeline** of every ticket they have had across web chat, email, Messenger, and Instagram, newest first, each linking straight into the [Inbox](/home/inbox/inbox) thread * a right-hand panel for tracking the relationship: ### Orders For Shopify, Shoprenter, and UNAS stores, the profile loads the customer's latest orders directly from the connected store. Expand an order to see its products and use **Track order** when the store supplied a valid tracking link. Order history requires an email address on the customer profile. The profile explains when the customer has no email, the store platform does not support customer order lookup, or the live store request fails. ### Follow-up status Set a status so nothing slips through the cracks: * **No follow-up** (default) * **Needs follow-up** * **Waiting on customer** * **Done** ### Notes Add free-text notes about a customer (for example "asked about a refund on order #1042, promised a callback"). Notes show who added them, are timestamped, and are shared with your team. ### Tags Add tags like `vip` or `wholesale` to group and recognise customers at a glance. Use the [Inbox](/home/inbox/inbox) to read and reply to individual conversations, and Customers to track the person across all of them. # Content Security Policy (CSP) Source: https://docs.molin.ai/home/general/content-security-policy Configure the Content Security Policy directives your site needs so the Molin AI widget can load its scripts, styles, and connections. ## What is Content Security Policy? Content Security Policy (CSP) is a security standard that helps prevent cross-site scripting (XSS) attacks by controlling which resources can be loaded on your website. If your site uses CSP headers, you'll need to configure them to allow the Molin AI widget to function properly. ## Required CSP directives | Directive | Value | Purpose | | ------------- | --------------------------------------------------------------------- | ------------------------------------ | | `script-src` | `'self' https://widget.molin.ai` | JavaScript execution for the widget | | `frame-src` | `'self' https://widget.molin.ai` | Iframes and embedded content | | `style-src` | `'self' 'unsafe-inline' https://widget.molin.ai` | Widget stylesheets and inline styles | | `connect-src` | `'self' wss://molin.ai wss://widget.molin.ai https://widget.molin.ai` | API and WebSocket connections | | `img-src` | `'self' https://widget.molin.ai` | Widget images and assets | | `media-src` | `https://widget.molin.ai` | Audio files for notifications | ## Complete CSP policy ``` Content-Security-Policy: script-src 'self' https://widget.molin.ai; frame-src 'self' https://widget.molin.ai; style-src 'self' 'unsafe-inline' https://widget.molin.ai; connect-src 'self' wss://molin.ai wss://widget.molin.ai https://widget.molin.ai; img-src 'self' https://widget.molin.ai; media-src https://widget.molin.ai; ``` ## Testing your CSP After implementing CSP headers: 1. Open your browser's developer console 2. Load a page with the Molin widget 3. Check for any CSP violation errors 4. Verify the widget appears and functions correctly # Dark mode customization Source: https://docs.molin.ai/home/general/dark-mode Enable and customize dark mode for your Molin AI chatbot so it stays easy on the eyes in low-light environments, on desktop and mobile. The dark mode feature allows you to provide a sleek, modern appearance for your Molin AI chatbot that's easier on users' eyes, especially in low-light environments. When enabled, your chatbot and popups automatically switch to a dark design. Dark mode is available for all plan types and works seamlessly across desktop and mobile devices. ## Enable dark mode ### Step 1: Access your widget settings 1. Log in to your [Molin AI dashboard](https://molin.ai/app) 2. Navigate to your chatbot's **Design** settings 3. Scroll to the **Appearance** section ### Step 2: Toggle dark mode 1. Find the **Dark mode** toggle switch 2. Click to enable dark mode for your chatbot 3. Save your changes ![Dark mode toggle in dashboard settings](https://imagedelivery.net/JWssb2diw2B-JHR2ojV3Ow/996fb37c-3730-4951-45d2-a46bea8e2900/w=800,h=600,fit=scale-down,q=75,dpr=1) ## How it works When dark mode is enabled, the chatbot and all popup elements automatically switch to a dark design with appropriate styling for low-light environments. ![Dark mode popup examples](https://imagedelivery.net/JWssb2diw2B-JHR2ojV3Ow/68dcfcb5-a0e5-4b56-ac24-2b0ccc414600/w=800,h=600,fit=scale-down,q=75,dpr=1) ## Best practices ### Brand consistency * Ensure your brand colors maintain sufficient contrast in dark mode * Test your widget on both light and dark website backgrounds * Consider your website's overall design when choosing colors # Elements Source: https://docs.molin.ai/home/general/elements Drop-in HTML tags for buttons, inputs, and typewriter animations, plus paste-and-edit recipes for review and product cards. Elements are prebuilt components you embed on your store with a single HTML tag. No JavaScript, no setup. They theme from their style attributes, with sensible defaults. Override any attribute when you want a different look. The [Elements admin page](https://molin.ai/app/elements) lets you tweak attributes in a live preview and copy the resulting HTML to paste into your store theme. Use it if you want to iterate on the look without editing your site between attempts. ## Shared style attributes Every component accepts these style attributes. Set them on the tag, or copy a pre-styled snippet from the [Elements admin page](https://molin.ai/app/elements), which fills in your brand color for you. Background color. Defaults to the Molin brand purple (`#601feb`). Snippets copied from the Elements admin page set this to your widget's brand color. Text and icon color. Defaults to white or black, whichever contrasts better with `bg`. Corner rounding preset. Padding and font size preset. Font weight for labels and headings so the component matches your store typography. ## Open the chat in fullscreen Every element that opens the chat (``, ``, and ``) accepts a `fullscreen` attribute. When present, clicking the element opens the chat window filling the whole screen on desktop. On mobile the chat is always fullscreen. ```html theme={null} Get help ``` When present, the chat opens filling the screen on desktop instead of the floating window. Mobile is always fullscreen. ## `` A call-to-action button. Opens the chat, optionally prefilling or auto-sending a message. The same tag doubles as a quick-question chip via the `variant`, `size`, and `icon` attributes, see the chip recipe below. ```html theme={null} Ask about this product ``` Chip configuration for FAQ rows: ```html theme={null} Returns ``` Text to prefill or autosend when the chat opens. When present, sends `message` immediately instead of just prefilling the input. Leading icon inside the button. Visual style. Padding and font size preset. Use `sm` for chip-style pills. The button's label is the inner text of the tag (the default slot). ## `` An input field with a send button. On submit, opens the chat with whatever the visitor typed. The same tag doubles as a product search bar via the `prefix` and `icon` attributes, see the second example below. ```html theme={null} ``` Product-search configuration: ```html theme={null} ``` Input placeholder text. Label on the submit button. Text prepended to the visitor's typed text before it is sent to the chat. Use it to turn an "Ask AI" input into a "Help me find" search prompt. Leading icon inside the input. When `true`, the typed text is sent immediately on submit. Set to `false` to only prefill it. Background color of the input field. Whether the input has a visible border. ## `` A search box over your catalog. Unlike ``, it doesn't open the chat: it queries your products through the [Search API](/home/general/search-api) and renders product cards on the page, so it can replace your store's own search. ```html theme={null} ``` Focusing the empty box offers the searches other shoppers on your store ran successfully. Typing filters that list in the browser, so no request goes out per keystroke. When a search finds nothing, the box offers the AI instead, which can answer questions keyword matching can't. Copy a pre-filled snippet from the [Elements admin page](https://molin.ai/app/elements), which fills in your widget ID and brand color for you. Which catalog to search. This is the only element that needs your widget ID, because it fetches its own results rather than going through the chat. Input placeholder text. Label on the submit button. How many products one search returns, between 1 and 60. Out-of-range values fall back to the default. Background color of the input field. ## `` An animated CTA that cycles through up to 3 messages with a typewriter effect. The motion draws attention and the rotating prompts teach visitors what the AI can answer. On click, opens the chat with the current message. ```html theme={null} ``` First message (always displayed). Second message to cycle through. Leave empty to only show message 1. Third message to cycle through. When `true`, the current message is sent immediately on click. Leading icon to the left of the animated text. Milliseconds per character when typing. Milliseconds per character when deleting. Milliseconds to hold the fully-typed message before deleting. ## Review card recipe A card with decorative stars that fits into a product review section. Visitors who want a summary of customer reviews tap the button and the chat opens with a ready-to-send question. Paste the snippet below into your product page and edit colors, copy, and spacing to match your store. ```html theme={null}

What do customers say?

Ask our AI for a summary of customer reviews

Ask about reviews
``` ## Promotional product card recipe A dark promotional card that slots into your product grid. Visitors tap the button and the AI helps them find what they need. Paste the snippet below into your grid and adjust copy, colors, or the icon to match your store. ```html theme={null}

Get personalized recommendations in seconds

Ask our AI
``` # Feed allowlisting Source: https://docs.molin.ai/home/general/feed-allowlisting Stop your security solution or WAF from blocking Molin, by allowlisting our static IPs so we can download your product feed. If you are using a security solution for your shop, it can block Molin from downloading your feed. ## Generic instructions Make sure that your feed is accessible from [our static IPs](/home/general/static-ips). Configuration can vary depending on your security solution, but generally, you can allowlist the IPs in your firewall or security settings. Only the feed URLs need to be allowlisted, not your entire domain. ## Cloudflare You can use a custom security rule to allowlist our IPs. 1. Navigate to the [Security rules](https://developers.cloudflare.com/security/rules/) page 2. Create a new **custom rule** 3. Add a check for field "URI Full" to be equal to your feed URL, e.g. `https://www.shop.com/google-products.xml` 4. Add a check for field "IP Source Address" to be in the list of [our static IPs](/home/general/static-ips) 5. Your expression preview should look similar to this: `(http.request.full_uri eq "https://www.shop.com/google-products.xml" and ip.src in {35.207.69.21 209.38.162.129})` 6. Select the "skip" action and skip ALL components Example: ![](https://imagedelivery.net/JWssb2diw2B-JHR2ojV3Ow/2f0cf45c-8478-40a9-b38b-891bff265300/fit=scale-down,q=75) # Installing via Google Tag Manager Source: https://docs.molin.ai/home/general/google-tag-manager Embed the Molin AI widget with a Google Tag Manager custom HTML tag, and why a direct script embed is more reliable for most shops. Google Tag Manager is trivially blocked by ad blockers, which would prevent the widget from loading for those visitors. For the most reliable experience, embed the script directly into your website's HTML instead. ## Step-by-step instructions 1. Open [Google Tag Manager](https://tagmanager.google.com/) and click **Tags** in the left sidebar, then click **New**. 2. Click **Tag Configuration** and choose **Custom HTML** from the tag type list. 3. Paste the embed snippet from your [Molin dashboard](https://molin.ai/app/shop-ai/publish) into the HTML field. 4. Click **Triggering** and select **All Pages** (or whichever pages you want the widget on). 5. Give the tag a name, click **Save**, then click **Submit** in the top-right corner to publish your changes. 6. Open your website and verify the widget appears in the bottom corner of the page. ## Verifying the installation After publishing, open your website and reload the page. The Molin widget should appear in the bottom corner within a few seconds. If it does not appear, click the **Preview** button in the top-right corner of GTM to open the debugger and confirm the tag is firing, then double-check that the widget ID in the snippet matches the one in your [Molin dashboard](https://molin.ai/app/shop-ai/publish). # Available languages Source: https://docs.molin.ai/home/general/languages Molin detects a customer's language automatically and switches mid-conversation. See the full list of languages it understands and speaks. Molin is revolutionizing customer interactions with its advanced language detection. Not only can it instantly recognize a customer's preferred language from the start, but it also boasts the impressive ability to seamlessly handle issues across a staggering 90+ languages. What's even more remarkable is Molin's adaptability during live conversations; if a customer decides to switch languages midway, Molin effortlessly transitions with them, ensuring uninterrupted and smooth communication. * Afrikaans * Albanian * Amharic * Arabic * Armenian * Azerbaijani * Basque * Belarusian * Bengali * Bosnian * Bulgarian * Catalan * Cebuano * Chichewa * Chinese (Simplified) * Chinese (Traditional) * Corsican * Croatian * Czech * Danish * Dutch * English * Esperanto * Estonian * Filipino * Finnish * French * Frisian * Galician * Georgian * German * Greek * Gujarati * Haitian Creole * Hausa * Hawaiian * Hebrew * Hindi * Hmong * Hungarian * Icelandic * Igbo * Indonesian * Irish * Italian * Japanese * Javanese * Kannada * Kazakh * Khmer * Korean * Kurdish (Kurmanji) * Kyrgyz * Lao * Latin * Latvian * Lithuanian * Luxembourgish * Macedonian * Malagasy * Malay * Malayalam * Maltese * Maori * Marathi * Mongolian * Myanmar (Burmese) * Nepali * Norwegian * Pashto * Persian * Polish * Portuguese * Punjabi * Romanian * Russian * Samoan * Scots Gaelic * Serbian * Sesotho * Shona * Sindhi * Sinhala * Slovak * Slovenian * Somali * Spanish * Sundanese * Swahili * Swedish * Tajik * Tamil * Telugu * Thai * Turkish * Ukrainian * Urdu * Uzbek * Vietnamese * Welsh * Xhosa * Yiddish * Yoruba * Zulu # Loading behavior Source: https://docs.molin.ai/home/general/loading-behavior The Molin AI widget loads after everything else on your page, so your product pages, images, and checkout stay fast. ## How the widget loads The Molin AI widget loads after everything else on your page finishes, because your product pages, images, and checkout matter more. The widget waits for the browser's `load` event, then starts after a short delay. It won't appear until images, stylesheets, fonts, and every other resource finish downloading. ## Why it works this way * **Your store comes first.** Customers browse and buy, so the chat widget should never slow that down. * **Better Core Web Vitals.** Deferring the widget keeps your Largest Contentful Paint (LCP) and other metrics where they were. * **No layout shifts.** The widget appears smoothly after the page renders, so your layout doesn't jump. ## What this means in practice On fast sites, the widget appears right after the page loads. On slower sites with heavy images or third-party scripts, it waits for those to finish first. Large unoptimized images or slow third-party scripts delay the widget too. Speed up your site and the widget appears faster. ## Troubleshooting If the widget takes too long to appear: 1. **Check your page load time.** Open DevTools, go to the **Network** tab, and check the total load time. The widget waits for that to finish. 2. **Look for slow resources.** Sort network requests by duration to find bottlenecks, because large images and slow third-party scripts usually cause them. 3. **Optimize slow assets.** Compress images, lazy-load below-the-fold content, and defer non-essential scripts to speed up the page. # Product Feeds Source: https://docs.molin.ai/home/general/product-feeds Product feeds keep your AI in sync with your catalog, pricing, and availability. See supported formats, authentication, and troubleshooting. Product feeds allow Molin to automatically sync your product catalog and keep your AI assistant up to date with the latest product information, pricing, and availability. ## Supported feed formats Molin supports the following feed formats: * [Google Shopping feed](/home/platforms/google-shopping-feed) (XML/CSV) * [Árukereső/Compari feed](/home/platforms/arukereso-compari-feed) (XML) * [Prefixbox feed](/home/platforms/prefixbox-feed) (JSON) * [Vector Webshop feed](/home/platforms/vector-webshop-feed) (XML) * Heureka XML * JSON (schema.org format) ## Feed authentication You can protect your feed with one of the following authentication methods: * **Basic Auth**: standard HTTP Basic Authentication with username and password * **Bearer token**: OAuth-style Bearer token authentication * **Custom header**: any custom HTTP header for authentication Please reach out to our customer support team to set up feed authentication. ## Feed requirements Your product feed should include at minimum: * Link * Price * Title * Description We strongly recommend including additional attributes like: * Availability * Images If your feed carries a numeric stock value rather than just in stock/out of stock, Molin keeps the number. See [Stock and availability](/home/chatbot/stock-availability) for what the AI does with it. ## Product field limits Molin enforces character limits on product data to ensure optimal performance and consistent AI responses. Fields exceeding these limits are automatically truncated. ### Core product fields | Field | Character limit | | ------------ | --------------- | | Title | 100 | | Price | 20 | | Description | 4,000 | | Product ID | 100 | | GTIN | 100 | | Availability | 50 | ### Product attributes | Field | Character limit | | --------------- | --------------- | | Attribute name | 100 | | Attribute value | 200 | ### Media and categorization | Field | Item limit | | ---------- | -------------------------------------------------- | | Attributes | 20 per product (additional attributes are ignored) | | Categories | 5 per product (additional categories are ignored) | | Images | 5 per product (additional images are ignored) | ## Feed updates Molin automatically checks your feed for updates regularly to keep your product information current. The frequency depends on your plan. ## Platforms supported without a custom feed You don't need a custom feed if you connected Molin to one of the supported e-commerce platforms: * [Shopify](/home/platforms/shopify) * [Shoprenter](/home/platforms/shoprenter) * [UNAS](/home/platforms/unas) * [WooCommerce](/home/platforms/woocommerce) ## Troubleshooting If Molin cannot access your feed, check: * The feed URL is publicly accessible from [our static IPs](/home/general/static-ips) * Your security solution is not blocking our requests (see [Feed allowlisting](/home/general/feed-allowlisting)) * The feed format is valid and follows the expected schema * Authentication credentials are correct (if using feed authentication) # Programmatic chat API Source: https://docs.molin.ai/home/general/programmatic-chat-api Open the chat from your own JavaScript, or wire up any image, banner, or custom button on your page with an onclick handler. Need to open the chat from your own JavaScript or from an existing element on your page (an image, a banner, a custom-styled button)? Use the programmatic API on the embedded widget element. If you just want a "Chat with us" button, paste the prebuilt [``](/home/general/elements#molin-shop-ai-button) instead. It is one HTML tag, no JavaScript, and you style it with a single `bg` attribute. Use this page when you need to wire up something custom. ## API The embedded widget element exposes two methods you can call from anywhere on the page: * `document.querySelector('molin-shop-ai').openChat()` opens the chat window * `document.querySelector('molin-shop-ai').closeChat()` closes it For sending a message at the same time, see [Send message programmatically](/home/general/send-message). ## Wire up your own button Wrap any element in an `onclick` that calls `openChat()`: ```html theme={null} ``` Style it however you want, the API is independent of the markup: ```html theme={null} ``` ## Make an existing element clickable If you already have an image, banner, or text block you want to use as the trigger, wrap it in an anchor that calls `openChat()`: ```html theme={null} ``` ## Related * [Elements](/home/general/elements) — drop-in HTML tags including the prebuilt chat button * [Send message programmatically](/home/general/send-message) — open the chat AND deliver a message in one call * [Show/Hide widget](/apis/experimental/show-hide-widget) — control widget visibility # Search API Source: https://docs.molin.ai/home/general/search-api Query your Molin-indexed catalog from your own storefront code, using the same public read-only endpoints the search box calls. The Search API returns products from the catalog Molin already indexed for your chatbot. Text queries combine semantic intent with keyword matching. It powers [``](/home/general/elements), and you can call it directly when you want to build your own search or category UI. All three endpoints are public, read-only, and need no API key: the widget ID identifies the catalog, and shoppers call them straight from the browser. Call `widget.molin.ai`, never `molin.ai`. Keeping every widget request on one origin means you don't have to add another origin to your [Content Security Policy](/home/general/content-security-policy). ## `GET /v1/search` ```bash theme={null} curl "https://widget.molin.ai/v1/search?widgetId=abc12345&q=winter%20jacket&limit=12" ``` Your widget ID, which selects the catalog to search. The search text. Omit it to list the catalog, which is what a category page needs. Up to 10 product-attribute filters. Each filter has a `key` and `value`, and the whole array is JSON-encoded. Use the stable keys returned by `/v1/search/facets`: `brand`, `category`, `color`, `size`, `material`, or `gender`. Existing integrations can continue to send a raw feed attribute key. A `category` value matches that category and everything below it, so filtering on `Footwear` also returns products filed under `Footwear > Running Shoes`. Build a category page from whichever level you want to show, rather than listing every child. Every other key matches the value itself. Lowest price to include. Highest price to include. Three-letter currency code for the price filters. Sort order. Omit it to sort by relevance. Products per page, from 1 through 60. Products to skip, up to 500. The ranker scores `limit + offset` candidates, so deep paging is bounded deliberately. ### Response ```json theme={null} { "results": [ { "url": "https://store.example/products/alpine-winter-jacket", "title": "Alpine Winter Jacket", "price": "199.00 EUR", "originalPrice": "249.00 EUR", "priceAmount": 199, "image": "https://store.example/cdn/jacket.jpg", "sku": "AWJ-001", "gtin": "5901234123457", "storefrontProductId": "8123456789", "stockQuantity": 14 } ], "total": 1, "exhausted": true } ``` Matching products in ranked order. `originalPrice` is empty when the source didn't provide a price before the discount. `priceAmount` and `stockQuantity` are `null` when the source data didn't provide them. For a text query, the number of ranked candidates. For a filter-only listing, the full number of matches before `limit` and `offset`. `true` when this page reached the end of the matches, so there is no next page to request. ## `GET /v1/search/facets` Returns the stable filters available for one catalog. Molin groups equivalent source fields such as `Color`, `Colour`, and `Szín` under `color` without renaming or changing the feed data. Values stay exactly as the feed supplied them. ```bash theme={null} curl "https://widget.molin.ai/v1/search/facets?widgetId=abc12345" ``` Your widget ID. ### Response ```json theme={null} { "facets": [ { "key": "color", "values": ["Black", "Fekete", "Blue"] }, { "key": "size", "values": ["S", "M", "L"] } ] } ``` Available `brand`, `category`, `color`, `size`, `material`, and `gender` filters. Each entry contains the most common values from the catalog. Store-specific fields outside this reviewed list are not exposed here. ## `GET /v1/search/suggest` Returns the whole suggestion set for a widget in one response. Fetch it once, then filter it in the browser as the shopper types, rather than requesting per keystroke. ```bash theme={null} curl "https://widget.molin.ai/v1/search/suggest?widgetId=abc12345" ``` Your widget ID. ### Response ```json theme={null} { "queries": ["winter jacket", "ski gloves"], "products": [ { "title": "Alpine Winter Jacket", "url": "https://store.example/products/alpine-winter-jacket", "image": "https://store.example/cdn/jacket.jpg", "price": "199.00 EUR", "originalPrice": "249.00 EUR" } ] } ``` Searches other shoppers on your store ran and got results for. Searches that always came back empty are excluded, so a suggestion never leads to a dead end. A search only appears once at least two different shoppers ran it. Newest products with their image and prices, as a starting point for a store with no search history yet. `originalPrice` is empty when no discount price was supplied. ## Caching and limits Search responses are cacheable for 60 seconds and revalidate in the background for a further 5 minutes. Facets and suggestions are cached for 5 minutes and can still be served for a week while they refresh in the background, because they move slowly and slightly stale data is harmless. Search is rate limited per IP. Repeated identical searches are usually served from the edge cache without reaching our worker at all. ## Errors All three endpoints answer `400` for a missing or unknown widget ID and for any parameter outside the ranges described earlier, with no body. Treat a rejection as a bug in the request rather than something to retry. # Send message programmatically Source: https://docs.molin.ai/home/general/send-message Use the openChat API to programmatically open the chat window and send a message on the customer's behalf from your own code. ## Overview The `openChat` API allows you to programmatically open the chat window and send a message on behalf of the user. This is useful for: * Sending automated support requests based on user actions * Creating contextual help buttons that send specific inquiries * Triggering chat conversations from forms, errors, or page events * Automating customer service workflows For controlling widget visibility, see [Show/Hide Widget](/apis/experimental/show-hide-widget). **No code required?** You can also open the chat via URL parameters without any JavaScript. See [Open chat via URL](/home/general/url-prefill) for a simple way to create links for marketing campaigns, emails, and QR codes. ## Method The widget exposes this method for opening the chat: ```javascript Open chat with optional message, auto-send, and fullscreen control theme={null} window.Molin.openChat({ message, autoSend, fullscreen }); ``` ### Alternative method (web component) You can also use the web component selector: ```javascript Open chat using web component selector theme={null} document.querySelector('molin-shop-ai').openChat({ message, autoSend, fullscreen }); ``` ### Parameters Optional configuration object. Can be omitted entirely to simply open the chat without any message. When provided, can contain the following optional properties: The message to send when opening the chat. If omitted, the chat opens without any pre-filled message. Whether to automatically send the message. When `false` (default), the message will only be prefilled in the input field for the user to review and send manually. When `true`, the message is sent immediately. Whether to open the chat window filling the whole screen on desktop. When `false` (default), the chat opens in the normal floating window. On mobile the chat is always fullscreen regardless of this setting. **Valid function calls:** * `openChat()` - Opens chat without any message * `openChat({ message: "Hello" })` - Opens chat with pre-filled message (not sent) * `openChat({ message: "Hello", autoSend: true })` - Opens chat and sends message immediately * `openChat({ fullscreen: true })` - Opens chat fullscreen on desktop ## Open the launcher in fullscreen by default The `fullscreen` option above controls a single `openChat` call. To make the launcher (the floating bubble) and every other affordance open the chat fullscreen on desktop by default, set it once at the widget level. Set it before the widget loads via `window.molinSettings`: ```html theme={null} ``` Or add the `fullscreen` attribute to the embed tag: ```html theme={null} ``` A per-call `openChat({ fullscreen })` always wins over this default, so a specific button can still open the normal floating window. On mobile the chat is always fullscreen regardless of this setting. ## Examples ### Basic Usage - Open Chat Button ```javascript Basic Usage lines icon="js" theme={null} // Method 1: window.Molin.openChat(); // Method 2: document.querySelector('molin-shop-ai').openChat(); ``` ### Pre-filled Message - Product Inquiry ```javascript Pre-filled Message lines wrap icon="js" theme={null} // Method 1: window.Molin.openChat({ message: 'I have questions about the product pricing, availability, and features. Can you help me with that?', autoSend: false, }); // Method 2: document.querySelector('molin-shop-ai').openChat({ message: 'I have questions about the product pricing, availability, and features. Can you help me with that?', autoSend: false, }); ``` ### Auto-send Messages - Support Scenarios ```javascript Order Status Help lines wrap icon="js" theme={null} // Method 1: window.Molin.openChat({ message: "I need help with my order status. Can you please check what's happening with my recent purchase?", autoSend: false, }) // Method 2: document.querySelector("molin-shop-ai").openChat({ message: "I need help with my order status. Can you please check what's happening with my recent purchase?", autoSend: false, }) ``` ```javascript Return Item lines wrap icon="js" theme={null} // Method 1: window.Molin.openChat({ message: "I would like to return an item I purchased. Can you help me with the return process?", autoSend: false, }) // Method 2: document.querySelector("molin-shop-ai").openChat({ message: "I would like to return an item I purchased. Can you help me with the return process?", autoSend: false, }) ``` ```javascript Billing Questions lines wrap icon="js" theme={null} // Method 1: window.Molin.openChat({ message: 'I have a question about my billing. There seems to be an issue with my last payment.', autoSend: false, }); // Method 2: document.querySelector('molin-shop-ai').openChat({ message: 'I have a question about my billing. There seems to be an issue with my last payment.', autoSend: false, }); ``` ### Smart Search with AI Integration ```javascript AI Search Integration theme={null} // When user searches, open chat with search context const searchQuery = 'wireless headphones'; window.Molin.openChat({ message: `I'm looking for: ${searchQuery}. Can you help me find what I need?`, autoSend: false, }); ``` The search component integrates AI assistance with product search, allowing users to get personalized recommendations through the chat widget. ### Product Grid with AI Expert ```javascript Product Grid with AI Expert theme={null} // When user clicks on AI expert card window.Molin.openChat({ message: 'I need help finding the right product. Can you assist me with personalized recommendations?', autoSend: false, }); ``` The product grid includes an AI expert consultation option that opens the chat widget with a pre-filled message for personalized assistance. ## Interactive Playground Try the openChat API with this interactive example: This playground will only work if the Molin widget is installed on this documentation page. If you're viewing this in the documentation, it may show a warning that the widget is not loaded. ## Technical note The `openChat` method is only available after the widget script has loaded. The recommended approach is to listen for the [`molin:ready`](/home/marketing/javascript-events#molinready) event: ```javascript theme={null} window.addEventListener('molin:ready', () => { window.Molin.openChat({ message: 'Your message here' }); }); ``` Alternatively, you can check if `window.Molin` already exists: ```javascript theme={null} if (window.Molin && window.Molin.openChat) { window.Molin.openChat({ message: 'Your message here' }); } ``` # Static IPs Source: https://docs.molin.ai/home/general/static-ips The static IP addresses Molin uses to reach your server, so you can allowlist us for product feeds and API requests. ## UNAS Molin always uses the following IP for UNAS feeds and API requests: ``` 35.207.69.21 ``` ## Product feeds Molin downloads your product feed using the following IPs: ``` 35.207.69.21 209.38.162.129 ``` Make sure you allowlist all of them. ## Custom actions All calls on behalf of custom actions sent to your server are made through the following IPs: ``` 35.207.69.21 209.38.162.129 ``` Make sure you allowlist all of them. # Open chat via URL Source: https://docs.molin.ai/home/general/url-prefill Create links that open your chatbot with a message already typed in, using nothing but URL parameters on any page of your site. ## Overview You can open the chat with a prefilled message by adding URL parameters to any page on your website. This is perfect for: * Marketing campaigns with pre-written questions * Email links that open chat with context * QR codes that start specific conversations * Social media links with call-to-action messages * Support links with predefined inquiries This feature requires no JavaScript code. Just add parameters to your existing URLs. ## URL builder Use this tool to generate URLs for your campaigns: ## Parameters | Parameter | Required | Description | | ---------------- | -------- | ------------------------------------------------------ | | `molin_message` | Yes | The message to prefill in the chat input (URL-encoded) | | `molin_autosend` | No | Set to `1` to automatically send the message | ## URL encoding Special characters must be URL-encoded. Common encodings: | Character | Encoded | | --------- | ------- | | Space | `%20` | | `?` | `%3F` | | `&` | `%26` | | `=` | `%3D` | | `!` | `%21` | | `'` | `%27` | The URL builder above handles encoding automatically. For manual encoding, use JavaScript's `encodeURIComponent()` function. ## Examples ### Product inquiry Direct users to ask about a specific product: ``` https://yourstore.com/products/blue-sneakers?molin_message=Tell%20me%20more%20about%20these%20sneakers ``` ### Support request Create a support link in your email footer: ``` https://yourstore.com?molin_message=I%20need%20help%20with%20my%20order ``` ### Campaign landing page Add to marketing campaigns with a specific question: ``` https://yourstore.com/summer-sale?molin_message=What%20deals%20are%20available%20today%3F ``` ### Order tracking Link from order confirmation emails: ``` https://yourstore.com/account?molin_message=Where%20is%20my%20order%3F&molin_autosend=1 ``` ## Use cases ### Email marketing Add prefilled chat links to your email campaigns: ```html theme={null} Chat with us about deals ``` ### QR codes Generate QR codes that link to URLs with prefilled messages. When scanned, customers immediately start a relevant conversation. ### Social media ads Use prefilled URLs in your ad campaigns to start targeted conversations: * Facebook ads → product-specific questions * Instagram bio → general inquiries * Twitter links → support requests ### Website buttons Create buttons that open chat with context: ```html theme={null} Ask a question ``` For more control over chat behavior, see [Send message programmatically](/home/general/send-message) for the JavaScript API. ## Combining with existing URLs The parameters work with any existing URL on your site: ``` # Homepage https://yourstore.com?molin_message=Hello # Product page https://yourstore.com/products/item-123?molin_message=Is%20this%20in%20stock # With existing parameters https://yourstore.com/search?q=shoes&molin_message=Help%20me%20find%20shoes ``` ## Technical notes * Parameters are parsed when the widget script loads * The chat opens automatically when a valid `molin_message` is detected * After the chat opens, `molin_*` parameters are automatically removed from the URL (using `history.replaceState`) to keep URLs clean * Works with all widget embed methods (script tag, Shopify app, etc.) # Inbox Source: https://docs.molin.ai/home/inbox/inbox Read every chat your AI had across web, Messenger, Instagram, and email, assign chats to teammates, filter by channel or priority, and follow up on leads. The Inbox is where your team reads chats the AI has had, across web, Facebook Messenger, Instagram, and email (when those channels are turned on). Find it in your dashboard under [**Inbox**](https://molin.ai/app/inbox). ## Filters You can narrow down the list with these filters: * **Unread** chats only. * **Leads**: chats where the AI captured contact details. * **Live Chat**: chats where a human took over. * **Facebook**, **Instagram**, **Email**: only show chats from that channel. * **Assignee**: chats owned by you, by a specific teammate, or not yet assigned to anyone. See [Assignment](#assignment). * **Urgent Priority**, **Normal Priority**, **Low Priority**: by the priority the AI gave the chat. * **Test**: chats marked as test. You can also **search** by name, email, or phone, and view **archived** or **spam** chats. ## What you see in a chat Click any chat in the list to see: * The full message history. * The customer’s name, email, or phone (if collected). * The channel and the widget the chat came from. * A side panel showing lead details and live chat status. See [Live chat](/home/inbox/live-chat) for how to take over a chat as a human agent. ## Assignment Assign a chat to a teammate so everyone knows who owns it, and nobody answers the same customer twice.