Publish an integration in the Kommo marketplace

So, you’ve decided to publish a widget in our marketplace. Great!

Here are the steps for getting your integration to go live.

  1. Use the checklist below to make sure your integration meets all requirements
  2. Once it’s ready, submit it using your technical account by going to Settings > Integrations > Create Integration (Don’t have a technical account yet? Reach out our support team to get one).
  3. Our team will check your integration and give you feedback
  4. Congrats! Once you pass moderation, your widget will be published!

Technical account

A technical account is a Kommo account that allows you to publish integrations publicly in the Kommo marketplace and chat directly with our integrations team.
To get one, start by registering a new Kommo account. Then go to Chats > Mentions & team chats > Chat with support and send us a message that says “I need to chat with the integration department to create a technical account”.
Technical accounts are free. After creation, the account will expire after one month unless you publish your integration. After publishing your integration, the account will be renewed automatically.



Content and appearance

Support & localization



  • Your integration only collects data required for the integration to function
  • Your integration is easy to use, so that even non-technical users can understand how to:
    • enable and disable it
    • set it up
    • work with it
    • get support
  • Your integration does not mention or encourage buying Kommo subscriptions via Kommo Partners
  • Your integration is only installed when a user clicks the “Install” button (you have not added any virtual clicks that automatically install the widget)

Content and appearance

When creating an integration, you can upload a widget. A widget represents the UI integration. It might be used to display data in special areas, to interact with the user, or to adjust settings by administrators.

Widget name, teaser and description


  • Your widget has a name, which is
    • Not longer than 30 characters
    • Followed by the widget creator’s name, using the word “via”
      • Do:  WhatsApp via Zenvia
      • Don’t: WhatsApp
  • Your widget has a short teaser text, which is
    • Not longer than 60 characters
    • Explains why client should choose your integration
  • Your integration includes 1-2 paragraphs that describe its benefits, what it does and
    • Is not longer than 400 characters
    • Is written in a friendly, not technical way
    • Specifies which Kommo plan it requires (if it’s not available on all Kommo plans)
    • States the prices and currencies you support (if your integration is not free to use)

Widget UI copy

  • All text in your widget is user-friendly and understandable
  • You have provided messages for all potential errors, and they clearly explain the problem and what the user should do next

Branding images

The branding images you submit are shown in the marketplace and throughout the system to represent your widget.


  • You have provided branding images in PNG format in the following sizes:
    • 400×272 px*
    • 240×84 px*
    • 130×100 px
    • 108×108 px
    • 84×84 px

Does your integration feature another app? For example, a Telegram integration by your company AwesomeCode

  • Yes –  Then the branding image sizes marked with a star above (400×272 px and 240×84 px) must contain both your logo and the app’s logo
  • No – You are welcome to use your logo (optional), but the branding image should have its own identity


Slideshow images

Slideshow images are shown on the installation screen to show your integration in action

You have provided 1-5 slideshow images, which

  • Visually show the integration’s functionality, how the integration will be seen within Kommo, and its value to the user
  • Are good quality, and all compositions are clear and easy to see
  • Are 1188×616 pixels each in PNG format


Support & localization

Make sure your widget meets the requirements of this checklist in every language you submit.

  • Your widget is fully translated and contains no words in other languages
  • Your images do not contain words in other languages
  • You provided a link to a privacy policy in that language
  • Every link in your integration leads to a resource in that language
  • You offer human support in that language
    • If emailed, support will answer in that language
    • If called, support will answer in that language
  • Your widget takes local formatting into account, such as dates and times, numbers, phone numbers, local holidays, taxes, etc.
  • If your widget is not free:
  • You offer payment methods that work in North and South America and Europe
  • You can offer pricing in as many currencies as you want, but you at least support USD or Euros


The more readable and understandable your code is, the faster we will be able to check it.

Clean files

  • Your integration uses oAuth 2.0
  • You’ve deleted any files, pictures and scripts that are not used in integration
  • You’ve deleted all test data, debug, alerts, confirms or other development traces that are not used in the integration
  • Your localization files contain text in the appropriate language (for example, the i18n / en.json file does not contain Russian texts and does not mention .ru domains)
  • All links in en.json, es.json or pt.json files lead to sites in English, Spanish or Portuguese
  • All text files .js, .css, .json, .md, etc …) are in UTF-8 encoding without BOM, and also uses Unix line feed (\ n)

Interaction with the Kommo system

  • Your integration only makes changes to interfaces included in this list
  • The integration does not overlap Kommo controls or prevent users from interacting with Kommo
  • If it adds a page to the Settings section, then the page:
    • Has a unique name that does not mislead users
    • Is located after Kommo pages
  • Your widget is not positioned at the bottom of the screen to extend the interface vertically
  • If your integration uses drag & drop, the drop area is not located:
    • In the Kommo left menu bar
    • In the top right corner, where system controls such as settings, save, import, etc. are located


  • There is no manipulation with global CSS selectors
    Not allowed:
    input { background: red; }
  • Your widget does not use the classes as our system in css files
  • All styles are specified relative to the root widget selector
    • Allowed:
      .control-select { color: green }
    • Not allowed:
      .control-select { color: red }]
    • All style files required in documentation are included
  • All comments are relevant and explanatory
    • Allowed:
      // our signature color
    • Not allowed:
      // background: #fafafa;
    • Allowed:
      // get account id.
    • Not allowed:
      // var a = APP.constant(‘account’).id
  • Your contains the following files:
  • Your manifest.json file contains:
    Note: No need to specify the scope in the manifest (in the “locations” parameter) that you do not use in the integration.
  • If console.debug is used, you only log information important for the widget to work.
  • You do not use console.trace outside the following blocks:
    • a) catch block:
    • b) onRejected Promise Argument.
  • All variables in the widget are declared before use and the syntax is correct
  • The integration does not affect the data in the global variable Kommo
  • The integration does not use synchronous requests
  • The integration does not include external dependency files through document.createElement (‘script’) and does not insert this element directly into the head
  • All external dependencies are connected via requirejs in the dependency block in define.
  • Additional plugins or other external connections to the widget are not loaded from external resources with the exception of public libraries. Here is a list of external resources that is advisable to use when connecting libraries, as you cannot load your own libraries there:
    jQuery CDN
    And here’s a list of external resources that can be used when connecting libraries, but we will check each used library:
  • The integration does not connect styles from an external CDN if the requested file contains at least one global selector.
  • The integration uses only trusted CDS, if any.
  • The integration does not execute code obtained from the iFrame
  • The integration code is not based on and does not contain any switcher styles (switcher__on, switcher__off)