Only this pageAll pages
Powered by GitBook
Couldn't generate the PDF for 144 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

Beefree SDK

Getting Started

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Visual Builders

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

File manager

Loading...

Loading...

Server-side configurations

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Other Customizations

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

APIs

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Builder AddOns

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Form Block

Overview of Form Block

The Form Block within Beefree SDK allows you to easily create and integrate customizable forms into your application. This feature is particularly useful for capturing user information, feedback, and other data directly through interactive forms. With various pre-built templates and customization options, the Form Block is easy to integrate for developers and intuitive to use for end users.

Integrating the Form Block into page or popup builders is straightforward. The SDK provides intuitive methods to embed forms within your web pages or popups. With drag-and-drop functionality and predefined settings, adding a form to a design can be accomplished in just a few steps, enhancing workflow efficiency for your application's end users.

The Form Block supports a wide range of input types, such as text fields, radio buttons, checkboxes, and dropdown menus. This flexibility ensures that end users can gather the exact type of information they need from the form. Additionally, form submissions can be easily configured to trigger actions, such as email notifications or data storage, providing a robust and integrated data collection solution.

Learn more about to use and integrate Form Block in the following section:

Manage Subscriptions

This feature is visible to Beefree SDK account Owners.

Manage Subscriptions in the Console

We understand that each company has its own unique needs. For that reason, we offer the flexibility of adding multiple Beefree SDK subscriptions within the Developer Console. Through this option, you can take advantage of multiple subscriptions to our product for your teams, business units, and so on.

How to Add a New Subscription

You can create an additional subscription within the Beefree SDK Developer Console.

To achieve this, take the following steps:

  1. Log in to the

  2. Navigate to your dashboard

  3. Click Add new subscription on the upper right-hand side of the screen

  4. Type a name for your next subscription and click Next

  5. Choose a plan and click Select plan

  6. Confirm the plan you selected

  7. Finalize your additional subscription

Page Builder

An overview of page builder within Beefree SDK.

Building web pages with Beefree SDK

Beefree SDK Page Builder will help your customers create beautiful, responsive landing pages, complete with forms and embedded videos. Combined with our Email Builder, you’ll have the power to deliver to your customers a single, optimized user experience for designing both emails and web pages.

With the Page Builder, your customers can create landing pages and one page sites with

In addition, you will find exclusive features that make sense for web pages, such as forms, embedded videos, and the ability to paste scripts, like an embeddable SurveyMonkey or Typeform survey.

Here are a few examples of web pages your customers can build with:

  • Product showcase or teaser

  • Disclaimer (e.g. age verification)

  • Registration (e.g. events, gated content)

  • Newsletter subscription

  • Customer survey

  • Booking request

  • Portfolio

They can also create fantastic one page websites, i.e. sites where all the content usually spread in different pages fits nicely into an easy-to-scroll page, complete with menu and anchors to navigate it.

We are constantly improving the user experience: we see the Page Builder as a long-term, ongoing project at Beefree SDK.

Mime Types and Groups

MIME types are a standardized way to indicate the nature and format of a file, specifying what kind of data it contains. Groups are categories that aggregate these MIME types for simplified handling and management in applications like File manager. This organization allows for custom limitations and processing based on file type.

The following list shows which specific mime types are mapped to our group names for custom limitations on File manager.

Note: Beefree SDK does not manage heic files at this time.

Additional Considerations

When working with files, mime types and groups, ensure you consider the following:

  • The default maximum file size you can upload is 20MB.

  • If you upload an image wider than 1920 pixels, when the image is uploaded or imported, it will be resized to fit within 1920px. This may cause issues with the image's appearance, including colors that change and GIFs that lose frames. Ensure your images are no wider than 1920px to avoid these issues.

Learn more about .

Custom JavaScript Libraries Injection

Learn more about injecting custom JS libraries into your Beefree SDK integration.

This feature is available on the .

Custom JavaScript

Enterprise customers can request to inject external JavaScript libraries, like FullStory or Heap, into Beefree SDK when the integration is initialized as part of the .

Custom JavaScript requires a complete technical evaluation by the Beefree SDK development team. The assessment will undergo security, technical and compatibility assessments.

How it Works

Contact our Sales team and ask to run a script to get started with custom JS libraries injection. Once you contact us, we will take the following steps to complete your request:

  1. Our representative will forward your request to our development team

  2. The development team will review the script and approve it

  3. The script is enabled by our development team

Custom Sidebar Position

This feature is available on Beefree SDK only.

Overview

You can choose whether to display the builder sidebar on the left or on the right side of the screen.

Available positions:

  • left

  • right

Here is the same sample application, with the same template and same content element selected, and the sidebar displayed on the left…

… and on the right.

The configuration document needs the following, new parameter:

Loading Spinner Theme

This feature is available on Beefree SDK only.

Overview

The default Beefree SDK theme is grayscale and generally can be used with any color scheme. In v3, you can now choose between a dark and light theme for the loading animation, so it can better fit the host application’s UI. If you would like to change the loading icon and/or have more granular control of the loading theme, please view our article about .

Sample Configuration

Available themes:

  • light

  • dark

Integrating and using the Form block
image:
    image/*
text:
    text/*
video:
    video/*
audio:
    audio/*
office:
    application/msword
    application/vnd.lotus-organize,
    application/vnd.ms-*
    application/vnd.oasis.opendocument*
    application/vnd.openxmlformats-*
    application/rtf
xml:
    application/xml
zip:
    application/zip
epub:
    application/epub+zip
pdf:
    application/pdf
postscript:
    application/postscript
font:
    application/x-font-otf
    application/x-font-ttf
how to activate custom limitations for the File manager
Beefree SDK Enterprise plan
server-side configuration

var beeConfig = {
      uid: config.uid,
      ...
      loadingSpinnerTheme: 'dark'
      ...
}
paid plans
using custom CSS
Beefree SDK Developer Console
Image 1.0 Add New Subscription Button within the Developer Console

var beeConfig = {
        uid: config.uid,
        sidebarPosition: 'right',
        ...  
paid plans

Configuration Reload

Overview

When you load a Beefree application inside the host application, you pass a configuration object with multiple sections that define the characteristics of the UI, UX, and available elements. However, there are cases when you may want to reload this configuration without the need to reload the Beefree application. In these cases, you can use a specific event to update the configuration while the editor is open.

Use cases

With this event, you can make on-the-fly changes to the user experience. For example:

  • Updating available categories for Saved rows

  • Refreshing a Custom header for authorization

  • Changing Advanced permissions for the current user

  • Updating settings for the editor’s Content defaults

How it works

You can load the configuration changes via a new instance event. Here’s an example:


var newConfig = {
  advancedPermissions: {
    // new permissions
  }
}

bee.loadConfig(newConfig)

Custom Tab Layout

This feature is available on Beefree SDK Core plan and above. If you're on the Essentials plan, upgrade a development application for free to try this and other Core-level features.

Setting the default tab

The default tab configuration option lets the host application decide which content should be visible first in the sidebar when the editor is loaded.

In Beefree SDK v2, the default tab is the Content tab and this behavior could not be changed. It’s still the behavior that we recommend for most scenarios.

However, apps that rely heavily on pre-built custom rows, or saved row libraries, may now choose to highlight the Rows tab, using the following configuration options.

Available Options:

  • content

  • rows

  • settings


var beeConfig = {
        uid: config.uid,
        defaultTab: 'content',
        ...  

Changing the tab order

Building upon the default tab configuration option, in Beefree SDK v3 you may also re-organize the way tabs are ordered.


var beeConfig = {
        uid: config.uid,
        defaultTabsOrder: ['content', 'settings', 'rows'],
        ...  

Contribute to the Partner AddOn Marketplace

Learn more about how to contribute your Custom AddOn as a Partner AddOn in Beefree SDK's Partner AddOns Marketplace.

Introduction

Partner AddOns can easily be integrated with your application in a matter of minutes by installing them inside of the Developer Console. You can reference available Partner AddOns inside of the Partner AddOn Directory. If the AddOn with the functionality you are looking for is not offered within the Partner Directory, you also have the option to create your own Custom AddOn. If you'd like to add your Custom AddOn to Partner AddOn Marketplace within the Beefree SDK Developer Console, you have the option to do that.

Throughout this page, we will discuss at a high-level how you can list the Custom AddOn you created as a Partner AddOns within the Partner AddOn Marketplace.

Getting started

To get started, you will need to follow the AddOn Development documentation and create a Custom AddOn for a web application that has embedded Beefree SDK.

Please note that because Partner AddOns by definition live outside of the Beefree SDK application that will use them, you must select the external iframe method for development.

Listing in the partner directory

You can submit your AddOn to be listed in the Beefree SDK Partner AddOn Directory, so that other applications that have embedded Beefree SDK can take advantage of it.

You will be completely in charge of the business relationship with those companies, who will become your customers. We are not part of that relationship, other than being an enabler of it.

The following is a list of requirements for getting an AddOn listed in the Partner AddOn Directory:

  1. You have signed the Beefree SDK AddOn License and Distribution Agreement. Contact your Account Manager or log in to the Beefree SDK Console and submit a ticket for details.

  2. You have built an AddOn that:

    1. Uses the External iFrame Method (see AddOn Development)

    2. Uses the optional health check endpoint

  3. You have thoroughly tested the AddOn before submitting it to our test for a final review.

  4. You have a demo of the AddOn that we can access.

When you have completed all of the above, contact your Account Manager or log in to the Developer Portal and submit a ticket to complete the review and approval process.

Introduction to Beefree SDK

Welcome to the Beefree SDK technical documentation!

What is Beefree SDK?

Beefree SDK is a toolkit that offers a comprehensive set of features to enable your application's end users to achieve their design goals. Through embedding Beefree SDK into your application, you'll provide your end users with access to a full suite of design features that include the following and more:

  • Email builder: A no-code interactive and guided experience that supports your end users in creating beautiful and stunning emails quickly.

  • Page builder: A no-code intuitive experience that guides your end users through how to create visually stunning landing pages they can use to present information, embed forms, and capture critical data points to make data-driven decisions.

  • Popup builder: A unique no-code experience that provides your end users with the fundamentals of creating popups that grab and maintain attention.

  • File manager: A tool to manage media assets (images, PDFs, and so on).

  • Template catalog: A catalog of design templates that integrate industry best practices to support end users in getting across the finish line with their creations fast, and achieving quick design wins.

  • Custom AddOns: Expand your application's offering by developing your own Custom AddOns on top of our comprehensive suite of features.

  • AI Writing Assistant: A helpful AI assistant to help end users write their design content.

These builders can easily integrate into your application in a matter of minutes. Browse the latest sample code, implementation guides, and other available features in this documentation.

Beefree SDK's Embeddable Builders

Learn more about our three embeddable builders.

File Manager

In addition to our drag-and-drop editors, we also offer a standalone File Manager application, which can be used alongside any of the builders. The File Manager is specifically designed to simplify the organization and management of digital assets, which might happen outside of a content editing session. It is an image and document management user interface that can be launched as a standalone application. This allows your customers to quickly upload or manage assets, without having to load one of the builders.

Learn more about our File Manager and File Storage Options.

Customize Your Application with AddOns

Learn more about how our builder AddOns can help you customize your application's offerings.

Content Services API and Template Catalog API

The Content Services API allows you to perform a number of tasks (e.g. refreshing the HTML for a certain asset) and add features to your application (e.g. converting an email to a PDF document). We continue to release new API methods to help you enrich and personalize the content design experience for your customers.

The Template Catalog API enables you to incorporate design templates into your application. With this API, you can browse, retrieve, and utilize a variety of pre-designed templates to enhance your user's content creation experience. It gives you the flexibility to offer customized design solutions directly within your platform.

Learn more about Content Services API and Template Catalog API.

Sample Code

Browse our sample code to experiment and gain hands-on experience. Get up and running quickly with a simple implementation.

Developer Essentials

Get your free Client ID and Client Secret in the Developer Console to get started. Experiment with customizing a configuration in the playground. When you're ready, install Beefree SDK.

About this documentation

These products share the same, unique combination of design flexibility and ease of use. Note that the majority of the documentation applies to all builders (and in many cases to the File Manger too), unless otherwise specified.

If you need support at any point throughout your integration, contact us. We are here to support you along the way.

Set up two-factor authentication

Overview

Setting up two-factor authentication will keep your developer account extra secure. Two-factor authentication means that users will need to provide two different identifications to log in to their Beefree SDK Console: their regular login credentials, and a token generated by a two-factor authentication app.

When 2FA is set up, users will need to:

  • download a two-factor authentication app to their mobile device (e.g. Authy, Google Authenticator, Authenticator Plus, and others);

  • use their device and the app to generate a token and log in.

Setup for Account owners

If you’re an account owner (i.e. the user who created the Beefree SDK account), you may require all account users to use two-factor authentication to log in. To do so, go to the Setting & Security section in your personal area and enable Require two-factor authentication at login.

After saving the setting, you will be prompted to scan a QR code with a 2FA application to generate a security token to complete the setup.

When this setting is ON:

  • every user will need to enter an authentication token, generated with a 2FA mobile app, to log into the account;

  • when you create a new user, the 2FA toggle will be set to ON by default.

When adding or editing a user, you may also decide to turn on or off 2FA for that user, in order to:

  • turn on 2FA, when 2FA is OFF at the account level;

  • turn off 2FA, when 2FA is ON at the account level.

Setup for Account admins

If 2FA is OFF at the account level, additional users, i.e. admins, can turn on 2FA for themselves, for their peace of mind. They can go to the “Profile” section of their personal area and turn it on.

Note: Instead, if 2FA is ON at the account level, admins cannot turn it off from the “Profile” page and must contact their account owner.

Manage Users

Learn how to manage users within the Beefree SDK Developer Console.

Manage users in the Console

You can invite additional users to your Beefree SDK Console. To do so, go to Manage users from the personal menu in the top right.

The user that initially created the account is identified as the account owner and can add users from this page.

Additional users will be identified as admins. The owner may limit access to certain production apps when creating or editing an admin.

The account owner has these additional privileges, compared to admins:

  • add, edit or delete users, as described above;

  • turn on two-factor authentication, using tokens provided by mobile apps like Google Authenticator or Authy. 2FA can be enabled either for specific users, or account-wide from the Settings & Security section in the personal area (learn how to set up 2FA for your account);

  • change the company’s name, also in Settings & Security.

Integrating Page Builder

Integrating and Testing the Page Builder

When you create an application in the Beefree SDK Console, you’ll be asked to select either Page or Email Builder. Paid applications allow you to create child development applications, to ease new feature testing, development, and maintenance.

Page and Email builders share the same core functionalities, including authentication and configuration. If you already integrated our Email builder, you can re-use most of your work by using the same configuration and callbacks. If this is your first approach to our builders, just follow the Installation section in our documentation. All the documentation in this site applies to both products, except where noted.

All builders are available to Beefree SDK customers under the same all-in-one pricing. Please contact your Customer Success Manager for more details.

The experience

We aim to provide the foundations needed to build a delightful page building experience. We started with the basic features that are already provided to design awesome email messages and tweaked them to work for Web pages.

Once launched as Page Builder, an application will have a few but noticeable differences from the Email builder experience:

  • width for pages can be expanded up to 1440px;

  • the stage can be scrolled horizontally;

  • the sidebar can be collapsed to provide more workspace – useful when working with larger widths;

  • there’s a new 6-columns row layout, to take advantage of larger widths;

  • the preview includes viewport resize, to test responsiveness on various screen sizes;

  • the HTML block allows using scripts, for improved compatibility with embedded content like surveys. This also includes Javascript, although it cannot be executed within the builder.

If you’re on a paid plan, you will also get support for forms and embedded videos.

  • You can define and pass forms to the builder, and use the form content block to retrieve and style those forms.

  • You can use the video content block to embed and playback videos hosted on Youtube and Vimeo, or point to a hosted video in MP4 format.

Additional resources

Managing forms with the Page Builder

A quick primer on how to include forms in a web page.

Developer resources on GitHub

Our Github account hosts useful resources, including sample code to quick start your integrations.

Testing and Integrating

Creating an application

When you log into the Beefree SDK Console you can immediately see what type of applications you have already created under your Beefree SDK subscriptions. To create a Popup application, head over to the Popup Builder Application section and click on Activate.

Once created, head over to “Details” for all server-side configurations. Paid applications allow you to create child development applications, to ease new feature testing, development, and maintenance.

All builders share the same core functionalities, including authentication and configuration. If you have already integrated our Email builder, you can re-use most of your work using the same configuration and callbacks.

Integrating the Popup Builder

Out-of-the-box, the setup and configuration are the same as Email and Page Builder. This section will cover the settings specific to Popup Builder. Check out our Getting Started guide if you’re new to Beefree SDK or unfamiliar with the configuration basics (as seen in the example below).


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  ...
}

Loading Popup Builder with no additional settings will give the end-user a beautifully designed popup and workspace to design their content. However, Popup Builder comes with an additional, robust set of configuration options to customize the workspace. This allows the host application to build a workspace that matches their popup’s look and feel and that of the destination page.

For example, the host app can customize…

  • The popup workspace background to view how the popup will look “in context” on the destination page.

  • The theme and position of the popup for both desktop and mobile design modes.

Continue reading to learn more on how to customize the workspace, starting with the common settings and working up to a full custom layout.

HTML output

In Email and Page Builder, the Beefree SDK HTML parser service converts your template into an HTML document customized for email or pages, respectively. However, the Popup Builder will not return a full HTML page because the host application is the final destination. In addition, Beefree SDK Popup Builder doesn’t provide the scripts to control the popup’s behavior, such as opening and closing. Rather, Popup Builder provides the HTML “partials” to embed within your popup’s content area or body.

The HTML partial will come with all the CSS required to look as it did in the preview mode. The parser service will wrap the content with a special container to clear all the host application styles and prevent style conflicts. The HTML output is designed to be embedded into any popup framework or application and still render the way it appears in the builder.

Developer resources

Our Github account has some resources that might help you out when testing and integrating the Popup Builder.

Sample code

Examples of different implementations and configurations that you can draw from to speed up your development.

Popup templates

A collection of ready-made templates that you can use right away and add to your application.

Server-side options

Overview

Besides the client-side configuration parameters that you can set for your instance of Beefree SDK, you also can specify some server-side configuration options.

Access Server-side Configurations

To access server-side configurations, log into your Beefree SDK Console and select the application that you wish to configure.

In the application’s details page, locate the area called Application configuration.

Manage roles is used to manage user roles. For details on this feature, see “user roles and permissions“.

Click on Open configuration to manage the server-side settings like:

  • Toolbar options: affect the UI of the editor

  • Storage options: determine where the File Manager will store & retrieve images

  • Content options: define whether certain content elements (e.g. HTML block) are active or inactive

  • Service options: define whether additional services (e.g. photo search) are active or inactive

Content Services API

Learn more about how to get started with the Content Services API in the following sections:

AddOns

Learn more about AddOn options within Beefree SDK and how you can use them to offer your end users extended features and functionality.

Beefree SDK includes Partner AddOns and Custom AddOns that you can incorporate into your application. At a high-level, these AddOns enable you to add extended functionality and capabilities to your application. These extended functionalities empower you to customize your end users' experience based on their interests and the desired tasks they are trying to perform with your app. The AddOns work as additional features you can opt in for on top of the base features that come with your Beefree SDK plan type.

There are two types of AddOns: Partner AddOns and Custom AddOns. Partner AddOns can easily be integrated with your application in a matter of minutes by installing them inside of the Developer Console. They are available for the following Beefree SDK plan types:

  • Essentials

  • Core

  • Superpowers

  • Enterprise

Custom AddOns are useful when there is a feature you'd like to offer within your application that is not available in our AddOn Marketplace within the Developer Console. In these instances, you can develop your own Custom AddOns for your application's end users. They are available for the following Beefree SDK plan types:

  • Superpowers

  • Enterprise

Create an Application

Learn how to create an application within the Beefree SDK Developer Console.

Overview

In this article, we will discuss how to sign up for an account in the , create an application, and obtain your Client ID and Client Secret.

This article will cover steps for the following processes:

Sign up for account in the Developer Console

The first step to embedding Beefree’s visual builders in your software is to.

Take the following steps to sign up for a Beefree SDK account and subscribe to the :

  1. Navigate to the .

    Note: If you already have an account, navigate to the .

  2. Complete the required information to sign up or login.

    You will be redirected to the dashboard.

  3. In the dashboard, click Add new subscription.

    You will be redirected to a page that asks you to provide a name for your new subscription.

  4. Type in a name and click Next.

    You will be redirected to a page that asks you to select a subscription plan. If you'd like to subscribe to the Free version, click on the corresponding Select plan button Free plan type. If you'd like to subscribe to a paid plan, select the paid option that works best for your needs.

  5. A confirmation message will appear confirming that you selected the Free plan and that you will not be charged anything. Click Confirm to confirm your subscription the the free plan.

  6. While the plan is free, ensure that you familiarize yourself with the scenarios in which charges would apply. The following image shows a plan summary displaying instances of when charges apply.

  1. Enter and confirm your billing address.

  2. Enter and confirm your card information by clicking Place Order.

    You will be redirected your new Free plan subscription.

Important: Keep in mind that Beefree SDK will not change you for using the Free plan. However, there are charges related to . Ensure you review our plans and familiarize yourself with these cost structures as you proceed to use the Free plan.

How to create an application

Once that’s done, you will be able to . Your dashboard will look like the following image.

You will have the option to activate any or all of the following applications:

Take the following steps to create an application:

  1. Click the Activate button that corresponds with the application you'd like to create.

  2. Type in a name for your new application.

  3. Click Create.

Your application will look like the following in the dashboard once it is activated:

You have successfully created an application. Now, you can enter the application Details and obtain your Client ID and Client Secret.

Obtain your Client ID and Client Secret

Click on your application's Details button to view your Client ID and Client Secret. Use these to authenticate when you initialize it.

With your Client ID and Client Secret, you can use our to experiment with a simple integration of Beefree SDK. You can also get started with .

Reference the following related topics to learn more about customizing your applications, creating development instances, and referencing sample code.

Regenerate Client Secrets

This feature applies to paid plan types.

Inside the Beefree Developer Console, you have the option to regenerate the Client Secret for your application. To regenerate your application's Client Secret, take the following steps:

  1. Log in to the .

  2. Navigate to the application you'd like to update the Client Secret for.

  3. Click on the application's Details button.

  1. Navigate to Application keys within the application's details.

  2. Click Regenerate to generate a new Client Secret.

  1. You will be prompted to a modal and asked to confirm your application's name.

  2. Complete the App Name field and click Regenerate to complete the action.

Your new Client Secret is now available and ready to use. Your old Client Secret will expire 24 hours after creating the new one. Ensure you replace it in all the necessary environments prior to its expiration.

For 24 hours after regenerating a new Client Secret, you will temporarily have access to two Client Secrets—your old one and your new one. After 24 hours, you will only have access to the new Client Secret for your application.

  • Create

How the UID parameter works

is based on the concept of unique users of the editor. A unique user is one that is identified by a unique UID, as described below. The system counts unique UIDs within a billing period, and resets the count to zero at the start of the next billing period.

Properties

The UID parameter:

  • Is an alphanumeric string passed to Beefree SDK throughout the .

  • Has a minimum length of 3 characters.

  • Can contain letters from a to z (uppercase or lowercase), numbers and the special characters “_” (underscore) and “-” (dash).

  • Make sure that you pass a string, not a numeric value. So even if your UID is a number, pass "12345" and not 12345.

  • The UID should not be Personal Data, as indicated in the Beefree SDK License Agreement. Further information about how your use of a Beefree SDK service relates to the EU’s General Data Protection Regulation (GDPR) may be found . Our Privacy Policy, which describes the processing activities carried out by Beefree SDK as Data Controller, is available .

Unique identifier

It uniquely identifies a user of the application. When we say “uniquely”, we mean that:

  1. It will be counted as a unique user for .

  2. Images (and other files) used by the user when creating and editing messages will be associated with it and not visible to other users (when using the default storage).

Users, sub-users and client accounts

It’s entirely up to you – the application that has embedded BEE – when to use a new UID at the time you initialize the editor for your users. In 99% of the cases: one UID = one CLIENT ACCOUNT in your application. Sub-users of a client account typically share the same UID.

A quick example to help you visualize this.

  • We use the UID in the File Manager to identify where images will be stored

  • You typically don’t want client ABC to see client XYZ’s images

  • So you will use a certain UID for client ABC and another UID for client XYZ

  • If there are 5 users within client ABC account in your application, however, it’s OK that they see the same images, since they are likely collaborating on the same emails or landing pages, so you don’t need to use a different UID: all 5 will share the same UID.

Naming conventions

Overview

Here is a list of terms used frequently throughout the Beefree SDK technical documentation. Things can get a bit tricky when embedding a software application within another software application, so this page is an attempt to create as much clarity as possible. We hope we find it useful. If anything sounds confusing or if you have any suggestions for improvement, please .

Frequently used terms

  • Beefree SDK A toolkit that includes white-label, no-code builders for emails, landing pages, and popups. The toolkit also provides a range of components, APIs, sample code, and support services to help you seamlessly integrate into your software a content creation workflow that your customers will love.

  • Beefree SDK subscription A subscription to the Beefree SDK. There are different , starting with a Free plan. Once you have a subscription, you can create one or more Beefree applications.

  • Beefree application An instance of any of the no-code tools that can be embedded in your software. They include:

    • Email Builder

    • Page Builder

    • Popup Builder

    • File Manager

  • Beefree SDK Console A multi-user administration panel where you can sign up for a Beefree SDK subscription, manage the subscription, and create and configure a Beefree application within a subscription.

  • Production application An instance of a Beefree application used in your production environment.

  • Development application An instance of a Beefree application used for development, QA or staging environments. You can create multiple, development applications under a production application.

  • Host application Your software application, which will host one or more Beefree applications.

  • Beefree system The backend system that interacts with your Beefree application to provide services such as application authorization.

  • Content Services API A set of in the Beefree system that allow you to perform a variety of tasks connected to the implementation of a content creation workflow.

Embedding videos in a page

This feature is available on Beefree SDK only.

The Page Builder includes an expanded Video content block for optimized usage of videos on web pages. Videos are added inside an iframe via the HTML5 video tag.

There are multiple ways to add a video to a page built with Beefree SDK. Additional settings allow the video progress bar and loop playback to be turned on or off.

Embedded

The Embedded mode allows video playback inside the page. It requires the URL of a video hosted on YouTube, YouTube Shorts, or Vimeo.

Hosted video

Same as the embedded option, but the URL provided must point to a self-hosted video in MP4 format. Settings for hiding controls and loop playback apply as well. Please note that the player interface your visitors will experience might slightly vary based on the browser they use.

Thumbnail

As a fallback, you may also use the video block for generating a thumbnail, the same way the block works when building emails. Just enter the URL for a video hosted on YouTube, YouTube Shorts, or Vimeo. A thumbnail linked to the video will be created. You may also style the overlay play icon.

Supported Video Sources

  • YouTube (16:9 aspect ratio)

    • Public Videos

    • Unlisted Videos

    • Videos starting at a certain time

  • YouTube Shorts (16:9 aspect ratio)

  • Vimeo

    • Public Videos

    • Unlisted Videos

    • Cinemascope (21:9 aspect ratio)

Advanced options

Advanced options are available with Beefree SDK. Learn more about the advanced options you can integrate within your web application. Beefree SDK's advanced options include the following capabilities.

Appearance

Beefree SDK enables you to customize the appearance of a variety of elements. Reference the following sections to learn more about how you can customize appearance:

Content Tile Sorting

This feature is available on Beefree SDK and above. If you're on the Essentials plan, for free to try this and other Core-level features.

Re-ordering Content Tiles

The Content Tile Sorting option allows the host application to change the order of the content tiles in the editor’s sidebar. This allows the host application to display the content blocks that are most important for their users first, and even provide additional visibility for a Custom Addon.

To use this feature, the host application must simply pass in the preferred order inside the configuration passed at initialization, like so:

The host application can pass as many or as few content blocks as they want. If only one content tile is specified, then only that content tile will be placed at the top, and the rest of the content tiles will follow the default order.

For Custom/Partner AddOns, the host application passes the “Content Title” value found in the Addon section of the Beefree SDK Console Application Configuration.

Full List of Content Tiles

CSAPI Overview: Learn about the services available through our Content Services API

Content Service API Reference: Explore our REST API collections and resources

Brand Style Management: Make template-wide design changes to existing templates quickly

FAQs: Reference answers to our mostly commonly asked questions

🔍 AddOns Overview: Learn more about AddOns at a high-level.

🛠️ Custom AddOns: Learn more about Custom AddOns, and how to develop and implement your own custom built AddOn.

🤝 Partner AddOns: Learn more about Partner AddOns that are available within the Beefree SDK Developer Console, and how to integrate them into your application.

🎨 AddOns Configuration: Learn more about client-side configuration for Custom and Partner AddOns.

❓AddOns FAQs: Reference frequently asked questions about Beefree SDK's Custom and Partner AddOns.

Pricing for Beefree SDK
server-side authorization process
here
here
monthly billing purposes
contact us
subscription plans
API methods
Beefree SDK Developer Console
Sign up for an account in the Developer Console
How to create an application
Obtain your client secret and client id
sign up for a Beefree SDK account
Free plan
Developer Console Sign Up page
Developer Console Login page instead
user and CDN overages
log into the Beefree SDK Console
Email Builder Application
Page Builder Application
Popup Builder Application
File manager Application
Sample Code
your own implementation of Beefree SDK
Beefree SDK Console
development applications
Configuration parameters
Server-side options
Sample code
paid plans

Special Links and Merge Tags

Content Dialog

Custom Color Palette

Font management

Roles and Permissions

Smart Merge Tags

Commenting

Custom Attributes

Meta Tags

Custom Languages

Display Conditions

Advanced Permissions

Custom File Picker

Custom Headers

Content Defaults: Define how content looks when dragged into an email or page.

Custom Sidebar Position: Choose whether to display the builder sidebar on the left or on the right side of the screen.

Content Title Sorting: Change the order of the content tiles in the editor’s sidebar.

Content Title Grouping: Group content tiles in the editor’s sidebar.

Loading Spinner Theme: Choose between a dark and light theme for the loading animation

Custom Tab Layout: Re-organize the way tabs are ordered.

Themes: Change the builder’s appearance when rendered within your application

Custom CSS: Define a custom look and feel through a CSS stylesheet


{
  // ...
  defaultModulesOrder: [
    'Button',
    'Html',
    'Icons',
    'Video',
  ],
  // ...
}

1. Heading (Title)
2. Paragraph
3. List
4. Image
5. Button
6. Divider
7. Spacer
8. Social
9. DynamicContent
10. Html
11. Video
12. Form
13. Icons
14. Menu
15. Carousel
16. Text
17. ---- AddOns ----
Core plan
upgrade a development application

Email Builder: An email editor that makes building gorgeous, mobile-ready emails a breeze.

Page Builder: A delightful tool to design beautiful, effective landing pages in minutes, without writing a single line of code.

Popup Builder: An easy to deploy, true WYSIWYG solution for designing standout popups.

File Manager

Storage Options

Configure Your AWS S3 Bucket

AI Writing Assistant with Multiple Provider Options

Partner AddOns

Custom AddOns

Content Services: Export plain text, convert JSON to HTML, and manage brand styles.

Template Catalog: Add templates to your application.

AI Collection: Use the AI collection to get metadata, SMS, and summary text.

Full-stack application built with NextJS

Official NPM package of Beefree SDK

A simple HTML sample client to start playing with Beefree SDK

Beefree SDK simple React starter

Templates to accelerate the set-up of your Beefree SDK integration.

Explore methods

Developer Console

Playground

Install Beefree SDK

Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover
Cover

Custom CSS

This feature is available on Beefree SDK Superpowers plan and above. If you're on the Core or Essentials plan, upgrade a development application for free to try this and other Superpowers-level features.

Defining a custom look & feel through a CSS stylesheet

To define a custom look and feel through a CSS stylesheet, assign the URL of your CSS file to the customCss property in your JavaScript code, as shown in the following example.


customCss: 'https://yourdomain.com/stylesheet.css'

Using different values for different users of the builder

You can customize the builder's CSS for different users by dynamically setting the customCss property with a unique CSS file URL for each user. Simply concatenate the user-specific identifier to the base URL as shown in the example code.


customCss: 'https://yourdomain.com/' + users[config.user].id + '.css'

Best practices and risk management

Custom CSS is an advanced feature, which gives the host application great flexibility to customize the UI/UX of the builder. Please use this feature with caution. If you're looking to hide certain UI elements, we recommend you first check if that can be accomplished with Advanced Permissions, as it may be easier to implement.

When used properly, it is a powerful tool that can be leveraged to accomplish anything from applying custom styles with fine granularity to changing icons.

When misused, however, it may harm the user experience and the rendering capability of the builder’s stage. For example, styles applied to the stage via CSS will not be reflected in the preview or exported HTML.

Important Notice

For the best results, follow these best practices:

  • Avoid global styles. Do not use generic global styles (e.g., *, p, input) that could affect the editing stage.

  • Use specific CSS selectors. Target elements using precise selectors (e.g., body.bee--cs h3).

  • Do not inject scripts via CSS. JavaScript and other scripts should not be included in CSS.

  • Ensure HTTPS hosting. The custom CSS URL must be hosted over HTTPS.

  • Avoid third-party hosting. Do not link to CSS files hosted on GitHub or other third-party sources.

  • Do not style elements directly on the stage. These styles will not appear in the final HTML, which may create a confusing experience.

Reliable Selectors

Only class names with the --cs suffix are reliable for custom CSS. Avoid the following selectors:

  • Nested tag structures (e.g., div > div > div)

  • Sibling selectors (e.g., input + label)

  • Class names without --cs (e.g., .icons__item)

  • Prefixed class name selectors (e.g., div[class^="StageModuleIcons_itemRow"])

⚠️ Changes & Updates

Class names without the --cs suffix may change without prior notice. However, any updates to the HTML structure and --cs classes will be communicated in advance.

Sample Custom CSS Theme

Reference the following Sample Custom CSS Theme to see an example of how you can use custom CSS in your web application.


https://gist.github.com/44daee53546a9f48ecad7f52784efa55.git

Development Applications

Learn about the different environments available through Beefree SDK and how to get started to with each.

Development Applications

Development applications are available with any Beefree SDK paid plan.

What is a Development Application?

A development application is a child application that is linked to your parent application within the Beefree SDK console. The purpose of these child applications is to create development, QA, or any other type of applications that you can merge your application’s changes to prior to pushing them to production. This empowers you to test new features, even on a higher plan, within a controlled environment prior to releasing them to your application’s end users.

How to Create a Development Application

You can create a development application within your Beefree SDK console. Prior to creating a development application, ensure you have a paid plan with Beefree SDK. This will make the functionality accessible to you.

To create a development application, take the following steps:

  1. Log in to your Beefree SDK Developer Console

  1. Create a new application

Note: This creates a production environment for your application.

  1. Navigate to your dashboard where the new application is located

  2. Click the + next to Add a development instance

  1. Type in the name of your development application, for example “development environment” or “QA environment”

  1. Click Create

  2. View the new development application available in your Beefree SDK dashboard

Beefree SDK Console Dashboard with an Example QA Environment Development Application

Benefits of Development Applications

There are multiple benefits to utilizing development applications. A few of these benefits are the following:

  • Merge and test changes to your application prior to releasing them to your end users

  • Create an environment for different contributors in your development cycle, for example QA Engineers, frontend developers, backend developers, and so on

  • Access next tier Beefree SDK features in your development applications without any additional costs

  • Create as many child development applications linked to your parent production environment as you’d like

Important Considerations

While access to next tier Beefree SDK features in your development applications is available to you, it is important to remember that you cannot push any next tier features in your development application to your production environment. Your production environment should only include the features reflected in your current plan subscription. If you find that you would like to push a next tier feature from your development application to your production application, you need to upgrade to the subscription plan that corresponds to those features.

Beefree SDK allows you to access next tier features within your development application to test them out and see if they are a good fit for your application’s needs. However, it is important to consider that if you plan to push those features to your production environment, that you have the right subscription and permissions to do so.

Development apps inherit the same plan that your production app is on. If you wish to test features that are available on a higher plan, go the application details and click “CHANGE PLAN” in the upper right.

Sample Code

A prototype in 2 minutes

Using this simple, client-side example, you can literally try out Beefree SDK in 2 minutes…

  1. Obtain your application keys (Client ID and Client Secret) by signing up here (there is a free plan).

  2. Create a new application: you will find your keys in the project’s details page

  3. Download the client-side sample code.

  4. Open index.html with your favorite code editor

  5. Locate client_id and replace “YOUR_CLIENT_ID” with yours

  6. Locate client_secret and replace “YOUR_CLIENT_SECRET” with yours

  7. Save the file

  8. Open it in your browser and get creative

Embedding the builder

Before using the code samples listed below in a production environment, please consider the following:

  1. Make sure you first sign up and get your application keys (Client ID and Client Secret).

  2. The client-side sample is not safe for a production environment (it was conceived as a quick way for you to test the application). Someone would be able to easily steal your application credentials (just viewing the source code of the page). To keep those credentials safe, authorization must be managed sever-side, as the .NET sample does.

  3. These code samples use a limited set of features and configurations: they can be a good starting point to start developing around Beefree SDK, but they are not an exhaustive showcase of everything you can do.

  4. All sample code is provided “as is”: it may contain defects, it may not follow best practices (although we try to!), and it should only be considered as point of reference.

GitHub Repositories

Name and Link
Description
Stack

Demonstrates integrating the Beefree SDK into a full-stack NextJS application with database integration and user authentication.

NextJS, Python, SQLite

The official NPM package for Beefree SDK, complete with installation instructions and configuration tips.

Typescript

Code from our latest webinars showcasing how to use Saved and Synced Rows feature within the Beefree SDK.

ReactJS

A collection of free email, landing page, and popup templates designed for easy integration with the Beefree SDK.

JSON

A simple HTML app demonstrating the basic implementation of the Beefree SDK for client-side applications.

HTML, JavaScript

Undo & Changes history

Overview

Your users will have the ability to rewind and fast-forward to any point in their recent edit history. Once Undo is enabled in the Beefree SDK Console, the application immediately begins tracking changes. Behind the scenes, this is accomplished via a new callback event – called onChange – which can also be used “stand-alone” without enabling Undo. No client-side configuration is required to use this feature. Continue reading to learn how to activate and use Undo. And if you can’t wait to try it yourself, you can immediately do so at beefree.io

How it works

When changes are detected, a compact Undo widget displays in the bottom left corner of the stage:

The widget displays 3 actions:

  • Undo and Redo arrows that offer the classic pattern to move back and forth between changes.

  • A history icon that expands a timeline of the latest changes:

Timeline

The timeline allows the user to browse through the most recent changes.

All the steps display:

  • An icon to identify the content element type (an image, text, etc.)

  • A description of what changed, giving the new property value (if any)

  • The exact time it happened

All these details provide enough information for users to understand what modification was applied, and, if desired, rewind the message to that state:

When the user selects a previous step, the content or row that triggered the history record displays as the selected item, providing further context.

The timeline for more recent changes is still available, allowing the user to move forward without losing any changes:

The Undo widget currently displays the last 15 edits in the timeline, but users can always rewind to the Message opened state to undo all changes since the message was initially opened in the builder.

We are also doing additional testing to see if the number of recent edits can be increased beyond 15 without negatively impacting the browser’s performance. We will update this section if the number is increased.

The last saved edits are only available at the session level, so they reset every time the builder is loaded. If you need to provide a complete message history, you can build a custom one based on the onSave and onChange events (see below).

Activating the Widget

The Undo option is available at the application level in the Beefree SDK Console. Select your application from the list and open the Application configuration in the bottom-right. The option to enable this widget is available in the Services list:

The widget uses the onChange callback information to work. However, it doesn’t need a client-side configuration for the callback: once Undo is enabled, the application starts tracking changes even if the trackChanges parameter is not set in beeConfig.

Content Tile Grouping

This feature is available on Beefree SDK Superpowers plan and above. If you're on the Core or Essentials plan, upgrade a development application for free to try this and other Superpowers-level features.

Grouping Content Tiles

The Content Tile Grouping option allows the host application to group content tiles in the editor’s sidebar. This allows the host application to display the content blocks into distinct groups.

Content Tile Grouping supports:

  • Text labels

  • Special Characters

  • Emojis

Please note that emoji support may be determined by the OS or browsers used. Some browsers do not support, or may display emojis incorrectly.

To display custom groups, the application must pass the groups settings in the configuration at initialization, like so:


modulesGroups: [
  {
    label: "Text ✏️",
    collapsable: false,
    collapsedOnLoad: false,
    modulesNames: [
      "List",
      "Paragraph",
      "Heading"
    ]
  },
  {
    label: "Media",
    collapsable: true,
    collapsedOnLoad: false,
    modulesNames: [
      "Video",
      "Image"
    ]
  },
  {
    label: "AddOns",
    collapsable: true,
    collapsedOnLoad: true,
    modulesNames: [
      "Stickers",
      "Gifs"
    ]
  }
]

Custom groups can be collapsed and opened by default by changing the collapsable and collapsedOnLoad values. Ungrouped tiles will be gathered at the bottom of the list under a group with no label.

Duplicated tiles are not allowed, e.g., you can’t have a tile twice in the sidebar. An onWarning notification is triggered whenever an unknown tile is added to the configuration.

Full List of Content Tiles


1. Heading (Title)
2. Paragraph
3. List
4. Image
5. Button
6. Divider
7. Spacer
8. Social
9. DynamicContent
10. Html
11. Video
12. Form
13. Icons
14. Menu
15. Carousel
16. Text
17. ---- AddOns ----

If you want to organize or include AddOns, and Custom AddOns under a custom group, mention the name used in the Beefree SDK Console.

Please note, the AddOn needs to be enabled to appear in the sidebar.

Partner AddOns

Learn more about Partner AddOns that are available within the Beefree SDK Developer Console, and how to integrate them into your application.

Partner AddOns are available for Beefree SDK paid plan types.

What are Partner AddOns?

Partner AddOns can easily be integrated with your application in a matter of minutes by installing them inside of the Developer Console. You can reference available Partner AddOns inside of the Partner AddOn Directory. If the AddOn with the functionality you are looking for is not offered within the Partner Directory, you also have the option to create your own Custom AddOn.

At a high-level, these AddOns enable you to add extended functionality and capabilities to your application. These extended functionalities empower you to customize your end users' experience based on their interests and the desired tasks they are trying to perform with your app. The AddOns work as additional features you can opt in for on top of the base features that come with your Beefree SDK plan type.

Where can I find the Partner AddOns Marketplace?

You can find the Partner AddOns Marketplace within the Beefree SDK Developer Console.

Take the following steps to access the Partner AddOns Marketplace:

  1. Log in to your Developer Console.

  2. Navigate to the application you'd like to add a Partner AddOn to.

  3. Click on the Details button.

  4. Navigate to AddOns and click View more.

    You'll be redirected to the AddOns page.

  5. Click on the Browse AddOns button.

  6. You'll be redirected to the Marketplace with the available AddOns.

Note: Partner AddOns are very intutive and quick to install. For steps on how to install a Partner AddOn, navigate to Installing Partner AddOns.

How soon is the functionality available to my end users?

Once you successfully install a Partner AddOn following the steps outlined in Installing Partner AddOns, it will be available to your application's end users. Depending on the AddOn, you may or may not apply configuration settings to manage the functionality of the AddOn. For example, you may want to apply configurations to AI-related AddOns to control tokens and associated costs.

Installation and Fundamentals

Install Beefree SDK to get started with your implementation.

Add JavaScript Library

Congratulations on ! Now it’s time to install it. The first step is to add the Beefree SDK library to your application. You can use our to add it.

NPM

Use the command npm i @beefree.io/sdk to install the Beefree SDK library into your project.

Initialize the application

Take the steps outlined in this section to initialize your application.

Step 1. Create a container

The embedded application (email builder, page builder, popup builder, file manager) will load into any HTML element on your page.

We recommend starting with an empty div, as follows:

Step 2. Authentication

Beefree cares about your security. This is why we use a standard JSON Web Token, or JWT, to authenticate your application.

To authenticate your application, pass your Client ID and Client Secret to our authorization service, and we’ll send your unique token back to you.

We talk about this step in detail , but here’s a quick example:

Authentication Code Samples

JSON Authorization Response

Step 3. Create an application

Now that you have a token, you can initialize the application into your empty div.

To do so, you will call the create method, which has three parameters:

  • token This is the result of the previous step.

  • config This contains your settings and event handlers.

  • callback This is a function that receives the application instance

Here is an example in plain JavaScript:

The following table shows all of the required :

Attribute
Type
Description

Step 4. Start the application

The final step is to start the application, using the start method.

  • If the application is one of the builders, do so by loading a template.

  • If the application is the File Manager, no parameters are needed.

Call the start method as follows:

The instance method bee.start(template) does not need to be called immediately after create. In a SPA (Single Page Application) or React app, you can create the editor in a hidden global state but then call the start method when the template is selected and available. The application loads quickly when all steps are completed consecutively. However, by separating the loading workflow into two parts, the end-user will perceive loading in a fraction of the overall time. Remember, if the client_id belongs to a File Manager application, bee.start() can be called without any parameters.

Release Candidate Environment

Learn more about what the Release Candidate Environment is, how to get started with it, and how to integrate it into your development life cycle.

Overview

A Release Candidate (RC) Environment is a crucial part of the deployment workflow designed to provide Enterprise customers with additional stability and assurance before a feature reaches full production. Unlike standard releases, which immediately roll out updates to all users, the RC environment acts as an intermediate step. It allows selected customers to access a production-ready version of the latest code before it becomes available to the wider user base. This controlled rollout process mitigates risks associated with unforeseen bugs and ensures a smoother transition. It also mitigates the risk of regressions and rollbacks. By implementing an RC environment, Beefree SDK enables Enterprise customers to conduct their own QA testing on new features, reducing potential disruptions when updates go live.

Benefits of the Release Candidate Environment

The following list includes some of the most commonly referenced benefits of utilizing the Release Candidate Environment.

  • Risk Mitigation: Enterprise customers can validate new updates in a stable, production-like setting before they are fully deployed.

  • Enhanced Quality Assurance: QA teams can test features in real-world scenarios, catching regressions before broader release.

  • Predictable Deployment Schedule: A structured release cadence (RC → General → Delayed) ensures smoother rollouts with fewer surprises.

  • Reduced Need for Rollbacks: The phased approach minimizes critical failures in production, lessening the necessity for emergency rollbacks.

  • Customer Control: Enterprise customers have additional time to adjust workflows and prepare internal documentation before full adoption.

How the Release Candidate Environment Works

The RC environment operates within a structured release cycle, ensuring that new updates are progressively introduced. When a new feature is ready for release, it is first deployed to the RC environment. Only Developer applications linked to the RC version can access this release. After a one week waiting period—assuming no major regressions are found—the update moves to the stable version, making it available to non-Enterprise customers. After a week, the update reaches the Delayed version, which is linked to Enterprise Production applications. This phased approach ensures that issues are detected early while maintaining a predictable release schedule.

Requirements for Accessing the Release Candidate Environment

Reference the following requirements for accessing the Release Candidate Environment prior to getting started with it.

  • Only available to Enterprise plan customers with Developer applications.

  • Contact the Beefree SDK team using this and request access to the Release Candidate Environment.

  • Customers must be aware that while the RC version is production-ready, it is still subject to final testing and potential bug fixes.

  • The program does not allow for customized release schedules per customer; all Enterprise customers follow the same cycle. Customized release schedules are available on VPC plans. For more information, contact the Beefree SDK team using this and request more information about customized release schedules with VPC plans.

How to Use the Release Candidate Environment

This section discusses how to access the release candidate environment and use it.

Instructions

To get the HTML version of a Beefree SDK message in the Release Candidate (RC) environment, you will need the following:

  1. The Beefree SDK Support Team will provide you with a username and password (we will need a user’s email address to enable this).

  2. A Beefree SDK JSON source file.

  3. The ability to perform a call to a REST API. You can do that in different ways:

    • Applications like Postman or Insomnia

    • Use the “curl” command in a shell

    • With a custom script

The call should be addressed to one of the following endpoints, depending on the HTML output that you wish to receive back:

  • https://stg-bee-multiparser.getbee.io/api/v3/parser/email - To receive HTML for Email

  • https://stg-bee-multiparser.getbee.io/api/v3/parser/pages - To receive HTML for Webpages

  • https://stg-bee-multiparser.getbee.io/api/v3/parser/amp4email - To receive AMP for Email

  • https://stg-bee-multiparser.getbee.io/api/v3/parser/popup - To receive HTML for Popups

  • https://stg-bee-multiparser.getbee.io/api/v3/parser/text - To receive the plain text version of the message

Additional Requirements

Reference the following additional requirements for using the Release Candidate Environment.

  • It has to be a POST call.

  • The Beefree SDK JSON has to be sent in the body of the REST call.

  • It must include a Basic Authentication header in which you specify your username and password.

Upon success, the body of the response will contain the desired output. In case of an error, the response's body will contain the error details.

Please do not use this method in production. This is an RC environment, and it may change its behavior in the future.

Example

Legenda

The following fields are required in the example above.

  • USERNAME and PASSWORD are your credentials provided by the Beefree SDK team.

  • JSON_FILE.json is the Beefree SDK source file.

  • OUTPUT.html is the desired output file.

Additional Considerations

The Release Candidate Environment is specifically designed for frontend features, the JSON-to-HTML parser, and the JSON Bumper. Backend services are not currently covered under this process. Bug fixes, while critical, may bypass the RC process when necessary to expedite resolutions. By adopting the Release Candidate process, Beefree SDK provides Enterprise customers with greater predictability, quality assurance, and peace of mind in managing their integrations.

Setting layout and size

Width settings

Let’s start by looking at some of the peculiarities of the Popup builder.

In Email and Page Builder, the content area width is saved in the template. For example, if you start with an empty template, a default width that works for most scenarios is chosen, but the designer can adjust the message width slider. If you start with an existing template, the content width was chosen by the template’s designer using the message width slider in the builder Settings tab.

With Popup Builder, the same template may have multiple contexts, and each context will likely have specific size requirements. For example, an exit-intent popup may have a max-width of 600px on a desktop with a classical layout centered on the screen. On the other hand, the host app may display the same template on mobile in the bar style docked at the bottom of the screen with a restricted width of 300px.

Since the content area’s width is tightly coupled to the context and layout, no one size fits all width is saved in the template. Instead, the host app will specify the width settings when the builder loads, based on the context of using the template. Here is a quick example:

Two final notes:

  • Popup Builder does not currently support fluid 100% width content.

  • If you don’t specify a width, the application will apply a default one.

Layout settings

As mentioned before, you will receive a ready-to-go design experience when no settings are provided. The default layout is a classic centered modal with a fixed width.

If the default popup style and layout suit your needs, then your customers are all set to start designing! You can load the builder without additional configuration and use the same standard controls and callbacks to access the HTML and JSON template.

What if you like most of the defaults but want to do some minor adjustments? We have you covered!

Changing the background

You can easily change the background to make the workspace look like the destination page where your customer will embed the popup.

If this option is not set, then we will provide a default skeleton layout. It’s worth noting at this point that you can apply every setting for both desktop and mobile design modes. That means you can have a different background when editing in .

Applying a preset layout

One of the most common needs is changing the popup’s default-centered position to better match the end-user’s use case. Out-of-the-box, the Popup Builder comes with many of the most common popup layouts preconfigured. You can use any available presets “as is” or use them as starting points that you can fine-tune to your satisfaction.

Here is a complete list of preset layouts:

Name
Value
Description

Toolbar options

Please note that server-side configurations are only available on .

Toolbar Options

In the Toolbar Options tab you can:

  • control individual settings that affect the top toolbar in the builder

  • decide whether to hide the toolbar completely

The toolbar contains all the actions not related directly with content edition, like save, send a test or preview.

You can decide the inner elements from it, from hiding our brand to removing the save button, to create the builder version that better fits in your application.

Not enough? Remove the toolbar completely and offer all the actions with your own UI elements.

Remove Toolbar and Create Custom UI Elements

For example, in our MailUp App for Shopify, we hide the toolbar completely and control the builder (Show preview, Send test, Save) from buttons in the app UI (not in the builder). Here is how it looks.

If you decide to go this route, use the to control the builder from your UI.

Option
Description

Themes

This feature is available on Beefree SDK and above. If you're on the Essentials plan, for free to try this and other Core-level features.

How it works

This Beefree SDK configuration allows you to change the builder’s appearance when rendered within your application so that it will blend even more seamlessly with the rest of your user interface.

Technically speaking, it allows you to change some parts of the CSS (Cascading Style Sheets) that controls the look & feel of the editor. If you want to use your own CSS, please refer to our feature.

Using a predefined theme

To change the builder’s appearance with just one click – and to familiarize with this feature – try one of the available, pre-built themes. All of them were created based on UI best practices, such as using the right amount of contrast between elements.

You can apply one of these themes as is, or use them as a starting point. And you can roll back to the default theme at any time, if things go wrong.

Note that themes will not be applied automatically, but rather will change the Look & feel values displayed in the lower part of the page.

Once you’re happy with your selection, press Save to apply the new theme to your Beefree SDK application.

Building your own theme

The properties that make up a theme are divided into sections for clarity and easy of use.

Available settings explained

General

The basic settings for your theme. They provide control over the font used and the general color scheme.

Font URL

You can use a Web font by adding the URL of a public CSS file (e.g., https://fonts.googleapis.com/css?family=Roboto)

Font-family stack

Will be used as font-family property. Remember that – when using web fonts – a fallback value will help to deal with downtime or network issues.

Brand color palette

Use this section to configure basic properties of your color scheme. These colors will be displayed in buttons, active widgets, hover & selection helpers, etc.

The Primary color will be the most important color in your scheme, as it will identify highlighted elements. Here are two examples of how a highlighted row is rendered using two different themes (the default theme is shown at the top).

Stage

The stage is the area where the message is displayed while you design it. The main elements will inherit colors from General | Brand Color Palette so only the text color is available as an editable property.

Right panel tabs

This section controls the appearance of the right panel’s top tabs. You can add custom colors and even hide the default icons (which may be useful for some translations in order to create more real estate for the text labels). Here is an example (left: default theme, right: aubergine).

Draggable tiles and Tile icons

These sections will help you customize the tiles that are used for content items and row structures. Here is an example (left: default theme, right: aubergine).

Properties top bar

This is the title bar that is displayed in the right side panel when you select an item on the editing stage. It displays important information and actions that can be performed on that item.

Widgets

All the properties displayed in the right side panel when you select an item in the editing stage are a mix of shared widgets.

The following is a visual guide of the available customizations (left: default theme, right: aubergine).

Sections

Input fields

Toggle control

Social icons

Cards Style and Image Round Corners

Learn more about how to activate cards style widgets and image rounded corners.

This feature is available for all . Available for Email Builder, Page Builder, and Popup Builder.

Implementing Image Rounded Corners and Card Style Features

This guide explains how to enable the Image Rounded Corners and Cards Style features in your host application. It provides instructions for making these features available to your application's end users while they are designing emails, pages, and popups.

Cards Style

Cards Style is a Row Property that enables you to create space between columns and round the corners of columns within a row.

The Cards Style feature allows users to transform ordinary messages into visually appealing layouts that grab their audience’s attention effortlessly. By incorporating stylish cards, users can effectively highlight product features, display customer testimonials, promote special offers, and present news updates in a structured and eye-catching manner. This not only enhances the readability and engagement of emails, pages, and popups but also ensures that important information stands out and resonates with viewers, providing significant value to the end-users and enriching their design experience within your application.

Reference the to learn more about how your application's end users can use this feature.

Image Round Corners

The Image Round Corners feature allows your application's end users to easily add rounded corners to images from the side panel, enhancing the visuals of emails, pages, and popups. This built-in tool offers a sleek and professional design option, ensuring a modern look.

Together, these features empower your application’s end-users to create more compelling and attractive designs effortlessly. Users can employ these stylistic options to make their content more engaging and easier to scan.

Reference the to learn more about how your application's end users can use this feature.

Prerequisites

Ensure you have the following prior to activating Cards Style and Image Round Corners:

  • Beefree SDK account (any plan type)

  • An application in the developer console

  • Client ID and Client Secret

How to Activate

Take the steps outlined in this section to enable Image Rounded Corners and Cards Style Widgets.

Activate Image Rounded Corners

This section discusses how to enable Image Rounded Corners.

To activate Image Rounded Corners, follow these steps:

  1. Log in to your developer console

  2. Navigate to your application

  3. Enter your application's configurations

  4. Navigate to the Enable image rounded corners toggle

  5. Toggle it to on

Activate Cards Style Widget

This section discusses how to enable Cards Style.

Follow these steps to enable the Cards Style Widget for your application:

  1. Log in to your developer console.

  2. Navigate to your application.

  3. Enter your application's configurations.

  4. Find the Enable cards style widgets toggle.

  5. Toggle it on.

Implementing Rounded Corners and Card Style Using Content Defaults

You can implement the image rounded corners and cards style features using content defaults in your application's configuration. The following code snippet demonstrates how to set the properties related to these features.

In this configuration:

  • Image Rounded Corners: The borderRadius property under the image key sets the border radius to "30px".

  • Cards Style Widgets: The row key contains styling properties for widgets, such as columnsBorderRadius, columnsPadding, and columnsBackgroundColor.

Visit the page to learn more about these configurations.

Advanced Permissions for Customization

To control the permissions for the Cards Style and Image Round Corners features, use the following configuration sample.

This configuration allows you to manage whether these features are visible and editable to your application's end users.

The properties in the advanced permissions code snippet control the visibility and editability of specific interface elements related to Cards Style and Image Round Corners. By setting "show": true, these elements will be displayed to end users. The "locked": false property ensures that these settings can be modified by the end users. These configurations set the permissions for these features within your host application.

Visit the to learn more about these configurations.

Additional Considerations

Consider the following when using Cards Style and Image Round Corners:

  • Round corners for Cards, Images, and Content Areas are not rendered in Outlook clients. The fallback is squared corners.

  • Visit Using Cards Style and Image Round Corners to learn more about how end users can use these features in your application's user interface.

FAQs

API billing: why we are charging for this API

The allows you to carry out a number of , like converting an email or a page into a thumbnail image or a PDF document, or updating a footer into all the emails that use it (i.e. a ).

These tasks consume resources in our Amazon Web Services environment, so we have to account for that. We did extensive research to define pricing that is consistent with other APIs.

Here is a quick summary:

Plan
Included API calls
Cost per extra API call

There will be no changes to the functionality of the CSAPI, except that we’ve added a really useful Merge API that allows you to update saved rows in the documents that use them. You can find complete .

Most changes related to CSAPI will be in the background, but there will be some changes in the Beefree SDK Console, and in terms of billing.

  • API Key Management: when you configure an application in the Beefree SDK Console, you will see two actions – instead of a single Revoke action – in the area of the application settings where your API key is shown:

    • Regenerate: Revokes the current key and creates a new one

    • Disable and revoke: Revokes the current key and disables the service, so you will not be charged for it*

*Note: Extra API calls are charged at the end of the billing period. For this reason, the first invoice after cancellation may include CSAPI charges.

  • Billing statement changes: you will see new line items on your Beefree SDK invoice.

Can I try the service without paying?

You can by creating a development application, and then creating a new API key for that app, which will be used for development purposes. Reference our .

How will charges appear on my bill?

An additional charge, CSAPI, will be added to your current subscription plan invoice.

Can I use different payment methods for each app?

The Content Services API is provided as a component for your current subscription and the charges will be applied to the subscription payment method. Currently, there is no option to use an alternative payment method specific to these charges.

How do you calculate request limits?

API requests rate limits exist independently of any API key’s monthly usage allowance.

As of January, 2020, the API has the following rate limits:

  • Per minute: 500 requests

  • Per second: 100 requests


npm i @beefree.io/sdk

<div id="bee-plugin-container"></div>

var req = new XMLHttpRequest();
req.onreadystatechange = function() {
  if (req.readyState === 4 && req.status === 200) {
    // Obtain token
    var token = req.responseText;
    // Call create method and pass token and beeConfig to obtain an instance of BEE Plugin
    BeePlugin.create(token, beeConfig, function(beePluginInstance) {
	// Call start method of bee plugin instance
	beePluginInstance.start(template); // template is the json to be loaded in BEE
    });
  }
};

// This is a sample call to YOUR server side application that calls the loginV2 endpoint on BEE the side
req.open(
	'POST', 	// Method
	'/YOUR_BACKEND_TOKEN_ENDPOINT', // your server endpoint
	false 		// sync request
);
{
    "access_token": "...",
    "v2": true
}


// Define a global variable to reference the application instance
// Tip: Later, you can call API methods on this instance, e.g. bee.load(template)
var bee;
 
// Define a simple Beefree SDK application configuration...
var config = {
    uid: 'string',
    container: 'string'
}

// Call the "create" method:
// Tip:  window.BeePlugin is created automatically by the library...
window.BeePlugin.create(token, config, function(instance) {
    bee = instance;
    // You may now use this instance...
});

uid

string

An alphanumeric string that identifies the user and allows the embedded application to load resources for that user (e.g. images).

  • Min length: 3 characters

  • Can contain letters from a to z (uppercase or lowercase), numbers and the special characters _ (underscore) and – (dash)

  • It is a string and not a numeric value

It uniquely identifies a user of the Beefree application. When we say “uniquely”, we mean that:

  • It will be counted as a unique user for monthly billing purposes.

  • Images (and other files) used by the user when creating and editing messages will be associated with it and not visible to other users (when using the default storage).

container

string

Identifies the id of div element that contains the application


var template = { ... }; // Any valid template, as JSON object
 
bee.start(template);
creating your first application
convenient NPM module
here
configuration settings
curl --request POST \
--url "https://stg-bee-multiparser.getbee.io/api/v3/parser/email" \
--user "USERNAME:PASSWORD" \
--header "Content-Type: application/json" \
--data @"JSON_FILE.json" \
--output "OUTPUT.html"
contact form
contact form
workspace: {
  popup: {
    contentWidth: 600,
    contentWidthMobile: 300
  }
}

beeConfig: {
  ...
  workspace: {
    popup: {
      backgroundImage: 'https://.../background.png',
      backgroundImageMobile: 'https://.../background.png',
      ...
    }
  }
}

beeConfig: {
  ...
  workspace: {
    popup: {
      layout: 'bar-top'
    }
  }
}

Classic Popup

classic-center

classic-top-right

classic-top-left

classic-bottom-right

classic-bottom-left

This is our default layout and works great for alerts and exit intents.

Drawer or Slide-in panel

drawer-left

drawer-right

Side panels, or drawers, can be used to design menus or display ads.

Bar or Docker

bar-bottom

bar-top

This is great for cookie approval dialogs.

Mobile Design Mode

Show toolbar

Is the main option: if is not active, the elements listed bellow get hidden

Show Beefree SDK logo

Show our logo and links our site

Show preview

Trigger the preview window

Show send test

Trigger the function for sending a test

Show save as template

Is used to save only the editable version of the message

Show save button

If you don’t have a external one, better not to hide this 🙂

Show auto-save icon

This tiny icon alert the user every time the auto-save works

Show help link

This option is special, because you can also introduce your custom help URL

Show Multi-Language Templates

Use this to enable a custom top bar that allows the end user to change the language.

paid plans
methods from this page
Core plan
upgrade a development application
Custom CSS

Essentials

15,000

$0.01

Core

50,000

$0.01

Superpowers

250,000

$0.003

Enterprise

Custom

Custom

Content Services API (CSAPI)
useful tasks
saved row
technical documentation on the new “merge” method here
Development Applications documentation to learn how to create one

Edit form field modal

A reference of form fields that can be edited and that cannot be edited.

Form fields that can be edited

The following table provides an overview of the form fields that support the edit form field modal, including a description of each field and an example of its content.

Form Field Name
Description
Example Content

Checkbox

Allows the user to select one or more options.

"Subscribe to newsletter"

Color

Allows the user to select a color from a palette.

"#ff5733"

Date

Allows the user to input a date.

"2024-09-21"

Email

Allows the user to input an email address.

"[email protected]"

Number

Allows the user to input a numerical value.

"42"

Radio

Allows the user to select one option from a set.

"Option 1"

Select

Provides a dropdown menu for the user to choose from.

"Choice A"

Tel

Allows the user to input a phone number.

"(555) 123-4567"

Text

Allows the user to input a single line of text.

"John Doe"

Textarea

Allows the user to input multiple lines of text.

"This is a message..."

URL

Allows the user to input a web address.

"https://example.com"

Form fields that cannot be edited

The following table provides an overview of the form fields that do not support the edit form field modal, including a description of each field and an example of its content.

Form Field Name
Description
Example Content

Submit

Creates a button that submits the form.

"Submit"

Datalist

Provides a list of predefined options for an input field.

"Option 1, Option 2"

Datetime

Allows the user to input both a date and time.

"2024-09-21T14:30"

File

Allows the user to upload a file.

"Upload a document"

Hidden

Stores hidden data that the user does not see.

"userID=12345"

Image

Displays an image as a form button.

"Submit (image icon)"

Label

Defines a label for an input element.

"Username"

Month

Allows the user to input a month and year.

"2024-09"

Password

Allows the user to input a password.

"********"

Range

Allows the user to input a value within a range.

"50 (from 0 to 100)"

Search

Allows the user to input search text.

"Search query"

Time

Allows the user to input a time.

"14:30"

Week

Allows the user to input a week and year.

"2024-W38"

Custom File Picker

This feature is available on Beefree SDK Superpowers plan and above. If you're on the Core or Essentials plan, upgrade a development application for free to try this and other Superpowers-level features.

Main concepts

This feature allows you to have your own file picker for choosing files (images) in Beefree SDK's Editor, to make its integration in your platform look even more seamless. It leverages Beefree SDK’s Content Dialog feature. To set it up you will need to add the corresponding entry to the configuration object:


contentDialog: {
    filePicker: {
        handler: function(resolve, reject, args) {
            // Your function
        }
    },
    ...
}

The handler function lets you use your own logic to retrieve the desired value, and it has a Promise-like signature.

If data from Beefree SDK is available, it will be sent in the args parameter (see below). Once the value is available, you must call the resolve(value) function to pass it to the editor. In case you want to cancel the operation, call the reject() function.

Please note that a resolve or reject call is mandatory. If you miss this step, the editor will remain in waiting mode – and the error management on the host application must call the reject() function to unblock the editor.

The args parameter is where the File Picker’s Content Dialog will receive additional data.



{
    "X-BEE-UserName": "string", // e.g. image, all
    "X-BEE-Uid": "string", // e.g. the current user's id
    "X-BEE-Mimetypes": "string", // e.g. "*" -Or- "image/*"
}

Images dragged onto an image block or edited via the “apply effects and more” button will be passed to the image storage per your app’s file storage settings. To prevent images from passing through Beefree SDK’s file storage, the file upload can be disabled via advanced permissions.

Returned value syntax

Values must use the same pattern used in the configuration object: the returned object is validated against the expected format. If the validation fails, an error will be returned to the browser console, eg: Error getting content filePicker value, the item is malformed


{
   "url":"https://d1oco4z2z1fhwp.cloudfront.net/templates/default/113/rocket-color.png",
   "context":"imageModule.src"
}

A basic example

The following is the most basic example, which returns an image URL immediately after clicking the “Browse” button. This example does not open a file picker.

In a real-world scenario, the host application would display a file picker UI and let the user search for and locate the file before finally returning the file’s location (URL) to Beefree SDK:


contentDialog: {
  filePicker: {
    handler: function(resolve, reject) {
      resolve({
        url: 'string', // url to the file (e.g. http://www.example.com/myimage.jpg)
      })
    }
  },
}

List of modules

The following is a list of all modules that are sent as part of the args parameter:

  • sidebar.link

  • buttonModule.link

  • imageModule.link

  • iconsModule.link

  • menuModule.link

  • iconsModule.src

  • socialModule.src

  • textModule.link

  • imageModule.src

  • titleModule.link

  • row.backgroundImage

  • backgroundVideo.src

  • toolbar.specialLink

  • sidebar.specialLink

{
  "image": {
    "borderRadius": "30px"
  },
  "row": {
    "styles": {
      "backgroundColor": "red",
      "contentAreaBackgroundColor": "green",
      "verticalAlign": "bottom",
      "columnsBorderRadius": "10px",
      "columnsSpacing": "20px",
      "columnsStackOnMobile": false,
      "columnsReverseStackOnMobile": true,
      "columnsPadding": "42px",
      "columnsBackgroundColor": "yellow"
    }
  }
}
{
  ...
  "rows": {
    ...
    "columnsSpacing": {
      "show": true,
      "locked": false
    },
    "columnsBorderRadius": {
      "show": true,
      "locked": false
    }
  },
  "image": {
    ...
    "properties": {
      ...
      "borderRadius": {
        "show": true,
        "locked": false
      }
    }
  }
}
Beefree SDK plan types
Column Management article in the White label end user guide
Images article in the White label end user guide
Content Defaults
Advanced Permissions page
SDK Sample: Full-stack NextJS App
Beefree SDK: Official NPM Package
SDK Webinar: Saved and Synced Rows
Beefree SDK: Email and Landing Page Templates
SDK Sample: Simple Client HTML App

Popup Builder

Many digital marketing campaigns start with an attention-grabbing popup. In fact, many such campaigns include a popup, a landing page, and one or more emails.

  • A cool popup highlights something that the reader may be interested in

  • A landing page provides more information and includes some sort of signup form

  • Emails are sent to follow up.

Emails, pages, popups: three pillars of all sorts of digital marketing initiatives. Since Email Builder and Page Builder were already part of the Beefree SDK family, the natural next step was to create a Popup Builder. So here it is! This new version of the builder brings effortless popup creation inside your application.

Why Popups?

A popup is a small window that appears on a website visitor’s screen, asking for an email address in the most basic interaction or other actionable messages when using more sophisticated strategies (targeted promotions, social evidence messages, shopping cart recovery, etc.).

Popups are one of the most used online marketing tools. When done right, they capture visitors’ attention at the right moment, and push them forward in the customer journey. Despite attracting criticism in the past because they create a barrier between visitors and content, there’s plenty of evidence that they work. They will continue to play a strong part in any modern-day marketing strategy. Read our blog entry if you’re interested in learning more.

With this in mind, we have developed an embeddable solution for designing popups that you can easily deploy because:

  • it’s built from the ground up to integrate seamlessly with your application;

  • it’s easy to use, offers tons of design flexibility, and builds upon the same UX your customers already know from our Email & Page Builders;

  • all data stays in your application, and you don’t have to ask your customers to use 3rd party tools for building popups. You can leverage our Form block to add forms to popups

Sample workflow

In terms of packaging the final output, Beefree SDK takes care of the Popup design and returns a solid HTML output ready to be injected on a website. On top of that, you can enrich the building experience by creating a workflow that will add to that output:

  • Showing/closing behavior (e.g. display after N seconds, exit intent)

  • “Additional” styles, for things like

    • Close button

    • Border radius

    • Drop shadows

The good thing: you can pass additional styles to your application, so they will reflect into the editing experience. You will then take the HTML produced by Beefree SDK and apply these styles for the final output.

Main features

Our drag&drop experience, loved by millions of users

There are over 4,500,000 sessions of our drag-n-drop email & landing page builders every month, across hundreds of applications around the world. Popup builder brings the same, great user experience that transforms non-designers in masterful content creators.

What you see is what you get...finally for Popups

You can load your customers' website home page as a background, so they can design a popup in the exact context where it will be used. And with Mobile design mode, your users are one click awaying to seeing and perfecting how the popup looks on mobile devices.

Designed to fit any configuration workflow

Position, size, background color, and more. Customize the builder each time to match how your customer configured their popup inside your application. What this means for you is flexibility, peace of mind, and implementation speed.

Ready-to-go HTML output

Get a solid HTML output ready to be injected on your customer’s website. Your application controls the display and behavior conditions, Beefree SDK takes care of the content.

Drop personalized content in popups, in minutes

Personalization is the secret weapon to attract any audience. With Merge tags and Display conditions your customers can show the right message at the right time, with use cases like product recommendations and personalized discount codes.

Speed up the creation process with shared and pre-made assets

Your customers will never have to recreate the same content over and over again. They can apply the same saved rows already available for emails, landing pages or other popups. Plus, you may also provide custom rows with ready-made dynamic content like coupon codes and best-selling items.

File manager application overview

Managing assets with File Manager

The File Manager can be launched as a standalone application. This means that users can access the File Manager directly, without having to first launch the builder application. This is useful for situations where a user needs to quickly upload or manage assets, but doesn’t need to create a full email, landing page, or popup.

Instead of having to switch between different applications or tools, they can access everything they need from one centralized location. This can make the asset management process more streamlined and efficient, which can ultimately help users be more productive.

Testing and integrating the File Manager

When you create an application in the Beefree SDK Console, you’ll have the option to create a File Manager application.

Paid applications also include the option to create child development applications. These child applications can be used for new feature testing, development, and maintenance. By creating a child application, developers can easily test and iterate on new features without affecting the main application. This can help to minimize downtime and reduce the risk of introducing bugs or errors into the production environment.

The child applications can also be used for ongoing maintenance and updates. Instead of making changes directly to the production environment, developers can make updates and improvements in the child application, test them thoroughly, and then deploy the changes to the main application once they have been fully vetted. This can help to ensure that the main application remains stable and functional, even as new features and updates are introduced.

File manager applications share the same core functionalities as all other builders. These functionalities include authentication and configuration, which are necessary for the development process. If you have already integrated another builder into your workflow, you can easily re-use most of your work by using the same configuration for the file manager application.

For those who are new to our platform, our documentation includes a comprehensive Getting Started section that provides detailed instructions on how to set up and use our builders. This section is applicable to all products.

File Manager and all builders are available to customers under the same all-in-one pricing. Please contact your Customer Success Manager for more details.

Configure "Insert" and "X" Buttons

This section outlines steps to add the “Insert” and “X” buttons to your application’s user interface. These steps are specifically for the file manager.

Take the following steps to define the `onFilePickerInsert` and `onFilePickerCancel` properties to enable an “Insert” button and “X” button in the file manager user interface:

  1. Ensure that you have initialized the Beefree SDK and have a reference to the SDK instance (`bee`).

  2. Define the `onFilePickerInsert` property with a callback function that will be invoked when the user wants to insert a file. This function will receive the selected file data as the only parameter. You can use this data to perform any necessary actions, such as inserting the file into the editor or displaying a preview.

Here is an example of how the callback function can be defined:


onFilePickerInsert: function (data) {
  // Handle the selected file data
  console.log("File Inserted:", data);
  // Perform any necessary actions with the file data
},

IMPORTANT: This callback provides the host application with the file’s metadata and URL. If this callback is not implemented, the “Insert” button will not be displayed.

  1. Define the `onFilePickerCancel` property with a callback function that will be invoked when the user wants to cancel the file picker. This function does not receive any parameters. You can use this callback to perform any cleanup actions or provide feedback to the user.

Here’s an example of how the callback function can be defined:

 JAVASCRIPTCopy
onFilePickerCancel: function () {
  // Handle file picker cancellation
  console.log("File Picker Canceled");
  // Perform any necessary actions when the file picker is canceled
},

IMPORTANT: This callback provides the host application with the control to close the workflow. If the callback is not implemented, the “X” button will not be displayed.

  1. Assign the defined `onFilePickerInsert` and `onFilePickerCancel` callbacks to the corresponding properties in the Beefree SDK configuration. Make sure to include these properties when initializing the Beefree SDK.

Here is an example:


var beeConfig = {
  // Other configuration options...
  onFilePickerInsert: function (data) {
    // Handle the selected file data
  },
  onFilePickerCancel: function () {
    // Handle file picker cancellation
  },
};

// Initialize the Beefree SDK with the configuration
bee.start(beeConfig);

By following these steps, you will be able to define the `onFilePickerInsert` and `onFilePickerCancel` properties in the Beefree SDK configuration and enable the “Insert” and “X” buttons in the file manager user interface. You can customize the callback functions to suit your specific needs and perform any desired actions with the selected file data or when the file picker is canceled.

Storage Options

When configuring a builder application with Beefree SDK, you have four image and file storage options:

  1. Beefree SDK Storage: Default option. Images are hosted in Beefree SDK’s AWS S3 bucket. Potential fees apply for usage beyond the included limits.

  2. Existing Storage Application: Connect your builder to an existing storage application to share storage resources.

  3. Own AWS S3 Bucket: Use your own AWS S3 bucket instead of Beefree SDK’s. Follow the documentation to configure this option.

  4. Own File System: Integrate your application’s existing file system for storage. This option is available on Beefree SDK paid plans.

Reference the Storage Options documentation to learn more about how to configure storage for your File manager application.

Meta Tags

Meta Tags are available for Email Builder and Page Builder.

Overview

With Meta Tags, you can now apply various tags to your HTML that can greatly benefit your SEO and accessibility needs.

These Meta Tags include:

  • Title

  • Description

  • Subject

  • Preheader

  • Language Attributes

For the Email Builder, Meta Tags promote improved deliverability performance. For the Page Builder, Meta Tags promote greater customization and improved search engine results.

Page Builder

The following image displays the Title and Description fields from within the page builder.

Image 1.0 Page Builder Meta Tags

Title

A page title, also known as a Title tag, is a short description of a webpage that appears at the top of a browser window and in SERPs (Search engine results page). This is an important element of an optimized SEO page, as it affects the page ranking in search engines. The title tag will be located within the <title> element of a page’s HTML output, and its value will be saved inside the JSON template.

Here is an example of what a Title Tag inside Beefree SDK’s HTML output might look like:


<title>Done with love using BeefreeSDK</title>

Description

The description tag is located within the <meta> tag element of a page’s HTML, and it has a limit of 190 characters. The tag will be located within the <meta> element of the page’s HTML output, and its value will be saved inside the JSON template.

Here is an example of what a description tag inside Beefree SDK’s HTML output might look like:


<meta name="description" 
content="This is an example of a meta description. 
This will often show up in search results.">

JSON Page Builder Example

The following code snippet is an example of what the Meta Tags will look like inside the JSON.

    },
    "title": "Empty Template",
    "head": {
      "meta": {
        "title": "The Legendary Elephant King: A Tale of Love, Loss, and Redemption",
        "description": "Experience the timeless story of the elephant king and elephant son as they navigate through tragedy, friendship, and destiny in the elephant kingdom."
      }
    }
  },

Email Builder

The following image displays the Subject and Preheader fields from within the email builder.

Subject

The subject field has a maximum of 190 characters. Here is an example of what a subject tag inside Beefree SDK’s HTML output might look like:

<title>🐘 Experience the Epic Tale of an Elephant King!</title>

Preheader

The preheader field has a maximum of 130 characters. Here is an example of what a preheader tag inside Beefree SDK’s HTML output might look like:

<div class="preheader" style="font-size:1px;line-height:1px;display:none;color:#fff;max-height:0;max-width:0;opacity:0;overflow:hidden">
  Join the elephant son on a journey of love, loss, and redemption in the animal kingdom. 🌍
</div>

JSON Email Example

The following code snippet is an example of what the Meta Tags will look like inside the JSON.

    },
    "title": "Empty Template",
    "head": {
      "meta": {
        "subject": "🐘 Experience the Epic Tale of an Elephant King!",
        "preheader": "Join the elephant son on a journey of love, loss, and redemption in the animal kingdom. 🌍"
      }
    }
  },

Language Attribute

The HTML lang attribute is used to identify the language of text content on the web. This information helps search engines return language-specific results, and it is also used by screen readers that switch language profiles to provide the correct accent and pronunciation for accessibility purposes.

When loading the builder, the host application can specify in the configuration a list of languages for their users to choose from (e.g. en-US), see the example below where the only option “Italian, it-IT” is provided. If there are no values provided via configuration file, a standard list of common languages will be provided.


beeConfig: {
   ...
   metadata: {
      languages: [
         { value: 'it-IT', label: 'Italian' },
         ...
      ]
    }
}

Here is an example of what a language attribute inside Beefree SDK’s HTML output might look like:


<html lang="it-IT">

Content Area Padding

This feature is available on all Beefree SDK plans. It is available for Email, Page, and Popup builders.

Overview

Content Area Padding allows end users to precisely adjust the padding around the content inside of any row. This provides them with greater design flexibility, precision, and control. By managing padding on all sides—top, bottom, left, and right—they can fine-tune the spacing within their layouts to achieve clean, professional, and visually appealing designs easily.

By using Content Area Padding, end users can:

  • Design outer areas with different colors.

  • Add transparent borders.

  • Gain precise control over padding, borders, and spacing.

  • Use row-level padding to manage spacing without disrupting the row's content.

The following GIF displays how end users can apply padding around content within their rows.

Reference the white label end user guide to learn more about the end user experience. You can clone the Markdown files in this GitHub repository and customize the instructions for your application's end users.

Prerequisites

Prior to activating Content Area Padding, ensure you have the following:

  • A Beefree SDK plan

  • An application in the Developer Console with a Client ID and Client Secret

Activation

To activate Content Area Padding, you'll need to complete the following:

  • Enable the toggle in the Developer Console.

Note: Content Area Padding is on by default for new applications. For existing applications, it is off by default and will need to be toggled on in the Developer Console.

Developer Console Steps

Take the following steps to activate the feature within the Developer Console:

  1. Log in to your Developer Console account.

  2. Navigate to the application you'd like to activate it for.

  3. Click on Details.

  4. Click Application configuration.

  5. Navigate to the Services section.

    1. Toggle on the Enable content area padding option located in the second section.

GIF displaying the Enable content area padding toggle

Once you toggle on the feature, the Content Area Padding option will be available to your application's end users. In the builder, they can locate the option inside the Layout section under the ROWS tab.

Image of the builder sidebar displaying Content Area Padding

Optional Functionality

This section lists optional functionality available for Content Area Padding, including the option to set restrictions and permissions for feature access.

Content Defaults

Content defaults refer to the predefined settings for Content Area Padding that serve as the base configuration for all content within your application. By utilizing Content defaults, you can maintain uniformity across the user interface without needing to apply manual adjustments for each row.

{
  "row": {
    "padding": "20px",
    "paddingLeft": "25px",
    "paddingRight": "20px",
    "paddingTop": "15px",
    "paddingBottom": "10px"
  }
}

Learn more about Content Area Padding for Content defaults.

Advanced Permissions

Advanced Permissions in the context of Content Area Padding refer to the granular control settings that you can use to manage who can view and not view padding options within your application. These permissions ensure that only authorized users have access to adjust padding settings.

The following JSON displays an example of the show and locked boolean options with the padding configuration.

{
  "padding": {
    "show": true,
    "locked": false
  }
}

Learn more about Content Area Padding for Advanced Permissions.

Row AddOn | Simplified Rows Schema

With Row AddOns, you can create custom row structures that your users can gain inspiration from and design with. They give you greater control over the UI, enabling you to further personalize the experience you provide to your end users.

Simplified Rows Schema

The Simplified Rows Schema optimizes the definition of data structures, leading to consistent and reusable configurations. By implementing Content Area Padding within this schema, padding settings for Row AddOns are standardized, ensuring data uniformity. This uniformity simplifies custom API development and database integration by aligning data structures with application requirements.

Learn more about Content Area Padding for Simplified Rows Schema.

Additional Considerations

Consider the following when using Content Area Padding:

  • Content Area Padding is compatible with the Brand Management API. However, note that the Brand Management API is not compatible with the mobileStyles property.

Custom AddOns

Learn more about Custom AddOns, and how to develop and implement your own custom built AddOn.

This feature is available on Beefree SDK Superpowers plan and above. If you're on the Core or Essentials plan, upgrade a development application for free to try this and other Superpowers-level features.

Introduction

Custom AddOns are useful when there is a feature you'd like to offer within your application that is not available in our AddOn Marketplace within the Developer Console. In these instances, you can develop your own Custom AddOns for your application's end users.

Example of a Custom AddOn

Let’s say you embedded our email editor in your event engagement platform, which has a feature that allows event marketers to insert an event ticket’s QR code in marketing campaigns sent to create more engagement around an event.

  • You want those marketers, users of your platform, to be able to easily include a QR code in the emails they send to remind people about the event. That way ticket holders can use the QR code to quickly get into the event venue.

  • So you decide to create a “QR Code” addon: “QR Code” becomes a new tile in the Content tab in the editor.

  • Marketers drag and drop the tile, click on Select event to indicate which event the QR is for, and use the editor to style that section of the message (e.g. size, padding, etc.).

  • The QR code is created dynamically by your platform, at the time the email is sent to a ticket buyer.

  • The feature is specific to your application.

Availability

Custom AddOns are an advanced feature. As a result, the feature is available on the following plans:

  • Superpowers

  • Enterprise

Of course, there are exceptions to this requirement.

  • Testing: if you are not yet on a Superpowers or Enterprise plan, and you want to test building a Custom AddOn:

    • Create a development application.

    • Request an upgrade to the Superpowers plan.

    • Test as much as you want. If and when you decide that you wish to deploy your Custom AddOn in production, we will ask you to upgrade your production application to the Superpowers or Enterprise plan.

  • Development of a Partner AddOn:

    • You provide features that could be a good fit as an extension of our editors

    • You are not a Beefree SDK customer

    • Learn more about Partner AddOns

Getting started

Log into the Beefree SDK Console and locate any application that is on the Superpowers or Enterprise plans. Click on Details to navigate to the application details page. In the lower part of the page, locate the Application configuration section and click on AddOns.

You will be taken to a page that lists the addons that have been installed for this application. Since you are just getting started, the list is likely empty. Click on Create a custom addon to start the process of creating a Custom AddOn.

Refer to the AddOn Development documentation for all the details on building your addon.

Storage options

Understanding storage & content delivery options

When you configure a builder application, you have four options for image & file storage:

  • Beefree SDK storage: unless you select another option, images will be hosted in Beefree SDK’s own AWS S3 bucket. for details about potential fees associated with this option.

  • An existing builder application: to connect the selected application’s storage to an already existing application. After selecting this option the two applications will share their storage.

  • Your own AWS S3 bucket: instead of using Beefree SDK’s AWS S3 bucket to store & deliver files, you can use your own. See .

  • Your own file system: if your application already has a place where images and other assets are stored, you can leverage it. This option is only available on Beefree SDK paid plans. See using .

Custom File System Provider

When working with your own custom file system provider, there are many considerations to keep in mind. Follow the steps outlined in the documentation to ensure you configure this feature successfully for this storage option.

Images vs. other files

End users can upload images, PDFs, and other documents to the builder. For instance, they can link a button to download a PDF report.

Reference to learn more about the end user experience with the File manager.

If you need more control on what files users should be able to upload, you may activate in the Privacy & Security section of your app’s configuration. In alternative, you may consider .

About Beefree SDK storage

How images are stored & delivered

By default, images used in emails and pages created with the builder are stored in Beefree SDK’s file storage system. Beefree SDK uses service for storage, and leverages Amazon’s Content Delivery Network () for fast content delivery.

Storage and delivery fees

  • There are no charges for storing images & other documents.

  • There are no charges for delivering images & other documents up to a total of 5TB of delivery traffic per 30-day period.

  • Above 5TB of data traffic recorded in a 30-day period, you will be billed $0.01 per GB of data transferred.

  • Beefree SDK customers that exceed 50 GB of image data traffic on the Free plan in a given month will be moved to our .

Enabling the Move File Feature for Your File Manager

You can enable the move icon for files within the File manager. This move icon allows your end users to move their files between folders, locations, and so on within the File manger. They can access the move icon directly on the file within the File manager. The move icon is a folder with an arrow pointing right inside it. End users click this icon to initiate the process of relocating the corresponding file to a new destination.

If you are using the Beefree AWS S3 Bucket, take the following steps to enable this feature for your File manager.

Using the Beefree AWS S3 Bucket

If you are using your own AWS S3 bucket, take the following steps to activate the Move File feature:

  1. Ensure that your FSP is updated to the latest version.

  2. Navigate to the .

  3. Locate the Move File configuration toggle.

  4. Toggle the feature on.

The Move Feature will be available in your application.

FAQs on Beefree SDK Storage fees

Why do you charge for traffic when using BEE storage?

When you use the Beefree SDK S3 storage, your images are delivered via a Content Delivery Network (AWS Cloudfront), and AWS bills us based on the traffic generated by those assets when you send emails or publish web pages created with Beefree SDK. A large amount of monthly traffic (5TB) is included in your Beefree SDK paid subscription at no charge.

If you exceed the 5TB monthly traffic allotment, we ask you to cover the cost of the service (for a few of our customers that generate a lot of image data traffic, that cost has grown to exceed their Beefree SDK subscription fee). Also, note that this scenario is quite rare: it applies to less than 3% of our customers.

When does the traffic counter reset?

  • If you’re on a paid plan, billed monthly, the counter will reset on the same days as your UIDs and CSAPI calls, i.e., on the day your subscription to Beefree SDK is renewed.

  • If you’re on a paid plan, billed yearly, the counter will reset on the 1st day of each month.

  • If you’re on a free plan, the counter will reset on the 1st day of each month.

You can always see when the current period starts and ends in your application details, in the Statistics widget:

I’m on an annual plan. If I exceed the traffic quota in a month, when will I be billed?

You’ll be billed annually by summing up any paid traffic you may have accumulated during the past 12 months, unless such total were to exceed $1,000. In that case, we will send you an invoice. The same is true for additional user fees (UIDs) and additional API calls.

Do I get notified when I’m about to exceed the quota?

For the moment, only subscriptions on paid plans will be notified by our Customer Success team. If you’re on a free plan, you may check your usage by logging into the , and going into the application details, in the Statistics widget.

I’m using Beefree SDK storage. What can I do to avoid getting charged?

You can switch to or .

I connected my application’s storage to an already existing one. How will the billing work?

All traffic generated is charged to the shared storage. E.g.: an Email Builder application shares its storage with a Popup and a Page applications. In this case, the Email Builder application will be charged for the traffic generated by Email + Popup + Page.

Are there any restrictions when connecting an application’s storage to an already existing one?

  • It’s not possible to link a development app to a production app.

  • An app can be linked to another just once.

  • The same shared storage can be shared across different applications within the same subscription

Can I connect my dev app storage to a production app?

No, this is not possible. You can either connect production apps included in the same subscription or dev apps included in the same subscription.

Can I get a history of my monthly traffic usage?

Please contact your account manager for this. If you are not sure how to do this, please and submit a support ticket asking for your usage history.

Custom Color Palette

This feature is available on Beefree SDK only.

Color picker palette overview

The builder’s color palette gathers a list of the default colors to display from multiple sources in order to create a convenient palette of color selections when the editor loads.

Specifically, colors are gathered as follows:

  • 3 colors from the body (message background, content background, link) + black (#000000)

  • custom colors (as many as customers want)

  • 7 most recently used colors

Use the options outlined below to customize the default color palette.

Choosing the default colors in the color picker

The builder allows you to configure a custom color palette (per user), by modifying the client-side configuration. This, for instance, allows you to provide users with easy access to their company’s brand colors.

If no color profile is provided, then the builder will continue to suggest a color palette based on the colors used in the template that is being loaded.

Advanced Permissions for the Color Picker

You can set for the Color Picker on any builder type (Email, Page, or Popup). Advanced Permissions are available for and plans.

Through setting for the color picker, you can control the visibility of, and access to, color codes, the slider, and swatches that appear within builder. These customization options enable you to control access to various elements of the color picker for different end users of your application.

A few of the benefits of applying advanced permissions to the Color Picker are the following:

  • Enhanced brand control – Gain granular control over color selection to ensure brand consistency.

  • Improved user experience – Streamline the interface by showing only necessary elements.

A few scenarios in which these advanced permissions are particularly helpful include the following:

  • Customizing the color picker UI based on user roles or workflows.

  • Hiding unnecessary UI elements to improve accessibility and reduce distractions.

  • Enforcing strict brand color guidelines by limiting available color options.

Configuration Steps

Take the following steps

  1. Update the beeConfig File: Open the beeConfig file and locate the section for advancedPermissions. Within this section, ensure there is a field for components and add a new entry specifically for the colorPicker.

  2. Define Permission Settings: Within the color picker section, specify the necessary parameters that determine user access. Set the relevant parameters to either true or false, depending on whether the feature should be enabled or restricted for the end user.

Code Sample

The following code sample displays an example of how to add advanced permissions for the color picker to your configuration.

Available Settings

The table below outlines the configurable parameters for the color picker.

Parameter
Type
Description
Additional info

Note: If both canViewSliders and canViewSwatches are set to false, the popover will not open.

Disabling the color history

The builder will remember recently selected colors and add them to your color palette. If the browser’s privacy settings allow it, the color picker history will be saved in the browser’s local storage.

If you want the color palette to be static such that recently selected colors are not included, then you can disable the history in your configuration.

Disabling the template's base colors

The builder by default adds colors found in the template’s body section to the color palette.

If you want the color palette to only show the colors you pass in via the bee config document, then you must disable the base colors.

Line Height

Learn more about how to enable and configure Line height for your end users.

Line height is available for all Beefree SDK plan types, and for all builder types.

Overview

Beefree SDK offers the option to custom the Line height for designs within the builder. This provides end users with greater control over typography and design. The Line height widget includes both preset values with clear indicators, and a custom input field for precise adjustments. This degree of control supports workflows that require consistent, accessible, and brand-compliant typography.

Benefits

Line height includes the following benefits:

  • Clear Presets – Easily select from predefined Line height values for quick adjustments.

  • Custom Input – Enter exact Line height values (in percentage) for fine-tuned control.

  • Full Compatibility – Works smoothly with co-editing, history tracking, and undo/redo functions.

  • CSS Customization – Ensure brand consistency with advanced CSS styling options.

The following GIF displays an example of how your application's end users can utilize Line height throughout their content creation process.

Prerequisites

Line height is available in the Beefree SDK builder by default. The only requirement is that you have the builder embedded with your application and can load it successfully.

Advanced Permissions

You can use with Line height to show or hide the widget for the following module types:

Title

The following code snippet shows an example of how to set advanced permissions for Line height in the Title content block.

Paragraph

The following code snippet shows an example of how to set advanced permissions for Line height in the Paragraph content block.

List

The following code snippet shows an example of how to set advanced permissions for Line height in the List content block.

Button

The following code snippet shows an example of how to set advanced permissions for Line height in the Button content block.

Table

The following code snippet shows an example of how to set advanced permissions for Line height in the Table content block.

Form

The following code snippet shows an example of how to set advanced permissions for Line height in the Form content block.

Custom CSS Classes

You can use the following CSS classes to customize styles related to Line height on the Frontend of your application.

  • line-height-select--cs for the select element

  • line-height-select-wrapper--cs for the select element wrapper

  • line-height-custom-input-wrapper--cs for the custom input wrapper

  • line-height-custom-input--cs for the custom input element

Customizable Labels

You can use customizable labels to override the default text for Line height in the Beefree SDK builder and add your own.

  • bee-line-height-widget-custom-option allows users to customize the label for the last option in the Select component. The default value is Custom.

Additional Consideration

Consider the following behaviors when using the Line height widget:

  • The minimum value is 0.5.

  • The maximum value is 3.

  • When you select the Custom option from the Line height drop-down menu, you can click plus (+) or minus (-) to increase or decrease the Line height value. The Line height value will increase or decrease in increments of 0.1.

  • If you manually type in a value with two numbers after the decimal, for example 0.57, the Line height will be rounded to the first number as the final value. So, the final value would be 0.6.

CSAPI Overview

This feature is available on Beefree SDK only.

A richer content creation experience

Beefree SDK is a complete content design and creation platform for you to build upon. Our objective is to help you create a fantastic content creation experience for your customers inside your software applications.

As this may go beyond the interactions that happen within our email, page, and popup builders, we created an API to offer more assistance. We call it the Content Services API: it exposes a set of services that will help you provide a better experience with how emails, pages, and popups are created, updated, and transformed into different formats.

Overview

The Content Services API (CSAPI) – helps you achieve the following:

  • Retrieving the HTML of an email, page or popup created with a Beefree builder, so you can build a custom UX flow for saving messages. With the CSAPI, you can ask the Beefree system for the HTML whenever you need it.

  • Updating the HTML of an email, page or popup created with a Beefree builder, without user interaction. Why? For example, the HTML of an email template might need to be updated (e.g. to resolve a newly discovered rendering issue in an email client), and you don’t want to ask your users to open the email with the builder and resave it.

  • Outputting partial HTML that enables you to reuse code, increase consistency across your templates, and easily maintain your code.

  • Generating a thumbnail from the HTML, because thumbnails are always nice to have, for all sorts of reasons 🙂

  • Generating a PDF from the HTML, as your users may want to share or print an email or a page, and PDF is great for that.

  • Merging shared content () into emails and pages that use it (e.g. update 30 emails that use the same footer).

  • Use to make template-wide design changes to existing templates quickly and easily.

  • Generate versions of emails from JSON templates, ensuring emails look sharp and easy to read on any device.

  • to generate SMS, Metadata (Preheader and Subject), or Summary text from JSON templates.

Getting the HTML from a message JSON

This service allows the host application to build a custom workflow that doesn’t rely on the onSave callback in the editor (). Check our .

A Few Common Use Cases

Getting newer, better HTML

The first reason for this API to exist is a common use case: a transactional message was created months ago, it does not need to be edited in the editor, but its HTML code needs to be updated to benefit from fixes or changes that resolve rendering issues.

As you know, HTML for email is a mix of old markup – needed by email clients with a lack of support for standards – and advanced tricks used to take advantage of modern email client capabilities. The result is an environment that changes continuously, driven by the discovery of new techniques and by software updates released by the most popular email clients and browsers.

Having the ability to update the HTML without user interaction in the editor means ensuring that your customers can take advantage of the latest fixes or improvements, even if the messages are transactional notifications created years ago and never edited.

Displaying the preview for incorrectly saved messages

It’s not common, but it may happen that a browser crashes before the user saves a message they are working on. In this scenario, using the autosave or the onChange callbacks are enough to prevent any work loss. However, the host application ends up storing a message JSON without the HTML counterpart.

This presents the problem as the two files are out of sync, making things hard for the host application to get a preview, and, therefore, hard for the user to understand if they are looking at the right version of the message.

Using the API the host application can generate an updated HTML from the latest JSON, solving the issue.

Eliminating the need for “Save” buttons

A step further in the use case described above. Some modern applications remove any “Save” button from the UI, autosaving the work every time a change is applied (e.g. Google Docs). Through the onChange callback, your application can reproduce this behavior, and get the HTML from the saved JSON, when needed.

Getting additional output formats

The API provides some useful services that offer additional message formats, reducing the development effort in the host application.

Generating a PDF file from an HTML

A dedicated endpoint that transforms an HTML into a PDF document and supports the following options:

Page orientation

Landscape and portrait as available values.

Page size

Letter, A4, A3, and Full as available values.

While the other values split the message into pages, the Full option returns a single page using 900px as the page width and the proportional height.

PDF is often used in most approval processes, but is also a perfect format for printers. Check our .

Generating image files from an HTML

An endpoint that creates an image from an HTML source supporting the following options:

Width The image width in pixels

Height The image height in pixels

When the height is not provided, the API applies a proportional value based on the given width, keeping the image aspect ratio. When the Height value is provided, but not proportional to the given width: If it’s higher: the proportional value applies If it’s lower: the image is cropped

Check our .

Merging saved rows in existing messages

What if a footer is shared by 10 messages and needs to be updated in all of them? The feature was created precisely to address the scenario of content that is shared across multiple emails, pages, or popups, and it is used in conjunction with the Content Services API.

The of the Content Services API allows you to update a row across multiple messages. More specifically, it allows the host application to update an element in an existing JSON document. This means that, for instance, you could create a feature that takes care of updating existing messages in the background, without any further action by your users.

The of the Content Services API is a complementary method, designed to retrieve the assets which contain saved rows, so that you know which assets need update using the Merge method.

There are many use cases, including:

  • updating headers & footers;

  • changing the expiration date in a seasonal offer;

  • making price changes, link changes, etc. in content that otherwise can be re-used “as is”

  • etc.

Installing Partner AddOns

Visit our for a list of available and upcoming AddOns.

Getting started

You can use ready-to-go AddOns to extend the functionality of Beefree SDK (you can also ).

To browse and install existing AddOns, log into the and click on Details to navigate to the application details page.

In the lower part of the page, locate the Application configuration section and click on AddOns.

You will be taken to a page that lists the AddOns that have been installed for this application. If you are just getting started, the list will be empty.

Click on Browse Partner AddOns to get the list of ready-to-install AddOns. We call them Partner AddOns because they were developed by companies that partnered with us to extend Beefree SDK’s core functionality.

You will deal directly with those companies with regard to signing up for an account, cost, support, etc.

You will instead click on Create a Custom AddOn if you want to for Beefree SDK.

Installing an AddOn

When you click on the Browse Partner AddOns button, a list of AddOns is displayed. You can browse them and select what you need to install.

After installing a Partner AddOn, you will need to configure it by clicking on the Edit action. A form will be displayed.

At the top of the form you will find the AddOn name and some links to the AddOn documentation. If any signup is required, that is the company that you will need to contact.

Below that, you will see the following form fields:

  • API Key Shown if this is an AddOn where a signup is required (you will be provided with an API key once you have signed up). Contact the provider of the AddOn if that is the case, so that you can learn about signing up, costs involved, the type of support they provide, etc.

  • Handle A unique identifier for this AddOn. You will use this unique identifier to pass information to the AddOn from your application, if and when needed.

  • Enabled A toggle element to enable and disable the AddOn. When toggled OFF, the AddOn is not visible to end users of the builder in your application.

  • Icon If you want to customize the icon associated with the tile shown in the builder Content tab, you canupload an image from your local PC. Choose an image that is small in size: we recommend a 64 x 64 pixel SVG file.

  • Labels

    • Title: This is the name that will be used for the tile in the builder’s Content tab (e.g. “Countdown timer”).

    • Call-to-action button: The label for the call-to-action button (e.g. “Select a Countdown Timer”), which is shown to end users on the button to configure the AddOn.

    • Placeholder text: The message shown to end users in the builder stage when the tile is first dragged and dropped into it.

With the following setup…

… you would get the following outcome:

Title for the content tile

Placeholder text and button

It displays when the AddOn is added to the editing stage and invites the user to take the next step.

AddOn selection button in content properties

When the AddOn content is selected, the same button is displayed in the content properties.

Visit our to learn more about how to configure custom and partner addons.

Custom Headers

This feature is available on Beefree SDK and above. If you're on the Core or Essentials plan, for free to try this and other Superpowers-level features.

When to use it

This feature allows the host application to pass custom headers when it triggers a call to their services. The custom headers are added to and to calls.

For example, this could be useful for the security teams of , which would like to pass a JWT (JSON Web Token) when the user, through the file manager, triggers a call to their .

It may be also be used to protect application or customer-hosted content delivered to the editor, such as custom rows or other host app-specific content. The extra token helps the host application to apply an authentication layer to the contacted endpoints.

How it works

To activate this feature, the host application must add a specific element to the :

Please note that all custom headers will be prefixed with “X-BEE-“ identifier. For instance, in the example above, the header will be sent to the host app as X-BEE-Authorization.

Please note that custom headers must be whitelisted by our team before using them. Please open a support ticket via the if you’re planning to use this feature.


var beeConfig = {
        uid: config.uid,
        defaultColors: ['#ffffff', '#000000', '#95d24f', '#ff00dd'],
        ...        
const advancedPermissions = {
    ...,
    components: {
      ...,
      colorPicker: {
        canViewColorInput: true,
        canViewSliders: true,
        canViewSwatches: true,
      }
    }
}

canViewColorInput

boolean

Hides or shows the text input for the color picker in the sidebar.

Default value is true.

canViewSliders

boolean

Hides or shows the sliders inside the color picker popover.

Default value is true.

canViewSwatches

boolean

Hides or shows the swatches inside the color picker popover.

Default value is true.


var beeConfig = {
        uid: config.uid,
        disableColorHistory: true,
        ...        

var beeConfig = {
        uid: config.uid,
        disableBaseColors: true,
        ...        
paid plans
Advanced Permissions
Superpowers
Enterprise
Advanced Permissions
paid plans
saved rows
Brand Style Management
plain text
Leverage AI
list of available callbacks
reference documentation on how to use the API to get the HTML from a JSON file
reference documentation on how to use the API to get a PDF from an HTML file
reference documentation on how to use the API to get images from an HTML file
Synced Rows
Merge method
Index method

customHeaders: [
    {
        name: 'Authorization',
        value: 'Bearer ',
    },
    ...
],
Superpowers plan
upgrade a development application
FSP calls
Custom Rows
Custom File System Provider API
Configuration object
Beefree SDK Console
See below
Configuring your own S3 bucket
your file system
Move Files in the File Manager
the white label end-user documentation
file manager limitations
connecting the builder to your file system
Amazon Web Service’s S3
CloudFront
Essentials plan
Beefree SDK Developer Console
Beefree SDK Console
using your S3 storage
connect your file storage
log into the Beefree SDK Console
const advancedPermissions = {
  content: {
    // Hides the widget in the title module
    title: {
      behaviors: {
        canViewSidebar: true,
      },
      properties: {
        lineHeight: {
          show: false,
          locked: false,
        },
      },
    },
  },
};
const advancedPermissions = {
  content: {
    // Locks the widget in for the Paragraph module while keeping it visible
    paragraph: {
      behaviors: {
        canViewSidebar: true,
      },
      properties: {
        lineHeight: {
          show: true,
          locked: true,
        },
      },
    },
  },
};
const advancedPermissions = {
  content: {
    // Allows viewing the sidebar but hides the lineHeight property for lists
    list: {
      behaviors: {
        canViewSidebar: true,
      },
      properties: {
        lineHeight: {
          show: false,
          locked: false,
        },
      },
    },
  },
};
const advancedPermissions = {
  content: {
    // Locks the button widget but keeps it visible in the sidebar
    button: {
      behaviors: {
        canViewSidebar: true,
      },
      properties: {
        buttonLineHeight: {
          show: true,
          locked: true,
        },
      },
    },
  },
};
const advancedPermissions = {
  content: {
    // Hides the widget in the table module
    table: {
      behaviors: {
        canViewSidebar: false,
      },
      properties: {
        lineHeight: {
          show: false,
          locked: false,
        },
      },
    },
  },
};
const advancedPermissions = {
  content: {
    // Allows form block to be visible while locking properties
    form: {
      behaviors: {
        canViewSidebar: true,
      },
      properties: {
        labelLineHeight: {
          show: true,
          locked: true,
        },
      },
    },
  },
};
translations: {
  ...,
  "bee-line-height-widget-custom-option": "Other value", // Default is "Custom"
}
Advanced Permissions
Title
Paragraph
List
Button
Table
Form
Partner AddOn directory
build new AddOns
Beefree SDK Console
build a new AddOn
AddOns Configuration

Content options

In this box, you can enable additional content blocks that will appear in the Content panel inside the editor.

Currently, you can manage these content blocks:

Available Content Blocks

Block
Description
Availability
User guide

HTML

Allows your users to include their own HTML code

Paid plans only

Menu

Allows users to create simple, text-based navigation elements

All plans, including free

Title

Allows users to add text with H1,H2,H3 tags, for email and web accessibility, and for SEO on web pages.

All plans, including free

List

Allows users to create easy numbered and bullet lists with Paragraph’s upgrades and list type, spacing, and identation support.

All plans, including free

Paragraph

Allows users to write text with support for multiple font weights, copy/paste support, easier reformatting, and more.

All plans, including free

Text

Legacy text block. Please refer to title, paragraph and list.

All plans, including free

Video

Helps users include a visual link to video content

Paid plans only

Icons

Enables users to create icon-based layouts, such as star ratings, bullet lists, properties

All plans, including free

Spacer

Allows users to add a space between content

All plans, including free

Table

Allows users to add a table to their design

All plans

Content options in Page Builder

If you’re configuring a Page Builder application, there are a few differences in what these blocks allow:

  • the HTML Block also allows script and iframe tags;

  • the Video block allows for video playback, either embedding a YouTube, YouTube Shorts, or Vimeo video or pointing to a hosted video (read more). Supported video formats are:

    • YouTube (16:9 aspect ratio)

      • Public Videos

      • Unlisted Videos

      • Videos starting at a certain time

    • YouTube Shorts (16:9 aspect ratio)

    • Vimeo

      • Public Videos

      • Unlisted Videos

      • Cinemascope (21:9 aspect ratio)

  • the Menu block allows menu items to be set as “internal links,” pointing to any content block in the page that is configured as a “block identifier.”

There is also an additional option for turning on the Form block.

Please note that you need to implement one of the two methods indicated in this article for the Form tile to appear in the Content tab of the editor:

  • The default form method is available for all plans, including free

  • The content dialog method is available for paid plans only.

AMP Content

You can enable AMP blocks that will become available in the “Content” tab of your application's Email Builder. To enable this feature, toggle on Enable AMP Carousel in the AMP Content section of your application's configuration options.

We currently provide an AMP Carousel content block. After enabling the toggle, you will need to configure an AMP-compatible workspace.

Please note that AMP content is not available for Page Builder.

Hover Effect for Buttons

Hover Effect for Buttons is available on all Beefree SDK plan types and is available for Email, Page, and Popup builders.

Overview

The Hover Effect allows end users to design a standard view of buttons within their design, and a hover view of the button when a viewer of their email, page, or popup design hovers their cursor over the button. The Hover Effect for Buttons is available as a new content property available under the Content tab located within the builder's sidebar. Through applying this Hover Effect, your application's end users can design more attention-grabbing buttons within their design. Reference the Hover Effect for Buttons End User Guide to learn more about how this experience is for your application's end users. Continue reading this page to learn more about how to implement this feature.

To learn more about the end user experience and what it looks like to utilize this feature on the frontend, visit the Hover Effect for Buttons white label end user documentation. The markdown file is also available in our white label docs repository.

Important: Hover effects are supported by about 60% of email clients, with notable limitations in Outlook on Windows. View a list of email clients that are compatible with the Hover Effect Button.

Which email clients support the hover effect for buttons?

Hover effects are supported by about 60% of email clients, with notable limitations in Outlook on Windows. Reference this Can I Email resource to view a list of email clients that are and aren't compatible with the Hover Effect for Buttons.

The following GIF displays an example of a button within an email sent to an email client that does support the hover effect.

What happens if an email client doesn't support the hover effect for buttons?

If an email client doesn't support the hover effect for buttons, the email recipient will see the standard button properties used to design the button when they hover their cursor over it.

The following image displays an example of a button within an email sent to an email client that does not support the hover effect.

Prerequisites

Prior to implementing the Hover Effect button, ensure you have the following:

  • Beefree SDK Developer Console account

  • Any Beefree SDK plan type

Activation Steps

Take the following steps to toggle on and activate the Hover Effect for Buttons for your application:

  1. Log in to your Beefree SDK Developer Console.

  2. Navigate to the application where you'd like to enable Hover Effect for Buttons.

  3. Click Details to navigate to the application's details.

  4. Click Application configuration.

  5. Scroll to the Services section.

  6. Toggle on the Enable button hover feature.

The Button Hover section is now available under Content Properties within your application's builder.

Note: This feature is disabled by default for all existing applications. For new applications, it is enabled by default in the Page and Popup Builder, but is disabled by default for the Email Builder.

Content Defaults

The following table outlines the properties available within the hoverStyles object for buttons. These properties define the visual styles applied to a button when hovered over, including text color, background color, and border styles. Each property can be customized to create engaging and visually dynamic buttons that respond to the viewer's interaction.

HoverStyles Properties

The following table displays each hoverStyles property and its corresponding data type, example, and description.

Name
Data Type
Example
Description

color

String

"#FFFFFF"

Sets the font color of the button when hovered.

backgroundColor

String

"#16688B"

Defines the background color of the button on hover.

borderTop

String

"0px solid transparent"

Specifies the top border's size, style, and color for the button when hovered.

borderLeft

String

"0px solid transparent"

Specifies the left border's size, style, and color for the button on hover.

borderBottom

String

"0px solid transparent"

Specifies the bottom border's size, style, and color for the button on hover.

borderRight

String

"0px solid transparent"

Specifies the right border's size, style, and color for the button on hover.

HoverStyles Inside the Button Schema

The hoverStyles object defines the visual changes that occur when a viewer hovers over a button with their cursor on a desktop. It allows you to set hover-specific styles such as font color, background color, and border appearance. These properties can be customized directly in the builder's Content Properties for the button. For example, changing the backgroundColor in the Button Hover sub-section of Content Properties will update the button to reflect that color when hovered over. You can reference an example of a complete Button Schema on the Content Defaults page.

"hoverStyles": {
  "color": "#FFFFFF",
  "backgroundColor": "#16688B",
  "borderTop": "0px solid transparent",
  "borderLeft": "0px solid transparent",
  "borderBottom": "0px solid transparent",
  "borderRight": "0px solid transparent"
}

Additional Considerations

Consider the following when using this feature:

  • The mobileStyles and hoverStyles properties are not supported by the Brand Style Management API.

  • View a list of email clients that are compatible with the Hover Effect Button.

Stability AI

The Stability AI AddOn is only available for Superpowers and Enterprise plans.

AI Stable Diffusion XL AddOn Text-to-Image

The Stability AI AddOn converts text to images. This feature allows your end users to submit descriptions of what they would like to see in their AI-generated images, and to also submit negative prompts of what they do not want to see in their image. Once they submit the prompt and negative prompt, they'll receive an AI-generated image that they can use directly within their designs. Visit the AI-generated white label end user guide to learn more about how this feature works for your application's end users.

How to activate

This section discusses the prerequisites and steps you need to take to get started with this feature.

Prerequisites

  • Stability AI API key

  • Stability AI addOn installed in the Beefree SDK Developer Console

Take the following steps to activate this feature:

  1. Log in to the Beefree SDK Developer Console.

  2. Navigate to the application you'd like install the addOn in.

  3. Install the Stability AI addOn.

  4. Provide the requested details.

  5. Save your changes.

The addOn is now activated.

Configuration settings

The Stability AI text-to-image AddOn uses a new handle.

This handle is ai-image-generation.

Consider the following settings when configuring this feature in your code:

Parameter
Type
Description
Additional Information

imagesAvailable

number

Images available.

If not provided images are not counted and the user can generate an infinite number of images.

imagesUsed

number

The images used.

isGenerationDisabled

boolean

Disable the generation.

False by default.

upsellTrigger

number

Represents the number of remaining images that will show the upsell CTA.

Default is 3.

isUpsellEnabled

boolean

Enable or disable the upsell.

Default is false.

folderName

string

The name of the folder where the images will be saved.

Default is “AI Generated Images".

Sample code

This section includes sample code you can use to configure this AddOn.

onInfo example

Use the following code sample to configure this feature for your application.

onInfo: function (infoMessage) {
  if (infoMessage.code === 1000) {
    var handle = infoMessage.detail.handle

    if (handle === 'ai-image-generation') {
      imagesCounter += infoMessage.detail.consumedImages
        const refreshedUsageSettings = {
          addOns: [
            {
              id: "ai-image-generation",
              settings: {
                imagesAvailable: imagesAvailable,
                imagesUsed: imagesCounter,
                isGenerationDisabled: (imagesCounter >= imagesAvailable) ? true : false,
                upsellTrigger: 3,
                isUpsellEnabled: isUpsellEnabled,
              }
            },
          ],
        }
        // Reload Config
        bee.loadConfig(refreshedUsageSettings)
      }
  }
},
Upsell example

Use the following code to communicate to your end users when they have used all of their available image generations for this feature and need to purchase more.

upsell: {
  label: 'upsell',
  handler:(resolve, reject, args)=>{
    if(args.handle === 'ai-image-generation'){
      imagesAvailable+=5
      resolve({
        addOns:[{
          id: "ai-image-generation",
          settings: {
            imagesAvailable: imagesAvailable,
            imagesUsed: imagesCounter,
            isGenerationDisabled: (imagesCounter >= imagesAvailable) ? true : false,
            upsellTrigger: 3,
            isUpsellEnabled: isUpsellEnabled,
          }}]
        })
    }
  }
},
Disable generation per user example

Use the following code to disable this text-to-image generation for a user of your application. This feature will still be visible within the builder, but they will not be able to use this. A potential use case for this is if you'd like to motivate an end user to upgrade for access to this feature.

addOns: [
  {
    id: "ai-image-generation",
    settings:{
      isGenerationDisabled: true,
    }
  },
],
Disable AddOn per user

Use the following code to disable this feature for a user of your application.

addOns: [
  {
    id: "ai-image-generation",
    enabled: false,
  },
],

Methods and Events

Instance Methods

Note: If initializing a File Manager application, the only supported method is beePluginInstance.start() without parameters.

Assuming that beePluginInstance is the instance of your embedded builder application, here are the methods you can call:

Method
Description

If you use a paid plan, you can hide the top toolbar and control the builder from your application’s user interface. For example, it’s up to you at that point to have buttons above or below the builder. Here’s some useful methods for this scenario:

Method
Description

Instance Events

The top toolbar displayed by default within the builder contains buttons that trigger certain actions. These are the callbacks that are triggered when the buttons are clicked.

Event
Description
Returned values

Email Builder

Learn more about what Beefree SDK's embeddable no-code email builder is, how to test it out, and how to integrate it into your SaaS application.

Introduction

Beefree SDK’s embeddable no-code email builder offers a solution that empowers creators to design visually striking, high-converting emails with ease. By removing technical barriers, it enables teams to build, customize, and launch campaigns faster, maximizing results without the need for hard coding. This allows marketers, designers, and content creators to focus more on designing and refining their email strategies, rather than spending time coding emails from scratch.

Email marketing remains one of the most effective digital channels, delivering an impressive —for every $1 spent, businesses see an average return of $36. In a landscape where personalization and quick execution are critical, no-code email builders like Beefree SDK make it easier for teams to create and optimize these high-performing, targeted campaigns. Personalized campaigns, which , are more easily executed with tools that free teams from coding, allowing them to concentrate on strategy and design. By simplifying the email creation process, Beefree SDK enables creators to spend less time on technical tasks and more time driving results through impactful, strategic designs.

What is the Email builder?

The email builder within Beefree SDK is a no-code drag-and-drop editor that enables end users to design beautiful emails that resonate with their audiences. Within the email builder, end users have access to both simple email creation tools, such as adding content blocks, and advanced email creation tools, such as dynamic content, merge tags, display conditions, html blocks, and so on. Beefree SDK’s email builder was created with email marketers, copywriters, designers, and other content creators in mind. It provides them with an environment to intuitively create emails without having to write a single line of code, while being able to easily export their design’s HTML code if they ever need it. Overall, Beefree SDK’s email builder democratizes the email creation process by providing a no-code route for your application’s end users to create visually stunning and appealing emails for their audiences.

Embedding Beefree SDK’s email builder is quick and easy. Once you embed the SDK within your application, you’ll already have access to a host of default features that are instantly available to your application’s end users. In addition to these default features, Beefree SDK also offers a variety of optional features you can easily activate by simplifying toggling them on in the Developer Console. If you want to customize the email builder further, you can also integrate with our, , add , and much more. You can reference of the level of customization that is possible with Beefree SDK.

In the following GIF, you can see an example of differently customized experiences.

Email builder capabilities

On a foundational level, the Email builder includes the capabilities detailed in the following table.

Note: Additional capabilities and features can be added on top of these through , toggle on options in the , , , , and more.

Foundational feature
Description
Image

Test out the Email builder

There are various tools you can use to experiment with and test out the Email builder to learn more about it.

The following resources are a great start to learn more:

    • You do not need a Client ID or Client Secret to experiment with the Email builder in this environment.

    • You do not need a Client ID or Client Secret to experiment with the Email builder in this environment.

    • You do need a to experiment with the Email builder in this environment.

Integrate the Email builder

To integrate the Email builder, take the following steps:

  1. in the

  2. within the Developer Console

  3. Obtain your Client ID and Client Secret

  4. Authenticate

  5. Use the to and embed Beefree SDK

Visit to learn more about installing Beefree SDK.

Advanced settings

What if the default styles and standard settings aren’t enough? No worries! In the following sections, we will look at styling your popup to make it look and feel more like the one real visitors will interact with.

Custom styles (themes)

A theme is simply a set of custom styles that give the popup its look and feel. Separate from your layout, Popup Builder comes with some preset themes. The primary is our default theme that is loaded when no settings are specified. We also provide an empty theme that has no styles, which you can use a blank canvas to create your own theme. This is one of the most powerful features of Popup Builder, and we’ll be covering custom styles in depth below.

Here is a preview of the configuration:

Applying styles to the HTML

To understand the best way to apply your styles, let’s start by inspecting the underlying HTML structure so you can view where the system will map your styles.

Popup HTML

Here is a quick break down of what each div does:

This is where you will apply any styles related to how the popup looks, such as border-radius, drop shadows, background colors, or padding.

The header is sometimes used to add a close icon to a popup or display a title.

The div that holds the editable content of your Beefree application.

You can use this div to show a traditional footer for your popup or position some icons outside the popup container (e.g., a close button).

The above HTML structure is represented in your bee config as the following JSON object.

Add styles to the JSON section that corresponds to the HTML element you want to style.

For example, if you want to apply styles to the div with id popup-container, then you would add the styles to the following JSON:

We’ll go deeper into styling in the following sections.

Order of operations

You may be wondering at this point if you have to design an entire theme to get started. Well, you can if you want to, but thanks to the order of operations, you don’t have to. You can start with our default theme and pass in the styles that you want to override. Any style you provide will take priority over any of the defaults.

Starting from scratch

We said that you could start from scratch if you want, and the easiest way to do that is by using our theme parameter. This allows you to avoid overriding every default style and gives you an empty canvas to build your own theme.

Example:

Applying custom styles

Now that you have seen what the HTML looks like and have some idea where to apply your styles, let’s look at how you get your styles into the editor. The best way to show you is by example, so let’s get started with some common use cases!

Adding a border

Using the schema JSON above and your HTML structure knowledge, you probably guessed that the border is defined on the popup container. So here’s what that would look like:

Example:

Adding a drop shadow

Example:

Deep-dive into CSS properties

After looking at a couple of samples, you may notice these parameters are looking familiar. That’s because every layer of our schema maps to a layer of HTML with the same name AND can be styled with any valid CSS property.

Basically, CSS properties are the same as CSS used by web developers in style sheets, but instead of dashes to separate words, it uses a camel case.

Example:

The CSS property of the style box-shadow would be boxShadow.

Why not use CSS styles as defined by CSS3 specification directly? Well, simply put, CSS properties are better suited for JSON and can easily be shared with any FE application using the popular React framework.

Custom layouts

We covered the default layout settings in Setting layout and size section. To recap, the layout determines the type of popup (e.g., a bar) and its location on the screen (e.g., bottom, top, or side). Our research team looked into it, and it turns out, nearly all popups fall into one of the most popular layouts, which we’ve included as presets. But, when that’s not enough, the configuration option customLayout can be used to make minor adjustments to a preset layout or create an entirely new layout from scratch.

Here is a preview of the configuration:

The layout HTML

The popup is positioned in the workspace using divs and CSS flexbox. We created a layout structure that mimics an HTML page to map your page’s styles to the workspace.

Layout HTML:

Div List and Descriptions

Here is a quick break down of what each div does:

We will apply the styles placed here to the document HTML tag.

We will apply the styles placed here to the HTML body tag

This is the main container div of the workspace.

The wrapper of the popup is used entirely for positioning the popup within the workspace main div.

Changing the position of a layout

Example:

Form structure and parameters

Overview

A form is defined through the structure object, which includes its main properties.

This is the object that the host application passes to Beefree SDK, and it includes fields, layout, and attributes along with a title and a description string values that you can use. The appearance of the form, in terms of styling of labels / fields / buttons (spacing, colors, etc…) is handled directly in the application and is saved in the design’s JSON file. Therefore, the same form can be used in different designs, and have message-specific styles.

To take a look at real-world examples and samples, you can head to .

Let’s now examine the anatomy of a Beefree SDK form structure.

Attributes

This object contains the general form attributes as strings: all of them are standard HTML5 attributes.

Property
Value

Fields

An object that lists all the form fields included in the form with its relative properties. The order in which they appear only matters if you to an application. If you want to use the content dialog to feed forms in the builder, the order is not relevant and you can set the form layout in the layout array.

Beefree SDK supports the vast majority of standard HTML5 form fields. A few of them (such as color, datetime, datalist) have mixed browser support, so please make sure to check before using them.

To see them in action, you can find a few examples on . Head over to if you need the full list of allowed field types, along with the available attributes and options for each of them.

If you want to use a single form, you can use the optional canBeRemovedFromLayout and removeFromLayout attributes to determine (respectively) if that specific field can be removed from the layout by the user, and if it should appear in the stage when the form is dragged in.

Indicate when a field can be toggled off

Attribute
Applies to
Type
Default value

This attribute indicates that a field can be toggled off by the user. If unspecified, it will be applied as true, allowing the user to switch it on or off in the builder UI.

It’s a best practice to add canBeRemovedFromLayout: false to mandatory fields (e.g., the email address field in a sign-up form) so that they can’t be excluded in the HTML form.

Toggle off a field when loading a form

Attribute
Applies to
Type
Default value

This attribute indicates that a field is toggled off by default when the form is loaded. This behavior is particularly useful to simplify the user experience when you implement forms in the builder through a .

Layout

If you want to leverage the full power of Beefree SDK forms and use a content dialog to feed the form to the editor’s stage, the layout array will determine how the fields will appear to the user.

Each layout element is an array itself and represents a single line of fields. This allows different layout dispositions, including multi-column.

Probably the best way to represent this is with an example:

Title and description

The form title is a string value. It is not displayed to the user while working in the editor but provides extra information that can be used later for troubleshooting. Likewise, description as a string value that is not displayed to the user while working in the editor, but provides extra information that can be used later for troubleshooting or internal reference.

Using reCAPTCHA

reCAPTCHA is a free service from Google that helps protect websites from spam and abuse. To learn more about reCAPTCHA, visit the or Google site.

To embed Google ReCaptcha in a Form you need a Google API key for ReCaptcha, the key has to be enabled for a specific website URL or domain; this is crucial because otherwise the script will load but will fail its validation, returning API key errors.

Here’s what’s needed in the submit action when passing a form configuration:

In addition, you have to add an HTML block that imports the reCaptcha library inside the template that encapsulates the form:

Here’s a sample JSON config for the submit button:

Ensure you keep the following in mind:

  • Make sure HTML sanitize is OFF (this is the default value).

  • Remember that the reCaptcha UI elements will be visible neither in the Beefree SDK work area nor in the Preview, but they will be integrated when the page will be published. Furthermore, the page has to be hosted on the domain that was enabled on the Google Developers Console when setting the reCaptcha.

Form layout customization

Explore how to implement customization options for a form's layout.

This feature is available on all and applies only to and builders.

Overview

This document outlines how you can customize a form’s layout, and discusses the available layout customization options. These options allow you to adjust various elements of forms to improve your end's user experience creating them. Form layout options ensure your application's end users have more tools to create a more effective presentation of their forms.

Key form layout customization options include:

  • Multiple choice and radio button orientation: You can adjust the orientation of multiple choice and radio button elements, choosing between horizontal or vertical alignment to suit your design preferences or space constraints.

  • New layout presets: Three layout presets are available: horizontal, vertical, and grid. These presets define the overall structure of the form, allowing you to easily apply a consistent layout across fields.

The form field width includes the following customization option:

  • Form field width property: A new boolean property, fullWidth, enables you to manage form field widths. When set to true, the field will expand to 100% width. When set to false, it the field width is set to 50%.

The following video provides a visual representation of these customization options and how they function within the user interface.

Prerequisites

Prior to getting started, ensure you have the following:

    • Page builder or Popup builder application within your

Implementing Multiple and Single Choice Orientation

For this implementation, there is a field called orientation in the JSON at the field object level. This field controls the layout orientation for multiple-choice and single-choice fields, which include radio buttons and checkboxes. The orientation field accepts the following two values:

  • horizontal

  • vertical

Default behavior: If the orientation field is not included in the JSON, the form will default to horizontal orientation both on the backend and the frontend.

JSON Structure Example

The following JSON display an example of the updated structure for a radio button field with the orientation field included:

Steps to Configure the Orientation Field in JSON

Take the following steps to configure the orientation field:

  1. Locate the form field object in the JSON: Find the field you want to configure, such as a radio button or checkbox field. This will be under the "fields" key within the JSON structure.

  2. Add the orientation property: Inside the field object, add a new property called orientation.

  3. Set the value: Assign the orientation field a value of either "horizontal" or "vertical", depending on how you want the options displayed in the form.

  4. Save the changes: After making the necessary updates to the JSON structure, ensure that the changes are saved.

  5. Test the form: Once the JSON is updated, test the form to ensure that the options are displayed in the correct orientation. If the field is missing, check if the default horizontal orientation is applied.

These steps will allow you to effectively control the layout orientation of multiple-choice fields in your forms.

Implementing New Form Layout Presets

The layout of the form fields can be controlled using a new layoutPreset field. This field is located in the structure object of the JSON and supports three possible values:

  • vertical

  • horizontal

  • grid

Note: If the layoutPreset is not defined in the JSON file, the Form will use a horizontal layout structure.

JSON Structure Example

Here is an example of a form JSON structure utilizing layout presets:

Layout Presets

The following list shows the available options for layout presets.

  • Vertical: Fields will be stacked vertically, one on top of another.

  • Horizontal: Fields will be aligned horizontally, side by side.

  • Grid: Fields will be organized into a grid layout, allowing for more complex positioning.

Steps to Configure Form Layout Presets in JSON

Take the following steps to configure the layoutPreset field:

  1. Locate the structure object in the JSON: Find the structure key within the form’s JSON definition where the fields and layout are defined.

  2. Add or modify the layoutPreset field: Inside the structure object, add a new property called layoutPreset.

  3. Set the desired value: Assign the layoutPreset field one of the following values to control the layout of the form:

    • "vertical": Stack fields vertically.

    • "horizontal": Align fields horizontally.

    • "grid": Organize fields in a grid format.

    Example:

  4. Configure field properties (if applicable): If you are using the grid layout, you may also need to adjust other field properties like fullWidth to control the width of individual fields. For example, set "fullWidth": true to make a field span the full width of the grid column.

  5. Save and test the form: After setting the layoutPreset, save the updated JSON structure and test the form layout to ensure the fields are displayed according to the selected preset.

By following these steps, you can easily configure and control the layout of your form fields using the new layoutPreset field.

Implementing the fullWidth Field

A new boolean field, fullWidth, has been introduced within each form field object. This field is applicable only when the layout preset is set to grid. If a layout other than grid is used, the fullWidth field will be ignored or removed from the JSON structure.

In a grid layout, setting fullWidth to true will cause the form field to span the entire width of the grid column, while setting it to false will restrict the field's width to a smaller portion of the grid.

Steps to Configure the fullWidth Field in JSON

Take the following steps to configure the fullWidth field:

  1. Ensure the layout preset is set to grid: The fullWidth field only functions when the form’s layout preset is set to "grid". Verify that the "layoutPreset" field in the JSON is set to "grid".

  2. Locate the desired form field: In the JSON structure, find the field you want to configure, such as an email or text field.

  3. Add the fullWidth field: Inside the form field object, add a new property called fullWidth.

  4. Set the boolean value:

    • Set fullWidth to true to make the form field span the entire width of the grid column.

    • Set fullWidth to false if you want the form field to occupy half or a portion of the grid column.

    Example:

  5. Save the changes: After adding or modifying the fullWidth field, save the updated JSON structure.

  6. Test the form in grid layout: Ensure that the form’s layout is set to grid and that the field's width behaves as expected.

By following these steps, you can effectively configure the fullWidth property to control the width of form fields in grid layouts.

End User Interaction

  • Layout Widget: End users can change the layout preset using a layout widget available in the form sidebar.

  • Field Width Widget: When the form is using the grid preset, the fullWidth field can be modified by users through a field width widget available in the Manage Fields section or the Edit Form Modal.

The Submit field will always have fullWidth set to true, and the corresponding widget will be disabled to ensure it spans the full width. For more details on the end user experience, reference the .

Display Conditions

This feature is available on Beefree SDK and above. If you're on the Essentials plan, for free to try this and other Core-level features.

How they work

Display conditions allow you to change the content that is shown to a recipient of an email depending on who the recipient is.

Your users will have the ability to pick a condition (or write one from scratch if they are technically savvy), apply it to a row, and thus show different content based on who the recipient (or viewer) is.

The feature provides a number of benefits, including:

Ease of use for email designers

Display conditions allow anyone that is using the builder to easily create personalized messages without writing a line of code.

Any syntax for the conditional statements

Use whatever syntax your application understands. The feature is language agnostic: it can be used with whatever syntax matches your tech stack. Does your sending engine understand the Liquid markup? Then you can use Liquid. Does it use a proprietary templating language? No problem.

User permissions

Restrict access to some of the functionality based on user roles. For example, some users may be able to edit the syntax of the conditional statements, while others may not. Use this flexibility to simplify the UI or promote upselling.

Activating and using the feature

Please note that the Display conditions are disabled by default. You can turn this feature on by enabling it under the . You must be on a paid plan (Core subscription and above) to enable this feature.

As the application hosting the builder, you can now pass an array of conditions.

Those conditions become available for users of the editor to select, assuming the feature is turned on and the user has permissions to apply a condition to a row.

They will do so by browsing through categories or searching by keyword. For example…

The condition that they pick is applied to the row and displayed when the row is selected.

It can be changed (i.e. the user decides to apply another condition) or edited (if the user has the technical skills to do so, and its user role has been granted those permissions).

When the Preview feature is accessed, users can now simulate what recipients in a certain segment will see by toggling Display conditions on and off.

Display conditions and user roles & permissions

When active, the feature is available to all users by default. You can manage who can see and/or do what by leveraging user roles and permissions.

When the feature is ON, new permissions are available for you to configure when you create or edit a Role.

A basic set up allows you to have 3 user levels:

  1. Can only view & preview

    • None of the above options are selected

    • No widget will be shown unless the loaded message has display conditions assigned to one or more rows

    • If conditions are applied:

      • They are shown as ready-only

      • They can be applied in the Preview

  2. Can only select

    • Only Can select conditions option is selected in the role settings (remove will be automatically selected too)

    • The widget shows and the user can select and apply any of the conditions specified in the editor configuration

    • The user cannot add a new condition

    • The user cannot edit a selected condition

  3. Full control

    • All permissions are selected

    • The user can select and edit conditions (if provided) or add a new condition

Note: if there are no Display conditions passed in the configuration, and the user has the rights to access the feature, the editor will only show the Add condition action, which allows users to apply a new condition to a row by manually adding the condition’s syntax.

Additional information

Identifying a row with an applied display condition

It’s easy to identify a row to which a display condition has been applied. A bifurcation icon is added to the row’s “Structure” tag, which is shown as you mouse over the row. Here’s an example:

Custom conditions

When a default Display condition is edited – by a user that has permissions to do so – it becomes a custom condition. Custom conditions are easy to recognize because:

  • A blue dot is added next to the condition’s name

  • The “Change condition” button is no longer available: a custom condition can only be removed

  • The cancel icon is replaced by a trash button because an edited condition, once remove, is lost: it cannot be re-added.

Why these different behaviors for custom conditions? Because Beefree SDK does not save them to the configuration (you passed that configuration to the application: we don’t have access to the repository where you save that information). So, custom conditions do not exist in the array of conditions that the user can search and/or browse.

Reference our to learn more about managing the visibility of the Add Condition and Edit Condition buttons.

HTML output

Conditional syntax and row content are isolated from each other in the HTML generated by Beefree SDK, so your system can delete, repeat or change elements inside the row without impacting other parts of the message. For example, the HTML of a row might look like this:

Extending Display Conditions

You can extend this feature and allow users of the editor to build their own Display Conditions, on the fly, using a UI that you control. It’s part of the functionality. This is an advanced feature that requires some development on the side of the hosting application, but that provides fantastic flexibility.

Here is an example of a custom builder of Display Conditions.

beePluginInstance.start(templateToLoad)

Starts the builder, loading the templateToLoad JSON string with the template structure (if specified). If using the NPM package, you have additional options to pass here as defined on the NPM page.

beePluginInstance.load(template)

Loads the JSON template string specified in the template parameter.

beePluginInstance.reload(template)

Loads the JSON template string specified in the template parameter. Unlike beePluginInstance.load(template), the reload method does not trigger a loading dialog. This method helps quickly reload a template seamlessly for specific use cases, such as using a custom undo/redo feature or injecting custom content in real-time.

beePluginInstance.preview()

Triggers the message preview behavior within the builder.

beePluginInstance.togglePreview()

Open/close the message preview behavior within the builder.

beePluginInstance.toggleStructure()

Controls the visibility of the structure outlines in the message editing portion of the builder.

beePluginInstance.save()

Invokes the onSave callback function. The application will pass two files to the function: a JSON file with the message structure (for later editing) and a ready-to-send HTML file.

beePluginInstance.saveAsTemplate()

Invokes the onSaveAsTemplate callback function. The application will pass to the function a JSON file with the message structure (for later editing).

beePluginInstance.send()

Invokes the onSend callback function. The application will pass to the function a ready-to-send HTML file.

beePluginInstance. toggleMergeTagsPreview()

Controls the visibility of sample content for merge tags in the message editing portion of the builder.

onSave

Fired when the Save button is clicked.

JSON and HTML documents

onSaveAsTemplate

Fired when “Save as template” is clicked.

JSON document

onAutoSave

Fired automatically based on autosave configuration parameter value.

JSON document

onSend

Fired when the “Send a test button” is clicked.

HTML document

onLoad

Fired when the JSON is loaded in the builder.

JSON document

onError

Fired every time an error occurs.

Error message

onPreview

Fired every time the preview button is pressed.

Status (Boolean)

onTogglePreview

Fired every time the preview is opened or closed.

Status (Boolean)

onChange

Fired every time a change on the message is performed.

Read More

onRemoteChange

Triggers during co-editing sessions. It notifies the frontend about changes made by other users in the session.

Note: This is for users B, C, D, and so on, while onChange is specific to the main user, User A, making the change.

Read more about onRemoteChange and tracking changes. Read more about collaborative editing.

onComment

Fired every time a thread or comment changes.

Read More

onFilePickerInsert

Fired when the “insert” button is clicked. This property must be defined by the host application for the insert button to appear within the user interface. Available for File Manager applications only.

Object with file info

onFilePickerCancel

Fired when the “X” button is clicked. This property must be defined by the host application for the cancel “X” button to appear within the user interface. Available for File Manager applications only.

None


workspace: {
  popup: {
    customStyles: {
      ...
    },
  }
}

<div id="popup-container">
  <div id="popup-header">
    <div></div>
    <div></div>
  </div>
  <div id="popup-content">
    <!-- BEE CONTENT -->
  </div>
  <div id="popup-footer">
    <div></div>
    <div></div>
  </div>
</div>  
popup-container
popup-header
popup-content
popup-footer

customStyles: {
  container: {},
  header: {},
  content: {},
  footer: {},
  overlay: {},
}, 
  

customStyles: {
  container: {
    ...styles,
  },
},  
 

beeConfig: {
  workspace: {
    popup: {
      theme: 'custom'
    }
  }
}

workspace: {
  popup: {
    customStyles: {
      container: {
        border: '1px solid black'
      }   
    }
  }
}

workspace: {
  popup: {
    customStyles: {
      container: {
        boxShadow: '0 5px 15px rgba(0, 0, 0, 0.5)'
      }
    }
  }
}

workspace: {
  popup: {
    customLayout: {
      ...
    },
  }
}

<div id="html">
  <div id="body">
    <div id="main">    
      <div id="popup-wrapper">
        <!-- Popup -->
      </div>
      <div id="popup-overlay">
    </div>
  </div>
</div>  
HTML
body
main
popup-wrapper

workspace: {
  popup: {
    layout: 'classic-center',
    customLayout: {
       wrapper: {
        maxWidth: '700px'
      }  
    }
  }
}

{
    "structure": {
        "attributes": {},
		"fields": {},
        "layout": [],
        "title": "Form title",
        "description": "Form description"
    }
}

action

string

method

string

target

string

accept-charset

string

autocomplete

string

enctype

string

novalidate

boolean

dir

string

canBeRemovedFromLayout

all fields

boolean

true

removeFromLayout

all fields

boolean

false

"layout":[
["name"],
["surname"],
["email"],
["privacy_checkbox"],
["submit"]
]
"layout":[
["email","telephone"],
["notes"],
["privacy_checkbox"],
["submit"]
]

"class": "g-recaptcha"
"data-action": "submit"
"data-sitekey": "___YOUR_RECAPTCHA_API_KEY___"
"data-callback": "onSubmit" (this can be optional, check reCaptcha docs)

<script src="https://www.recaptcha.net/recaptcha/api.js" async defer></script>

"submit": {
  "attributes": {
    "class": "g-recaptcha",
    "data-action": "submit",
    "data-callback": "onSubmit",
    "data-sitekey": "___YOUR_RECAPTCHA_API_KEY___",
    "value": "Login"
  },
  "label": " ",
  "type": "submit"
}
our dedicated GitHub page
pass a single form
browser compatibility
our dedicated GitHub page
allowed form fields
default form in the configuration parameters
official website
technical documentation

var rowDisplayConditions = [{
  type: 'Last ordered catalog',
  label: 'Women',
  description: 'Only people whose last ordered item is part of the Women catalog will see this',
  before: '{% if lastOrder.catalog == \'Women\' %}',
  after: '{% endif %}',
}, {
  type: 'Last ordered catalog',
  label: 'Men',
  description: 'Only people whose last ordered item is part of the Men catalog will see this',
  before: '{% if lastOrder.catalog == \'Men\' %}',
  after: '{% endif %}',
}, {
  type: 'Last ordered catalog',
  label: 'Children',
  description: 'Only people whose last ordered item is part of the Children catalog will see this',
  before: '{% if lastOrder.catalog == \'Children\' %}',
  after: '{% endif %}',
}, { ... }]
Core plan
upgrade a development application
Server-side configurations
Advanced Permissions documentation
Content Dialog
Check it out!
More info
More info
More info
More info
More info
More info
More info
More info
More info
More info
Beefree SDK Console Dashboard with an Example QA Environment Development Application

Authorization Process

Authorization Process Overview

The Authorization Process is an important step throughout your Beefree SDK installation process. This steps validates your Beefree SDK credentials and provides you with a token. Take the steps outlined in this document to ensure you accurately complete the authorization process.

Beefree SDK Client-side Configuration

Beefree SDK requires the host application to pass a container parameter in the client-side configuration. This is the only required parameters for the configuration.

The following code sample shows an example of this parameter in the client-side configuration.

var config = {
    container: 'string'
}

Beefree SDK Server-side Login

To initialize your instance of the Beefree SDK builder, call the /loginV2 endpoint shown in the sample code below with your Client ID, Client Secret, and UID. The Client ID and Secret are available on the application details page of the Beefree SDK developer portal. UID represents your user as described in How the UID parameter works.

Important: Do not put your Beefree SDK credentials in client-side code.

The Beefree SDK system uses OAuth2 as the authorization framework.

Example

POST /loginV2 HTTP/1.1
Host: auth.getbee.io
Accept: application/json
Content-Type: application/json
{
“client_id”: YOUR_CLIENT_ID,
“client_secret”: YOUR_CLIENT_SECRET,
“uid”: uid of choice
}

Reference How the UID parameter works to learn more about UID.

The following code sample displays an example JSON response.

{
    "access_token": "...",
    "v2": true
}

The Beefree SDK authorization service will return a temporary access token if the authentication is successful. The client application can use the full response that contains the token to start or refresh a Beefree SDK session.

The token you receive from the authorization server should be passed to the BeePlugin.create(...) as it is. We strongly suggest not altering it in any way. Also, don’t rely on the token response's content or structure. If you do, any change to the schema could make your integration stop working.

The token expires after 5 minutes for security reasons. Beefree SDK will refresh an expired token automatically for 12 hours without re-authenticating the application. Beefree SDK will trigger the onError callback when the token can't be refreshed automatically.

Note: When a refreshable token expires, Beefree SDK receives a 401 error and attempts to refresh it automatically. 401 errors are expected and part of the process.

The following code sample displays an example of how to call the Beefree SDK endpoint, obtain a token, and then start it.

var req = new XMLHttpRequest();
req.onreadystatechange = function() {
  if (req.readyState === 4 && req.status === 200) {
    // Obtain token
    var token = req.responseText;
    // Call create method and pass token and beeConfig to obtain an instance of Beefree SDK
    BeePlugin.create(token, beeConfig, function(beePluginInstance) {
	// Call start method of beefree SDK instance
	beePluginInstance.start(template); // template is the JSON to be loaded in BEE
    });
  }
};

// This is a sample call to YOUR server-side application that calls the loginV2 endpoint on BEE the side
req.open(
	'POST', 	// Method
	'/YOUR_BACKEND_TOKEN_ENDPOINT', // your server endpoint
	false 		// sync request
);

Ensure to call the authorization endpoint server-side to protect your credentials.

Once you obtain the token, the configuration parameters object is passed to Beefree SDK to set up your customization options, for example setting the editor’s language to “Spanish”.

Then, you can use Beefree SDK methods to start your instance and display the editor on your page.

Beefree SDK will keep this session alive for 12 hours from the login. After 12 hours, you have to manage the token expiration, as follows:

  1. Obtain a new token via the new authorization endpoint.

  2. Inject the token obtained from step one via the updateToken method. Reference examples of this in the following section.

The following code example shows how to inject the token in the current Beefree SDK instance:

// obtain a new token with a new LoginV2 call
// update the token in the current Beefree SDK instance
beePluginInstance.updateToken(token);

The following code example displays how to get the current JSON from the expiration error:

onError: function (error) {
  var code = error.code
  var detail = error.detail

  // the template the user was working on before the error occurred
  var currentJson = error.template
  ... 


  beePluginInstance.updateToken(token);
  // the beePluginInstance comes from the BeePlugin.create 
  ...

Error Management

When you set up an onError callback you will get the error object as a parameter.

From that object, you can grab the code property and use it as explained in the table below.

Code
Message
Detail

5101

Expired token cannot be refreshed

You need to do a new login and update the token in the current Builder instance using updateToken method.

5102

Expired token must be refreshed

You need to do a new login and create a new Builder instance using the new token, BeePlugin.create() and the current JSON template present in this event

Example scenarios:

  • The version is outdated

  • Beefree SDK releases a security fix and every client must refresh

Handling error management

The following code samples display how to handle the 5101 and 5102 errors.

Error management error 5101

onError: function (error) {
 var code = error.code
 var detail = error.detail
 switch (code) {
   case 5101: // re-login and update token in the beeInstance
var req = new XMLHttpRequest();
req.onreadystatechange = function() {
 if (req.readyState === 4 && req.status === 200) {
   // Obtain token
   var token = req.responseText;
   // Call update method and pass the new token existent BeePlugin instance
   BeePlugin.updateToken(token);
 }
};
req.open(
 'POST',  // Method
 '/token',  // The server side endpoint that calls BEE REST auth endpoint
 false   // sync request
);

     break
   case 5102: // re-login and create a new beeInstance
var req = new XMLHttpRequest();
req.onreadystatechange = function() {
 if (req.readyState === 4 && req.status === 200) {
   // Obtain token
   var token = req.responseText;
   // Call update method and pass token and beeConfig to obtain an instance of BEE Plugin
   BeePlugin.create(token, beeConfig, function(beePluginInstance) {
     // Call start method of bee plugin instance
     beePluginInstance.start(template); // template is the json to be loaded in BEE
   });
 }
};
req.open(
 'POST',  // Method
 '/token',  // The server side endpoint that calls BEE REST auth endpoint
 false   // sync request
);
     break
 }
},

Error management 5102

onError: function (error) {
 var code = error.code
 var detail = error.detail
 switch (code) {
   case 5101: // re-login and update token in the beeInstance
...
   case 5102: // re-login and create a new beeInstance
var req = new XMLHttpRequest();
req.onreadystatechange = function() {
 if (req.readyState === 4 && req.status === 200) {
   // Obtain token
   var token = req.responseText;
   // Call update method and pass token and beeConfig to obtain an instance of BEE Plugin
   BeePlugin.create(token, beeConfig, function(beePluginInstance) {
     // Call start method of bee plugin instance
     beePluginInstance.start(detail.template); // the template the user was working on before the error occurred
   });
 }
};
req.open(
 'POST',  // Method
 '/token',  // The server side endpoint that calls BEE REST auth endpoint
 false   // sync request
);
     break
 }
},

Error Responses

Example error response for unsupported media type Only Content-Type: application/json is allowed.

{
  "code": 5001,
  "message": "Unsupported media type 'application/x-www-form-urlencoded'",
  "status_code": 415
}

Example error response for an invalid UID. Look at the properties of UID parameter.

{
  "code": 5005,
  "message": "Invalid UID",
  "status_code": 400
}

Example error response for invalid credentials. Obtain your credentials using the authorization process.

{
  "code": 5002,
  "message": "Unable to authenticate with provided credentials.",
  "status_code": 401
}

Example error response for disabled apps. Contact support if you encounter this error.

{
  "code": 5003,
  "message": "Application is disabled.",
  "status_code": 403
}

Builder stage

The stage where the end user drags and drops the content tiles and designs their email.

Content blocks

The content types end users can drag and drop as tiles onto their stage to add to their designs. The Free email builder comes with the following Content tiles (more are available on higher plans):

  • Title

  • Paragraph

  • List

  • Image

  • Button

  • Divider

  • Spacer

  • Social

  • Dynamic content

  • Icons

  • Table

Content properties

When an end user clicks on content on the stage, the Content properties will appear in the sidebar. This is where they can customize the content on their stage. Customization options include Text color, Link color, Line height, Letter spacing, Block options, and more.

Rows

End users can drag and drop Rows onto the stage, too. Rows store groups of content within the email design. An end user needs to drag and drop a row onto the stage before they can add Content tiles. Once the rows are added, they can drag and drop Content tiles onto them.

Row properties

Users can customize Rows with Row properties. Customizable options include Backgrounds, Borders, Column Structure, and more.

Settings

Settings enable end users to apply general customization options to their email designs.

Actions

A few of the actions included with the email builder include:

  • Preview

  • Send test

  • Save as Template

Text editor

The text editor appears when you click on a text-type content on the stage. The options include adding Merge tags, Special links, and more.

ROI of 3600%
boost click-through rates by 28.57%
APIs
AddOns
custom CSS
this live demo as an example
AddOns
developer console
Advanced Options
Template Catalog API
Content Services API
Playground
Coral Demo
GitHub Repository
Client ID or Client Secret
Create your Beefree SDK account
Developer Console
Create an email application
npm package
install
Installation and Fundamentals
{
    "structure": {
        "fields": {
            "gender": {
                "type": "radio",
                "label": "Gender",
                "orientation": "vertical",  // Newly added field for layout orientation
                "attributes": {},
                "options": [
                    {
                        "type": "option",
                        "value": "M",
                        "label": "Male"
                    },
                    {
                        "type": "option",
                        "value": "F",
                        "label": "Female"
                    },
                    {
                        "type": "option",
                        "value": "-",
                        "label": "Not telling"
                    }
                ]
            }
        },
        "layout": [
            [
                "gender"
            ]
        ]
    },
    "attributes": {},
    "style": {
        "labels": {},
        "fields": {},
        "buttons": {}
    }
}
"orientation": "vertical"
{
    "structure": {
        "layoutPreset": "grid",  // New field to define form layout
        "fields": {
            "email": {
                "type": "email",
                "label": "Email Address",
                "fullWidth": true,  // Only applicable for 'grid' preset
                "attributes": {}
            }
        }
    },
    "attributes": {},
    "style": {
        "labels": {},
        "fields": {},
        "buttons": {}
    }
}
"layoutPreset": "horizontal"
"fullWidth": true
Beefree SDK plan types
Page
Popup
Beefree SDK Plan
Dev Console
Form Layout Customization end user documentation

Brand Style Management

Overview

The Brand Style Management endpoint enables you to manage and modify the style of email, pages, and popup templates. While the Content Defaults feature enables you to set default styles for new content elements like headings, paragraphs, and buttons, the Brand Style Management endpoint takes it a step further. It allows you to make template-wide design changes to existing templates quickly and easily, ensuring that all modules adhere to the broader design system or brand guidelines. In this article, we'll explore what this Content Services API (CSAPI) Brand Style Management endpoint is, its benefits, how to get started with it, and how it differs from Content Defaults.

How to Apply Styles Globally

To apply a style globally, take the following steps:

  1. Manage Brand Styles: Begin by defining your brand's styles within the schema. The Brand Style Management endpoint schema mirrors the Content Defaults’ JSON. This enables you to easily reuse the styles you’ve already defined in your application’s frontend. Use the same schema to specify colors, fonts, and any other design elements you want to apply uniformly.

  2. Prepare the Template: Ensure you have the JSON template ready, which is the foundation for your branding modifications.

  3. API Call: Make an API call to the CSAPI Brand Style Management endpoint, providing the schema with your defined brand styles and the JSON template to be updated.

  4. API Processing: The API will take care of processing your request. It will automatically merge the specified brand styles into the template, applying the desired changes globally.

  5. Receive Modified Template: After the API processes your request, it will return the modified JSON template with the updated styles. This template is now ready to be used in your marketing campaigns with the consistent branding you've defined.

Authentication

Authentication is essential to secure access to the Brand Style Management endpoint. We use API keys to authenticate requests. The API key you should use to access this endpoint is the CSAPI API key available in your Beefree SDK Developer Console. If you do not have a CSAPI key in your Developer Console, ensure you have a paid plan.

Include the API key in the request header as follows:

Authorization: Bearer YOUR_API_KEY

Endpoint

/template/brand

HTTP Method: POST

Description: Apply brand styles to a template, ensuring a consistent visual identity.

Request Parameters:

  • styles (JSON): The brand styles to apply to the template.

  • template (JSON): The JSON template to be updated with the brand styles.

  • HTML Return the template with or without HTML.

The following section displays an example request. Note that the syntax for the CSAPI Brand Style Management endpoint is similar to the syntax for Content Defaults.

Example Request:

POST / template / brand
Content-Type: application / json
Authorization: Bearer YOUR_API_KEY 

{
    "styles": {
        "general": {
            "background": "#eeeeee",
            "links": "#0068a5"
        },
        "h1": {
            "styles": {
                "color": "#333333",
                "fontSize": "36px"
            }
        },
        "h2": {
            "styles": {
                "color": "#CCCCCC",
                "fontSize": 246 px "
            }
        },
        "paragraph": {
            "styles": {
                "color": "#333333",
                "fontSize": "16px"
            }
        },
        "button": {
            "styles": {
                "backgroundColor": "#ff9900",
                "borderRadius": "5px"
            }
        }
    },
    "template": {
        // Your template JSON here
    }
}

You can define multiple classes of buttons, images, and rows by passing an array of styles targeting design elements by their class names. To provide multiple styles, use the className property to define as many styles as you like. Before defining the className within the array, ensure you define the className within the template using the Custom Attribute feature.

The following examples displays a button array.

{
  "styles": {
    "button": [
      {
        "className": "Primary",
        ...more styles
      },
      {
        "className": "Secondary",
        ...more styles     
      }
    ]
  }
}

Response Format:

  • 200 OK: The request was successful, and the modified template was returned.

  • 400 Bad Request: There was an issue with the request parameters.

  • 401 Unauthorized: The API key is invalid or missing.

  • 500 Internal Server Error: An unexpected server error occurred.

Example Response:

{
  "html": “html document”,
  "json": {
    // Updated template JSON here
  }
}

Request Format

This section discusses the request formats for the different parameters.

Styles

The styles parameter in the request should follow this JSON format:

{
  "general": {
    // General brand styles
  },
  "title": {
    // Title block styles
  },
  "text": {
    // Text block styles
  },
  "button": {
    // Button block styles
  },
  // Add more block styles as needed
}

Each block style can include attributes such as colors, fonts, borders, and more, depending on your brand's requirements. For additional code samples of each content block type and its respective style customization options, reference the Content Defaults schema page.

Note: The mobileStyles and hoverStyles properties are not supported by the Brand Style Management API.

Template

The template parameter should contain your template's JSON structure. Ensure that the JSON structure aligns with the template you intend to update.

Table Content Defaults

Both the Content Defaults (frontend) and Brand Style Management endpoint (backend) include the table content block.

The following code shows an example of how to configure the style for headers within the table content block:

{
  "headersBackgroundColor": "#EAEAEA",
  "headersColor": "#505659",
  "headersFontSize": "14px",
  "headersFontWeight": "400",
  "headersTextAlign": "left",
  "linkColor": "#0068a5"
}

Using the Brand Style Management Schema

The Brand Style Management endpoint schema is designed to be user-friendly and intuitive. You can use the same Content Defaults schema you used to style your application’s frontend with the Brand Style Management endpoint.

For example:

"styles": {
  "general": {
    "background": "#eeeeee",
    "links": "#0068a5"
  }
}

The CSAPI Brand Style Management endpoint will take these styles and merge them with your design template, eliminating the need for complex manual editing.

Difference Between Content Defaults and the Brand Style Management Endpoint

While both Content Defaults and the Brand Style Management endpoint aim to streamline the design process, they serve different purposes:

Content Defaults

  • Can be a part of the Configuration Parameter.

  • Set default styles for specific content types.

  • Useful for quickly creating new templates with consistent styling.

Brand Style Management Endpoint

  • CSAPI endpoint that enables the development of a user interface that empowers end users to make style changes with ease and speed.

  • Modify the style of existing templates.

  • Suitable for users who need to make template-wide design changes or maintain brand consistency on existing templates.

Workspaces

Overview

In user interfaces, a workspace is a parameter that changes the appearance, settings, and widgets available in an builder, to help the user to focus on what matters.

In Beefree SDK, workspaces are an optional parameter that can be used to provide an experience focused on context and purpose, and to facilitate the outcome of an editing session.

You can load the builder with a certain workspace, but workspaces can also be changed by the user when editing, on-the-fly.

Switching between workspaces might change:

  • content visibility on the stage

  • tiles availability in the content tab

  • available previews

  • outputs when saving a content

  • …and more!

Available workspaces

If no workspace is loaded at launch, the builder starts in its “Default” workspace.

We currently offer 3 additional workspaces, and we are planning to launch more as we evolve BEE and its capabilities.

These 3 workspaces revolve around the use of AMP content, and are provided so that you can tailor the experience of creating AMP emails in Beefree SDK.

Here is an overview of the different workspaces and their differences. Please for more information on using AMP in Beefree SDK.

default
mixed
amp_only
html_only

Starting the builder with a workspace

Here is an example of loading Beefree SDK with a “mixed” workspace:

Switching workspaces

You can implement a workspace selector within your application, so that users can switch between workspaces, by using the loadWorkspace(type) method.

First, you need to define template files for the workspaces you want to propose, as JSONs:

Then, you can load those workspaces at runtime:

And here is how to create a simple select to switch workspace:

Workspace callbacks

After you load a workspace, the application will trigger one of these three callbacks:

Success

Failure

Invalid workspace

Use cases

The additional workspaces for AMP (AMP-only and HTML-only) can become helpful if you want to tailor the user experience of creating AMP emails, by adding:

  • a workflow where users decides if they want to create a standard message or an AMP-powered message (in the first case, AMP components will be hidden in the builder;

  • an option to switch between the HTML and the AMP editing of a message.

In addition, omitting the workspace, or loading the “default” workspace for certain users, has the effect of disabling AMP for those users, even when AMP content is enabled in the . This way, you can decide to make the feature available to customers of your application:

  • depending on the subscription plan that they are on (i.e. you could push users to a higher plan based on the ability to use AMP);

  • depending on the purchase of an optional feature (same);

  • only if they are “beta” customers, so they see it while keeping it hidden from the rest of your users.

Passing forms to the builder

Providing forms

You can load forms in the builder with two methods:

  • by passing in the a single, default JSON form, potentially including all the fields your application supports;

  • by implementing a and building a user interface on top of the builder, so that your users can browse and select forms.

If you successfully implement either method, you’ll see a new Form content tile in the builder Content tab.

Let’s see in detail how these methods work.

Default form in starting configuration

Use this method to provide a default form in the when the builder starts.

The default form will load when the user drags the form tile from the “Content” tab into the stage.

Here is an example of a typical login form:

The default form you pass to a Beefree SDK application may consist of a simple form (e.g., the most used one), or a longer form that the user can customize using the options in the form content properties, as pictured here:

The flexibility of these properties allows you to cover multiple form building capabilities, even when implementing just a default form. Let’s see how.

For higher flexibility and better user experience, the form can be customized with the optional canBeModified, canBeRemovedFromLayout, and removeFromLayout attributes.

Disable editing for a field

Attribute
Applies to
Type
Default value

This attribute can be used to turn off the “Edit field” dialog for a field. If set to false, the configuration for that field will be locked to the one defined in the form JSON you passed to the application, except for the label.

If unspecified, it will be applied as true, allowing the user to edit the field using the builder UI.

Indicate when a field can be toggled off

Attribute
Applies to
Type
Default value

This attribute indicates that a field can be toggled off by the user. If unspecified, it will be applied as true, allowing the user to switch it on or off in the builder UI.

It’s a best practice to add canBeRemovedFromLayout: false to mandatory fields (e.g., the email address field in a sign-up form) so that they can’t be excluded in the HTML form.

Toggle off a field when loading a form

Attribute
Applies to
Type
Default value

This attribute indicates that a field is toggled off by default when the form is loaded. This behavior is quite useful to simplify the first experience when working with forms:

  1. you can use a single form with all the possible fields, so there is no form selection step;

  2. you can hide less common fields to load the most used combination at first, and keep the starting point simple, or even empty;

  3. the user than can explore available fields with the form properites and build their custom form

Here is an example:

When added, the form shows the minimum fields for submtting an email, e.g. for subscribing to a newsletter:

but then, the user can toggle on the available fields to transform it:

Implementing a content dialog

The Content Dialog feature is available on Beefree SDK only.

The content dialog allows you to build a user interface for selecting a form, on top of the builder. It can be a simple list with prebuilt forms, a search through categorized forms, a small form configurator or wizard, or even a complete form builder tailored for your application’s data.

For detailed information about this feature, please check the content dialog section.

The object that defines the form content dialog is the following:

As with most content dialog objects, the label is used within the interface to trigger the function:

The resolve object in the handler function must return a form using the structure and parameters described in .

The args object in the handler function returns to the host application the form object already applied. With this information, the application can decide what to display to the user (e.g., edit the current form, suggest a similar form, etc.).

An example of the content dialog object in beeConfig that handles special links and forms:

Services options

Please note that server-side configurations are only available on .

Free stock image gallery

A new feature becomes available in the File Manager when this is active.

It leverages an integration with popular stock photo services to offer users of the builder the ability to search through a large repository of high-quality images.

The images are free to use under the Creative Commons Zero (CC0) license.

Dark Mode Preview

When this is active, adds a toggle to the toolbar that allows a user to simulate the current design in dark mode.

Row background image

When this is active, advanced users of the builder can set an image as background when editing a row.

Background image (entire document)

When toggled on, this option scales the background image to fit the background dimensions of the entire document. This feature is best used with high-resolution images. More information .

Row background video

For and .

When this is active, advanced users of the builder can set a video as the background when editing a row.

Video picker

Requires “Row background video” to be enabled.

Enables the possibility for users to upload videos.

Free stock videos gallery

Requires “Row background video” to be enabled.

Enables a user to search for free stock videos to use in the File Manager.

Dynamic images

When this setting is enabled, users of the builder can specify both a static placeholder image and a dynamic image URL when adding an image content block. This allows for scenarios such as personalized birthday cards, countdown timers, dynamic ads, and many other user cases in which an image is built dynamically at the time it is served. .

Do not stack on mobile

When enabled, adds a new row option to keep the horizontal layout on mobile devices. Useful when working with nav bars, icons, and other horizontal design elements.

Display conditions

When enabled, the display conditions widget will show as a row option. The widget can be used to apply the conditions created by the host applications or to add new syntax manually. .

Hide content on mobile or desktop

When enabled, it adds a new property in the “Content properties” section of any content block that supports it. This widget allows users to hide a content block either on mobile or on desktop devices.

More on

Custom Social Icons

When you enable Custom Social Icons in the Social module, users will be able to upload their own social media icons as a new “Add a custom icon” feature will now be available in the Social content block’s property panel.

Undo and changes history

When enabled, it will give users the ability to Undo or Redo any changes that have been made to the email, including the ability to rewind and fast-forward to any point in their recent edit history.

Save rows feature

This will allow users to select a row in the current message and save it for later use. More .

Import from external source in file manager

When enabled, adds an option in the file manager to import images from different social networks and storage services. We use for this feature. Filestack may log the user’s IP address. If this is in conflict with your privacy policy, turn the feature off.

Enable image editor ('Apply effects & more') in image module

When enabled, an editor to apply image effects and transformations is available in the image module and row background images.

Commenting

This feature allows users to leave comments and start discussion threads inside an email or page, to collaborate asynchronously. .

Reverse stacking on mobile

When enabled, adds a new row option to revert the stacking order of columns on mobile. Useful for layouts with alternating visual & text: applying it will ensure that, on mobile, images are consistently on top of their accompanying copy.

Disable anonymous usage tracking

We use third-party tools to aggregate anonymous usage data. It helps us develop a better product by assessing locations, devices, browsers, etc.

This can be turned off if necessary.

Disable the HTML sanitize service in the HTML content block

When you disable the HTML sanitization service, you’re removing all restrictions on what users of the builder can add inside the Custom HTML content block.

The sanitize service checks and ‘cleans up’ custom HTML, which can be an important measure to prevent the inadvertent introduction of unsafe content or the usage of HTML tags that may impact the message delivery rate. However, it can also have an undesired side effect when the host application needs custom HTML tags or attributes to manage specific scenarios.

Please use caution when disabling this service.

Specifically, when HTML sanitization is disabled, we strongly recommend that you add an alternative code review process. To that extent, the onChange event can help the host application intercept the content as soon as it is inserted, and perform a check on it before the user exits the builder. Alternatively, you can use the onSave event to trigger an HTML review on your end at the time the HTML is saved in your system.

The client-side configuration exposes a parameter to override the global setting in the control panel. You cannot disable the HTML sanitization service in the client-side configuration, due to security reasons, but you can enable it per user via the forceSanitizeHTML parameter.

Which tags are allowed by the sanitize service?

The sanitization service allows the following tags and attributes:

Allowed tags list:

a, abbr, acronym, address, b, bdo, big, blockquote, button, caption, center, cite, code, colgroup, dd, del, dfn, dir, div, dl, dt, em, fieldset, font, form, h1, h2, h3, h4, h5, h6, i, ins, kbd, label, legend, li, map, menu, ol, optgroup, option, p, pre, q, s, samp, select, small, span, strike, strong, sub, sup, table, tbody, td, textarea, tfoot, th, thead, u, tr, tt, u, ul, var, video, source, style, img, br, hr, area, base, basefont, input, link, meta, col, iframe

Allowed attributes list:

Element
Attributes

Activate custom limitations on File Manager

In this section, you can activate restrictions for the file manager:

  • Specify which file formats your users can upload in File Manager.

  • Set a maximum allowed size, different from the default of 20MB.

Please note that the first option will not ask for file extensions, but will instead present file categories such as image, video, text, etc. We have mapped these categories to the most used MIME types that can be referenced in HTML documents.

Learn more about for custom limitations on File manager.

Special Links and Merge Tags

The default configuration returned by the system can be extended by using additional configuration objects such as:

Special links

Special links are links that your system generates dynamically when the message is sent, typically because they include the message ID, the recipient’s email, or some other variable. The most common one is probably the unsubscribe link.

The type parameter will be used to group related links in the UI and simplify the user selection.

Technically, special links are passed to the application in the configuration file as follows:

and here’s an example of what the user will see in the builder UI, starting from the above code:

Merge Tags & Merge Content

As mentioned above, when you initialize the application, in the configuration file you can submit both “merge tags” and “merge content”.

Really, they are the same thing: some syntax that your system will replace with some meaningful content at the time the email is sent. They differ in the way they are presented to the user.

Merge tags help dynamically insert text into a paragraph, such as the very common scenarios of “Dear {first_name}”.

Merge content, instead, helps the user insert special syntax as content element in other sections of the message that are not text, such a list of recommended products.

Currently it is not possible to group merge tags and merge contents as it is for special links.

Here is an example of adding mergeTags and mergeContents in the configuration file:

You can now use the feature to allow users to search for additional Merge Tags and Merge Content, beyond those passed in the configuration file.

Merge Tag Details

Merge tags can be inserted into a text block by clicking on the “Merge tags” button in the expanded text block toolbar. The button is not shown if no merge tags were submitted in the configuration file.

Merge tags also become available to the user by pressing the @ key on the keyboard while editing a text block.

Here is an example: the user wants the date of the last order to be inserted after “[…] placing an order on …”, so he/she presses the @ key and selects “Last order date” from the list of merge tags found by the builder in the configuration file.

After inserting the merge tag, the text block now shows the placeholder for the last order date.

Ways to load Merge Tags

You can load Merge Tags in the builder when it is initialized by adding a mergeTags node to the JSON configuration file. For example:

… or you can allow users to search and insert a merge tag by using the flexible feature. This is especially useful when the number of merge tags is large, and picking from a list would not provide an optimal user experience.

You can use a combination of both approaches, loading frequently used merge tags at the time the builder is initialized, and then allowing users to look for additional merge tags using .

The syntax used for Merge Tags is entirely up to you. Curly brackets, square brackets, ... you name it. The builder is agnostic to the syntax that your system employs for these dynamic fields. The same is true for Merge Contents.

Merge Content details

Merge content differs from merge tags in that it allows the user to drag and drop instances of it as a content element available in the Content panel.

For example, let’s say you have a section of an email where you want to display some recommended products: Merge Content allows you to insert some syntax into the message that your application will replace with the recommended products at the time the email is sent.

When Merge Content elements are submitted to the builder in the configuration file, a new tile is displayed in the Content panel.

The user can drag and drop it into the message just like any other content element.

Once dropped in position, the settings panel will display the instances of merge content available for selection.

In the example below, the user wants to insert some banner ads into the email, using a service such as . An array of Merge Content elements were submitted to the builder in the configuration file, so the user has several banner ads to choose from (i.e. some syntax that will be replaced with HTML when the email is sent).

To create another instance of merge content, the user can either drag and drop it again from the Content tab, or duplicate the existing content element…

… choose another instance of merge content from the available selections…

… and then drag it elsewhere in the message.

Ways to load Merge Content

Just like with Merge Tags, you can load Merge Content in the builder at the time it is initialized by adding a mergeContents node to the JSON configuration file. For example:

… or you can allow users to search for additional instances of Merge Content by using the .

Here too, you can certainly use a combination of both approaches, loading frequently used Merge Content at the time the builder is initialized, and then allowing users to look for additional Merge Content using .

NOTE: if what you need for your users is a way to load a dynamic image into the message or page (e.g. a countdown clock), you don't need to use Merge Content. Beefree SDK can handle dynamic images with a feature that was created specifically for that task. See: .

Limitations to Merge Tags & Merge Content

Merge tags limitations

Merge tags are meant to be placeholders that will be replaced at the time an email is sent, or the web content is generated for visitors.

You cannot use HTML code in the text strings passed to the builder because – if you do – it will be encoded and will not function correctly in the source code of the message. Of course, you can replace the tag with HTML code at the time of saving or sending the message.

Standard merge tags do not support sample placeholder content, for now. The syntax will be displayed in the builder as your users design the message or page.

If you want to provide a better experience when working with Merge tags, including using a friendly name instead of the syntax and generating sample content, we recommend to check out .

Merge Content limitations

Additionally, there are some other limitations that are specific to the Merge Content feature. Among them:

  1. Users cannot see & edit the content: what’s in it, the style used, the layout, etc..

  2. Not seeing it, they could select the wrong content from the list of available Merge Content.

  3. The HTML might be created outside of Beefree SDK, which could lead to rendering issues when it’s inserted into the message.

  4. Since the HTML is created elsewhere, and it’s not part of the document created by Beefree SDK, it must be managed separately.

Due to these additional limitations, we now recommend an alternative approach to Merge Content in order to handle dynamic content in Beefree SDK: utilizing with Merge Content & Display Conditions.

Further extending the builder

You can use the feature to introduce an interactive layer between the builder and your application, and through it extend Merge Tags, Merge Content, Special Links, and Display Conditions.

Stage message

HTML content

HTML & AMP content

HTML & AMP content

HTML content

Content tiles

HTML content tiles

HTML & AMP content tiles

HTML & AMP content tiles

HTML content

AMP sidebar properties

No

Yes

Yes

No

Available in preview

HTML content

HTML & AMP content

HTML & AMP content

HTML content

onSave callback files

HTML

HTML & AMP

HTML & AMP

HTML

Loading a template with AMP content

The onWarning is triggered

Template loads

Template loads

Template loads

Loading a template with HTML content only

Template loads

Template loads

Template loads

Template loads

Availability of the hide on AMP/HTML property

Not available

Yes

Yes

Yes

Behavior for hidden for HTML/AMP content

The onWarning is triggered

Both are visible

Only “hidden for HTML” content is visible

Only “hidden for AMP” content is visible


type ClientConfig = {
  workspace?: {
    type:'default'|'mixed'|'amp_only'|'html_only'
  }
  // ....
}

const beeConfig: ClientConfig = {
  workspace:{
    type:'mixed'
  }
  // ....
}


//Create the instance 
function BeePlugin.create(token, beeConfig, (beePluginInstance) => { 
  //.... 
}
{
  "type":"mixed"
}
type Workspace = 'default'|'mixed'|'amp_only'|'html_only'

const req = url => fetch(url).then(r => r.json())
const loadWorkspace = async (workspace:Workspace) => {
  const { type } = await req(`https://example.com/workspaces/${workspace}.json`)
  beePluginInstance.loadWorkspace(type) 
}
<select id="workspace" onchange="loadWorkspace(this.value)">
<option selected="selected" value="">WORKSPACE</option>
<option value="default">DEFAULT</option>
<option value="mixed">MIXED</option>
<option value="amp_only">AMP_ONLY</option>
<option value="html_only">HTML_ONLY</option>
</select>
//SUCCESS 
onLoadWorkspace: function (workspace) {
  console.log(`workspace: ${workspace} has been loaded`);
},
//FAILURE
onError: function (error) {
 console.error('error: ', error);
},
{
 code: 1400, 
 name: "Invalid workspace type",
 message: "RANDOM : is not a valid workspace",
 details: "Available workspaces are: [ default,mixed,amp_only,html_only ]"
}
refer to this page
Beefree SDK Console

defaultForm: {
  // Form
},

defaultForm: {
  structure: {
    title: 'Form title',
    fields: {
      email: {type: 'email', label: 'Email'},
      password: {type: 'password', label: 'Password'},
      submit: {type: 'submit', label: ' ', attributes: {value: 'Login'}},
    },
    layout: [
      ['email', 'password', 'submit']
    ]
  }
},

canBeModified

all fields except file, hidden, label, and submit, since they cannot be edited

boolean

true

canBeRemovedFromLayout

all fields

boolean

true

removeFromLayout

all fields

boolean

false


defaultForm: {
    "structure": {
        "fields": {
            "name": {
                "type": "text",
                "label": "Name",
                "removeFromLayout": true,
                "canBeRemovedFromLayout": true
            },
            "surname": {
                "type": "text",
                "label": "Surname",
                "removeFromLayout": true,
                "canBeRemovedFromLayout": true,
            },
            "email": {
                "type": "email",
                "label": "Email *",
                "canBeRemovedFromLayout": false,
                "attributes": {
                    "required": true
                }
            },
            "notes": {
                "type": "textarea",
                "label": "Notes",
                "removeFromLayout": true,
                "canBeRemovedFromLayout": true
            },
			"privacy": {
                "type": "checkbox",
                "label": "Accept privacy policy. [Read it here](http://example.com)",
                "canBeModified": false,
                "canBeRemovedFromLayout": false,
                "attributes": {
                    "required": true
                }
            },
            "submit_button": {
                "type": "submit",
                "label": "",
                "canBeRemovedFromLayout": false,
                "attributes": {
                    "value": "SEND DATA",
                    "name": "submit_button"
                }
            }
		}
	}
},

 manageForm: {
            label: 'Change form',
            handler: async (resolve, reject, args) => { 
              // Your function
            } 
          },

contentDialog: {
  specialLinks: {
    label: 'Custom text for links',
    handler: function(resolve, reject) {
      openMySpecialLinkDialog() // Replace this with your application function
        .then(specialLink => resolve(specialLink))
        .catch(() => reject())
    }
  },
  manageForm: {
    label: 'Edit form',
    handler: async (resolve, reject, args) => { 
      const structure = await onHandleManageForm(args)
      structure ? resolve(structure) : reject()
      } 
  },
},
configuration parameters
content dialog
configuration parameters
paid plans
this section

forceSanitizeHTML: true

general attributes

style, id, class, data-*, title

a

href, name, target

img

align, alt, border height, hspace, src, vspace, width, usemap

table

align, bgcolor, border, cellpadding, cellspacing, width

tbody

align, valign

td

align, bgcolor, colspan, height, rowspan, valign, width

tr

align, bgcolor, valign

tfoot

align, valign

th

align, bicolor, colspan, height, rowspan, valign, width

thead

align, valign

li

type

map

name

area

alt, coords, href, shape, target

div

itemscope, itemtype

meta

itemprop, content

video

autoplay, controls, height, loop, muted, poster, preload, src, width

source

media, src, type

paid plans
here
Page
PopUp Builder
More about using dynamic images
More about display conditions
hiding content on mobile or desktop devices.
about Saved Rows
Filestack
More on Commenting
Mime Types and Groups

specialLinks: [
	{
      type: 'Frequently used',
      label: 'Unsubscribe link',
      link: 'http://[unsubscribe]/'
	},{
      type: 'Frequently used',
      label: 'Preference center link', 
      link: 'http://[preference_center]/'
	},
	/* Other special links */
];


var mergeTags = [
	{
		name: 'First Name',
		value: '[first-name]'
	}, {
		name: 'Latest order date',
		value: '[order-date]'
	}
];

var mergeContents = [
	{
		name: 'Headline news',
		value: '{headline}'
	}, {
		name: 'Image of last product viewed',
		value: '{last-product-viewed}'
	}
];


var mergeTags = [
	{
		name: 'First Name',
		value: '[first-name]'
	}, {
		name: 'Last Name',
		value: '[last-name]'
	}, {
		name: 'Email',
		value: '[email]'
	}, {
		name: 'Latest order date',
		value: '[order-date]'
	}
];


var mergeContents = [
	{
		name: 'Headline news',
		value: '{headlines}'
	}, {
		name: 'Lastest blog articles',
		value: '{latest-articles}'
	}, {
		name: 'Latest products viewed',
		value: '{latest-products}'
	}
];

Content Dialog
Content Dialog
Content Dialog
LiveIntent
Content Dialog feature
Content Dialog
letting your users add dynamic images
Smart merge tags
Custom Rows
Content Dialog

Content Services API Reference

The Content Services API Reference provides a comprehensive guide to utilizing the Content Services API, which leverages the REST architecture and HTTP protocol for making API calls. This reference document outlines the available collections, including /message, /page, /popup, /amp, /template, and /ai, detailing the resources for each collection. For every resource, this document includes its description, parameters, and example responses and requests.

API Key

To use the Content Services API you will first need to obtain a your API Key from the Beefree SDK Console.

To obtain an API Key, take the following steps:

  1. Log into the Beefree SDK Console

  2. Locate the application that you wish to work with, and click on Details

  3. Locate the Content Services API section and click Create New API Key

  4. Acknowledge the message that reminds you that if you exceed the number of API calls included in your plan, you may be charged for overages and click Create Key

Your API key will appear under the Content services API section of your application details.

The Content Services API uses API Keys to authenticate requests for resources. You can manage your API Keys within the Beefree SDK Console. All requests must be made over HTTPS and contain the following HTTP Header:

Authorization: Bearer {token}

Rate Limits

API requests rate limits exist independently of API key’s monthly usage allowance.

By default, the API has the following rate limits:

  • Per minute: 500 requests

  • Per second: 100 requests

  • X-Rate-Limit: An integer representing the total number of requests available per cycle. Exceeding the limit per cycle results in a 429 error. (e.g. 500)

  • X-Rate-Limit-Remaining: An integer representing the number of remaining requests before the next cycle begins, and the count resets. (e.g. 100)

  • X-Rate-Limit-Reset: A Unix timestamp representing the time the next cycle will begin, and the count will reset.

  • Retry-After: A Unix timestamp representing the time the application may resume submitting requests.

API Root

All API access is over HTTPS, and accessed from the following URL:

https://api.getbee.io/v1/{collection}/{resource}

Collections

The following table lists the available collection option and corresponding resources for each collection.

Collection
Available Resources

/message

html, pdf, images, merge, index, plain-text

/page

html, pdf, images, merge, index

/popup

html

/amp

html

/template

brand

/ai

metadata, sms, summary

/conversion

email-to-page, page-to-email

Example URLs

The following table provides a few examples of URLs you can use to make specific types of requests.

Type
Action
Example URL

Email

Request HTML for email

https://api.getbee.io/v1/message/html

Landing Page

Request HTML for a landing page

https://api.getbee.io/v1/page/html

Popup

Request HTML for a popup

https://api.getbee.io/v1/popup/html

AMP

Request HTML for AMP

https://api.getbee.io/v1/amp/html

Resources

The following section provides detailed information for each of the resources associated with each collection mentioned in the previous section.

HTML

URL: https://api.getbee.io/v1/{collection}/html

Include the optional newbutton query string parameter and set its value to true to generate HTML button results optimized for Outlook. Reference HTML Outlook Button Rendering for additional details.

Plain Text

Endpoint: /message/plain-text

PDF

URL: https://api.getbee.io/v1/{collection}/pdf

Note: The response is a JSON string that will contain the URL of the temporary location of the PDF document. The file is available for 24 hours.

Image

URL: https://api.getbee.io/v1/{collection}/image

Prior to using the image endpoint, ensure you reference the following information.

The HTML is rendered in a fixed window size of 1920x1080 to generate a screenshot, with default viewport widths of 320 pixels for mobile and 1024 pixels for desktop, which may cause cropped previews if the content exceeds these dimensions. A clipping size of 1920x1080 is applied, but it can be customized, and the scale factor adjusts to align the viewport and clipping dimensions. For improved results, using auto height with the size parameter is recommended.

Name
Type
Description

html*

String

A Beefree HTML message.

size

String

Use “size” instead of “width” and “height” when you only know the width and want the height automatically calculated. Required if width and height are not defined.

width

Integer

The image width in pixels. Required if size is not defined.

height

Integer

The image height in pixels. Default applies a proportional value based on the given width, keeping the image aspect ratio. When the value is not proportional to the given width, either will occur: If it’s higher, the proportional value applies, or, if it’s lower, the image is cropped. Required if size is not defined.

file_type*

String

Accepts jpg or png.

Merge

URL: https://api.getbee.io/v1/{collection}/merge

Merge Rows

URL: https://api.getbee.io/v1/{collection}/merge-rows

When utilizing this feature, it's important to consider adding a handle to the metadata. This handle serves a crucial role in functions such as onDeleteRow and onEditRow. In our provided example, we use a handle named guid. However, users have the flexibility to choose their own handle name according to their preferences and requirements. When selecting a handle name, we recommend you choose something descriptive and meaningful for ease of identification and management within your workflow.

Synced Rows

URL: https://api.getbee.io/v1/{collection}/synced-rows

Index

URL: https://api.getbee.io/v1/{collection}/merge/index

AI Collection

Important: The AI collection is only compatible with OpenAI AddOns that were configured before August 1, 2024. We are actively working on making it compatible with AI AddOns and Providers configured after that date, too.

The resources in the AI collection accept your template JSON and use generative AI to return text within a JSON object to you.

Prerequisites

Prior to getting started with the resources in this collection, ensure you have the following:

  • Superpowers subscription or higher

  • OpenAI AddOn installed and configured in your Beefree Developer Console

  • Content Services API key

Note: OpenAI billing costs apply in addition to the Content Services API billing.

Metadata (Preheader and Subject)

v1/ai/metadata

SMS

v1/ai/sms

Summary

v1/ai/summary

Conversion Collection

The Conversion Collection provides you with endpoints that enable you to convert templates from one format to another. With the Email to Page endpoint, you can easily convert your email JSON templates into page JSON. The Page to Email endpoint lets you turn your page JSON templates into email-ready JSON, with the option to disable the HTML sanitizer if needed.

Email to Page Conversion: Important Behaviors

The Email to Page endpoint converts a JSON template created for email into a JSON template optimized for web pages. During this conversion, the following adjustments are applied:

  • Remove AMP Carousel Any AMP carousels included in the email template are removed, as these are not supported in the page format.

  • Expand Content Area Width The content width is expanded to 900px to fit the web page format, removing the width constraints typically applied to emails.

  • Target Attributes Target attributes will not be processed. Remove all link target attributes or set them to "Open a new page." Links will not be modified during the conversion.

  • Remove Subject and Preheader Email-specific metadata, such as the subject line and preheader text, is removed since these elements are not relevant in the page format.

  • Retain Comments and Secondary Language Comments and secondary language data in the email template are preserved in the conversion process.

Page to Email Conversion: Important Behaviors

The Page to Email endpoint transforms a JSON template designed for a web page into a JSON template optimized for email. During this conversion process, the following adjustments are made:

  • Remove Video Row Backgrounds Video backgrounds applied to page rows are removed because email formats do not support video backgrounds.

  • Replace Embedded Videos with Thumbnails Embedded videos are replaced with thumbnail images. This ensures recipients can preview the content visually without the compatibility issues of embedded videos. Note: Hosted videos will not be converted.

  • Remove Form Blocks Any form blocks present in the page template are removed.

  • Adjust Design Content Area Width If the page width exceeds the maximum width supported by the email builder (900px), it is resized to fit within email constraints.

  • Update Link Target Attributes Target attributes will not be processed. Remove all link target attributes. Links will not be modified during the conversion.

  • Sanitize Code The endpoint sanitizes the code to ensure compatibility with email standards. When the sanitizer is disabled, the payload looks like this:

    {
      "disableHtmlSanitizer": true,
      "template": { "page": ... }
    }
  • Handle Multi-Column Layouts The email builder supports up to 12 columns, which is compatible with the page builder's column configurations.

Template Catalog API

This feature is available for purchase with the Core plan and included at no extra cost with the Superpowers and Enterprise plans. To purchase this feature with the Core plan, or to activate it for free with the Superpowers or Enterprise plans, please reach out to your account manager. If you don’t have an account manager, contact our sales team for more information.

Overview of Template Catalog API

In this Template Catalog Reference, you will learn more about a personalized template catalog for your SaaS applications. Through this API, you can integrate a diverse range of email and page templates, promoting enhanced user engagement while optimizing the design process within your platform.

Getting Started

Learn more about how to get started with the Template Catalog API in this section.

Access and Subscription

To start using the Template Catalog API, first activate your API key in the Beefree SDK Console. After activation, reach out to your dedicated Customer Success Manager (CSM) for further help and setup. Your CSM will guide you through the process and answer any questions you have.

For additional information, you can refer to Content Services API key configuration.

Activating the API

Activate your API key through the Beefree SDK Console to begin using the Template Catalog API. Once your API key is activated, you can contact your dedicated Customer Success Manager (CSM) representative to request further assistance and enablement. They will be available to guide you through the process and address any additional inquiries.

Endpoint and Authentication

To begin using the Template Catalog API, access it through the designated endpoint and authenticate all requests by including your API key. This API key is essential for proper authorization and security when interacting with the API.

The Template Catalog API uses API Keys to authenticate requests for resources. You can manage your API Keys within the Developer Portal. All requests must be made over HTTPS and contain the following HTTP Header:


Authorization: Bearer {token}

Base URL

All API access is over HTTPS, and accessed from the following URL:

Base URL

https://api.getbee.io/v1/catalog/templates/?{parameter}={value}

API Features and Functionality

Our Template Catalog API provides the following essential features to enable seamless integration into your application:

  • Fetch templates from the Template Catalog API by applying filters like category, industry, etc.

  • Sort and customize templates to match your application’s requirements and user preferences.

Best Practices

To enhance the performance and user experience of your template catalog, we recommend following these best practices.

Optimize API Usage

Implement caching mechanisms to reduce API calls and minimize user loading times. Template data do not change often, so you can use a cache TTL of some minutes (10 for example, but even more) without issues.

Rate Limits

Handle errors gracefully and provide clear error messages to assist in resolving any issues. These endpoints have the following rate limits:

  • Per minute: 500 requests;

  • Per second: 100 requests.

Therefore, we recommend not enforcing excessive automatic tries when you get an error message, otherwise, you may exceed the limit and won’t be able to proceed with more requests.

The API is a read-only API. The only method is GET.

HTTP Status Code Errors

The main HTTP status code errors are:

  • 200 OK - The request has succeeded. The client can read the result of the request in the body and the headers of the response.

  • 400 Bad Request - The server could not understand the request due to invalid syntax.

  • 401 Unauthorized - The client must authenticate itself to get the requested response.

  • 403 Forbidden - The client does not have access rights to the content; the server is refusing to give the requested resource. Unlike 401, the client's identity is known to the server.

  • 404 Not Found - The server can not find the requested resource. In the context of an API, this can mean that the endpoint is valid but the resource itself does not exist.

  • 429 Too Many Requests - The user has sent too many requests in a given amount of time which has led to throttling their request until the window resets.

  • 500 Internal Server Error - The server has encountered a situation it doesn't know how to handle.

  • 503 Service Unavailable - The server is not ready to handle the request. Common causes are a server that is down for maintenance or that is overloaded.

Headers

The following table displays the headers you need to complete your API request.

Key
Value

Content-type

application/json

Authorization

Bearer{{key}}

Get a list of all Templates

/v1/catalog/templates

HTTP Method: GET

Description: Retrieve a list of all the Templates within the catalog, applying filters based on request parameters.

You can execute a search by providing a series of terms within the ‘search’ request parameter. This search will operate on template title, description, category name, collection name, designer name, publication date (‘published_at’), and tags.

The response will encompass a ‘facets’ field, outlining the count of existing Templates across each Category, Collections, Designers, and Tags fields and their sub-fields, considering any applied filters and searches.

The response is paginated, presenting 20 items per page by default. The ‘pagesize’ request parameter enables control over the page size.

Request Parameters

The following table displays a list of request parameters.

Parameter
Example
Description

search

activity, beach, summer

List of terms to search, separated by comma

category

small-business

Filter by category slug

collection

e-commerce

Filter by collection slug

designer

bee-team

Filter by designer slug

tag

activity, beach, summer

Filter by tag name

template_type

email

Filter by template_type. Choiches are "email" or "page"

pagesize

20

Set the item number per page

published_after

2023-01-01

Filter by published_at after given date

published_before

2023-01-01

Filter by published_at before given date

Fetch a single Template

/v1/catalog/templates/:slug

HTTP Method: GET

Description: Fetch a single template identified by its slug (in the URL).

Fetch a list of all Categories

/v1/catalog/categories

HTTP Method: GET

Description: Retrieve a list of all the Templates within the catalog, applying filters based on request parameters.

You can extract a list of all the Categories present within the catalog. This comprehensive list includes all categories under which templates are classified.

The response that you receive is paginated for ease of reading and navigation. It displays 200 items per page by default, providing a comprehensive view of the catalog content.

However, if you wish to adjust the number of items shown on each page, you can use the ‘pagesize’ request parameter.

Request Parameters

The following table displays request parameters.

Parameter
Value
Description

pagesize

int

Set the item number per page

Fetch a single Category

/v1/catalog/categories/:slug

HTTP Method: GET

Description: Retrieve a list of all the Templates within the catalog, applying filters based on request parameters.

Retrieve detailed information about a specific Category using its unique identifier, or slug, which can be found in the URL. This method allows you to access in-depth data related to that particular category, such as its associated templates and related metadata.

Fetch a List of Collections

/v1/catalog/collections

HTTP Method: GET

Description: You can pull up a full list of all Collections in the catalog. Collections are groups of templates with similar attributes or purposes. This overview can help you understand the types of template groupings available.

The response will be paginated, with 200 items per page default for easy navigation. However, you can change this default by adjusting the ‘pagesize’ request parameter to suit your viewing preferences.

Request Parameters

The following table displays request parameters.

Parameter
Value
Description

pagesize

int

Set the item number per page

Fetch a single Collection

/v1/catalog/collections/:slug

HTTP Method: GET

Description: Access a specific Collection using its unique slug found in the URL. This lets you view detailed information about this particular group of templates, including its associated templates and any related details.

Fetch a list of all Designers

/v1/catalog/designers

HTTP Method: GET

Description: Access a complete list of all Designers in the catalog.

The response is paginated, with a standard display of 200 items per page. You can manipulate the ‘pagesize’ request parameter to control the number of items shown per page.

Request Parameters

The following table displays request parameters.

Parameter
Value
Description

pagesize

int

Set the item number per page

Fetch a single Designer

/v1/catalog/designers/:slug

HTTP Method: GET

Description: Retrieve detailed information for a specific Designer, identified by the unique slug present in the URL. This enables the procurement of comprehensive data pertaining to the particular designer, including their portfolio of templates and any associated metadata within the catalog.

Fetch a list of all Tags

/v1/catalog/tags

HTTP Method: GET

Description: Retrieve a full list of all the Tags in the catalog. Tags are keywords tied to templates, helping you find and sort templates based on certain themes or attributes.

Request Parameters

The following table displays request parameters.

Parameter
Value
Description

pagesize

int

Set the item number per page

FAQs

Find answers to common queries related to the Template Catalog API, its features, and integration.

Do I need to pay extra for new templates?

No, they are included in your subscription. The catalog will be updated with the latest trends at no extra charge.

How frequently are new templates available?

We are committed to making fresh new templates available every quarter.

Where are the image and media assets stored?

Storing the JSON Template source file is totally in your control, the media assets referenced inside the template are kept in the Beefree SDK S3 Bucket and provisioned using the CDN.

Do the API calls made to the Template Catalog contribute to the total CSAPI count?

No, API calls made to the Template Catalog do not contribute to the total CSAPI count.

Partner AddOns directory

These AddOns need to be installed from your Beefree SDK Console. Some of them are offered by third-party providers, and they might require an active subscription with those providers in order to be used.

Custom AI Writing Assistant

The Custom AI Writing Assistant AddOn enables host applications to integrate their own LLM models with Beefree SDK. This allows host applications to provide their end users with advanced AI writing capabilities that are specific to their domains. Using the Content Dialog, this AddOn employs the same entry points as the AI writing assistant, allowing full control over the AI experience within your application. Once your Custom AI Writing Assistant AddOn is fully configured, the Content Dialog displays the modal you created within the user interface when end users click the Write with AI button in the sidebar.

How do I enable the Custom AI Writing Assistant AddOn? | Terms of Services

Stability AI

The Stability AI AddOn converts text to images. This feature allows your end users to submit descriptions of what they would like to see in their AI-generated images, and to also submit negative prompts of what they do not want to see in their image. Once they submit the prompt and negative prompt, they'll receive an AI-generated image that they can use directly within their designs.

How do I enable the Stability AI AddOn? | AI Providers and Data Security | Terms of Services

DeepL

Through this AddOn and Multi-language templates, you can empower your end users to create up to six different language versions of a single design. Once your end users create their new language versions, they can click the Translate button to automatically translate all the translatable content within their designs.

How do I enable the DeepL AddOn? | AI Providers and Data Security | Terms of Services

AI Writing Assistant

Empower users to generate text quickly with AI. With this AddOn, your end users will see a new “Write with AI” button for Title, Paragraph, List, and Button content blocks. Beefree SDK processes your end users' prompts, sends them to your AI provider, and returns the response to the end user. They can then decide to apply or regenerate the response. By integrating the AI Writing Assistant, you provide your end users with a powerful tool to complete their designs quickly, which helps them maintain a competitive edge. Choose between Azure OpenAI or OpenAI as providers for this feature, our AddOn is quick and simple to integrate.

How do I enable the AI Writing Assistant AddOn? | Developer’s FAQ for OpenAI | Webinar

Azure AI Vision - Image Analysis

Generate alt-text descriptions with the power of Computer Vision. Azure AI Vision is a unified service that offers innovative computer vision capabilities. Image analysis pulls from more than 10,000 concepts and objects to detect, and caption images.

| Azure Ai Vision FAQs | Data and Privacy

IO Monetizer

For setup, please reach out to [email protected], and we will provide you with an API key that identifies your application on our network.

Over 600 digital publishers use Interactive Offers to help captivate new audiences and discover new monetization solutions. These programmatic email ad solutions provide a non-intrusive way to engage users with your content while earning revenue from every email you send.

AddOn website | About Ads By Interactive Offers | | Support

Countdown Timers by NiftyImages

Create urgency with custom-designed countdown timers.

Give your users the ability to design fully customized countdown timers without ever leaving the editor. Create urgency for sales, events, holidays, webinars, and more, with this powerful yet easy-to-use AddOn.

Addon website | About the AddOn | Setup instructions | Privacy Policy | Support

Engage and inform with dynamic content, timers, and millions of visuals.

Email from your platform will come alive with this powerful set of dynamic-content tools and a massive collection of ready-to-use visuals. On-open content transforms the email experience into a live marketing channel, backed by millions of royalty-free visuals to grab inbox attention with eye-catching emails.

Addon website | Privacy Policy | Support

Countdown Timers by Sendtric

Boost clickthrough rates with dynamic countdown timers.

Sendtric countdown timers are perfect for your customers to create urgency in their campaigns. With our robust architecture and limitless customization options, our timers can be used for a variety of use cases such as sales, events, deadlines, new account sign-ups, abandoned cart reminders, and much more.

Addon website | About the AddOn | Privacy Policy | Support

Viewed

Capture your customer’s attention and stand out from the competition with the use of autoplay video in email.

It works with all email clients and devices. Get up to 90% of views on your opened emails, against only 16% that can be achieved including a static picture linked to YouTube. Autoplay video in email is the best solution to quickly spread your message and get millions of video views.

Addon website | About the AddOn | Privacy Policy | Support

Gifs

The GIFs by GIPHY AddOn gives your customers the best source for GIFs, ready to use in their emails and pages, without leaving the application. This AddOn is developed by Beefree SDK and powered by GIPHY.

Once installed and configured, they will see a new content tile in the builder. Once dragged into the email or page, a click on a button in the stage area will launch a GIPHY search dialog. Clicking on a GIF will import it instantly into the email or page.

Addon website | About the AddOn | Privacy Policy | Support

Stickers

The Stickers by GIPHY AddOn gives your customers the best source for stickers, ready to use in their emails and pages, without leaving the application. This AddOn is developed by Beefree SDK and powered by GIPHY.

Once installed and configured, they will see a new content tile in the builder. Once dragged into the email or page, a click on a button in the stage area will launch a GIPHY search dialog. Clicking on a sticker will import it instantly into the email or page.

Addon website | About the AddOn | Privacy Policy | Support

Integrating and using the Form block

The Form block is available for the and the

How it Works

You can enable your users to add forms in Beefree SDK with two methods:

  • by passing in the a single, default JSON form, potentially including all the fields your application supports, and then have customers build and style forms with our form content block.

  • by implementing a on top of the form content block and building a user interface on top of the builder, so that your users can either browse and select pre-built forms or build a new form.

Note: For the "Form" tile to appear in the "Content" of the builder, you must successfully implement one of the two methods mentioned above.

Pass a Single Form

Your application passes a single JSON form, potentially including all the fields that may be required in a form. You are in control of which fields are visibile when the form is dragged. From there, users have a vast control on how to customize the form, by:

  • adding or removing fields

  • rearranging their order

  • renaming their labels

  • editing their type

This is the quickest way to get started using forms. You may also decide to include such forms inside templates provided by your application.

Pass Multiple Forms

The Content Dialog feature is available on Beefree SDK only.

If you want to pass more than one form to the builder, you can do so by implementing a on top of the form content block.

With a content dialog, you have full control over the experience of adding a form. A few examples:

  • users can select a form from a predefined list

  • users can browse a list of forms and pick one

  • users can pick a form and have configuration options (e.g. define a layout) before adding it

Here is an example of form selection built with a Content Dialog.

Once the content dialog returns a form to the application, users can then change the form content properties in the builder, by adding and removing fields, rearranging their order. and customizing their labels and style

Load Your Form Builder

You may even want to go a step further and use the Content dialog to load your UI for form creation, on top of the builder; your users will be able to create a new form and add it to the web content they’re building, without interrupting their workflow.

Embed a Third-Party Form

The HTML Block is available on Beefree SDK only.

As an alternative to the above-mentioned methods, your users can add an HTML block and easily embed forms created with available on the market (e.g. Typeform, JotForm, etc.).

Form builders typically offer different options to get an embed code:

  • if the embed code is a script, it will not appear in the stage when building the web content. Due to security reasons, we need to remove such scripts during edit mode. The form will appear regularly both in the preview and in the final HTML output. An example of this behavior is the embed code produced by Typeform;

  • If the embed code lives in an iframe, it will be visible during editing as well. For example, Jotform and Google Forms offer this kind of embedding option.

Customizing forms

Once a form is added to the web content, the user has these options to manage fields:

  • Add and remove fields (unless they are marked as required)

  • Rearrange their order

  • Rename their labels

Besides, end users can , when the “edit” action is available.

Finally, users can apply various styling options to the form:

  • change font type, size, and style;

  • change colors for text and input backgrounds

  • change size for field inputs

  • define borders and paddings

  • position field labels on the top or on the side of the input fields

  • style buttons

  • and more . . .

Editing Form Fields

When managing fields in a form block, users can click on the “Edit” action to change field types and properties. To facilitate the user, the icon next to the label highlights the current field type.

A modal window will pop up:

From this modal, users can:

  • change field type

  • change general field properties

    • label (available also in the sidebar)

    • placeholder (not available for date, multiple/single choice, dropdown)

    • required field

    • read-only field

Clicking on “Type” will open a dropdown with all the available field types:

All fields can be edited, unless:

  • you defined the field in the JSON form as not editable, using the canBeModified attribute

  • the field type is

    • Submit

    • Hidden

    • File upload

    • Label (a special field type with plain text)

Now, let’s have a closer look at the field types that can be configured with the “Edit field” modal.

Email / Phone / Text / Url

These are the easiest field types to configure, as they only have the optional Placeholder property.

The email and URL types will check at form submission, through HTML5 validation, that the value entered is a formally correct email/web address.

Single choice / Multiple choice / Dropdown

Users need to enter the values that will be displayed to visitors. To do this, they will add those values under Options:

They can either:

  • Enter a single value, which will be both the label and the value passed to the host app in the form.

  • Enter couplets such as label | value to differentiate the label shown to visitors from the value passed to your app after form submission. In the example above, users will select Milan from the dropdown at the city they want to visit, but your app will receive “A” as the response for that field.

The Multiple choice type can also be used to create checkboxes, e.g. privacy policy acceptance. In this case, no value should be specified, and any external URL should be added in the field label, like in this example:

Date

This type has no additional properties. The date format of the value returned to the host app will be coherent with browser locale information.

Visitors will enter the date using the browser’s date picker. Otherwise, they can input the date directly, following the automatically generated placeholder for the expected date format.

Number

This type has the option to enter a minimum and/or a maximum allowed value. If not entered, the field will accept any number.

Number fields have a “spinner” input that visitors can use to cycle through allowed values. Visitors can also input a number directly, but the HTML 5 validation will verify if the submitted number falls into the permitted interval.

Long text

This type is just like a text field, but it’s meant for longer inputs. It has an additional “row height” property to define the default height for the text area – which can be adjusted by the visitor by dragging the bottom right corner. Here is how a long text field looks like in a form:

What happens after a form is submitted?

Beefree SDK just passes the data back to the host application. It doesn’t save anything or touch any of the data.

You can implement client-side validation in your JSON forms using the built-in , to validate things like:

  • required field;

  • response length, for strings (“must be less than” or “must be higher than” n characters);

  • response value for numbers (minimum or maximum value allowed);

  • correct type (i.e. the field must contain a number, email address, or some other specific preset type);

  • check against a regular expression that defines a pattern the entered data needs to follow.

Any other post-submission validation and action must be defined and performed by your application, for instance:

  • validating whether the data is acceptable, i.e. email already registered;

  • saving it into a database;

  • passing it to a 3rd application;

  • performing other actions (e.g. sending an email notification).

Developer resources

Learn how to implement the different methods to pass forms to the Builder

A closer look at how to structure a JSON form

Visit our to:

  • dive into some sample forms and quick start your integration;

  • download templates that include those forms;

  • get a validation JSON schema to test your forms with.

Font management

This feature is available on Beefree SDK only.

Introduction

You can customize the list of fonts available in the editor’s text toolbar and the body settings panel.

This feature allows you (or users of your app) to:

  • Expand the list of available fonts, adding web fonts from popular services, such as Google fonts, font library.org or alike.

  • Reduce the list of fonts to a limited number of options, removing some or all our default fonts.

Unlike other premium features, fonts are part of the , so they can be defined each time the editor is started.

This flexible approach will help you use this feature in a variety of scenarios. A few example scenarios are the following:

  • You want your users to customize the list of fonts loaded in the builder when they edit designs. You can now create an interface in your app to do so, and instruct the editor accordingly (see below).

  • You have multiple levels of users, and you want “contributors” to only see a subset of approved fonts, while “editors” have access to a larger list.

  • You are a digital marketing agency, and you want to customize the list of fonts in the editor depending on the client/brand for which the email message is being designed.

For instance, in our hosted (Beefree), we leveraged this Beefree SDK feature to create a “Brand styles > Brand fonts” area where an agency or marketing team can select which fonts have been approved by that brand. Only the selected fonts will be loaded in the builder when an application is initialized. Here is a screenshot.

Adding the editorFonts object

This object, passed as part of the , tells the editor which fonts to load in any drop-down where a list of fonts is shown. It defines the availability of the default fonts and provides a list of additional, custom fonts.

In this example default fonts are loaded, and two new fonts are added: a web safe font (Comic Sans) and a Google hosted web font (Lobster).

Here is a more detailed description on how the editorFonts object is built:

Parameters

Parameter
Description

Working with custom fonts

When we add a set of custom fonts, we can decide between system fonts and web fonts. Let’s see some details on what you need to know:

System fonts are installed on the operative systems and don’t need any external resource to work, so we can skip the url parameter.

Web fonts are hosted online and need to be loaded by the email client when the email is opened. Beefree SDK accepts only the CSS font embedding method, and the CSS file must be hosted in HTTPS protocol. You can use services like Google fonts, that provides host, font stacks and a well formatted CSS file.

Usage examples

We want the editor to work with only 2 fonts when creating a message, we want that only Lobster and Cabin fonts are available when editing this message:

In the following example, instead, we don’t want to add new fonts but restrict the default ones to our own selection:

Notice that if you want to change the default set of fonts, you need to disable them and use custom fonts to indicate the new set, including the URL parameter for web fonts.

This is the complete list of the default fonts in the application and its configuration, including the external URL for web fonts:

In this example, we want to add font weight options to our list:

Templates with unavailable fonts

We open a saved template that uses fonts that are not available:

  • System fonts will display normally in the editor and the text can be edited, but the font-family is not available in the font selector.

  • Web fonts will fallback to a system font. Text can be edited and the font-family is not available on the font selector.

  • We are able to save the message that already uses unavailable fonts.

Mobile Design Mode

Overview

Thanks to Mobile Design Mode, your customers can easily design responsive emails, pages, and popups for mobile without switching between the builder stage and preview mode. When enabled, your customers will be able to:

  • Easily switch between desktop and mobile view to access and edit content;

  • Edit padding, text alignment, and font size optimized for Mobile;

  • Instantly display the results of – such as do not stack/reverse stack/hide on mobile;

  • Extend Beefree SDK’s design flexibility and build mobile-first campaigns.

Use cases

  • Mobile-first design: Start the builder in Mobile view, and let the user switch as needed.

  • Mobile-only editing: Start the builder in Mobile view, and hide the widget to switch views.

  • Control hidden elements visibility: Remove the “Visibility” toggle and decide if elements with a “hide on” property can be visible with the blur effect or are not visible during editing.

  • Custom UI controls: start the builder in a predefined mode and offer your UI controls to switch between views and hidden elements visualization. To do so, you can use the loadStageMode method to trigger a change from your application.

You can also use the loadStageMode method to disable Mobile editing mode.

Demo

Here is a video explaining why we built Mobile design mode and how it enhances the design UX of Beefree SDK.

How to enable Mobile Design Mode

If your application doesn’t have Mobile Design Mode enabled yet, you need to enable it. It takes just a few clicks:

  1. Select the application you want to configure > Click Details

    We recommend testing the feature first with a DEV or QA application

  2. Go to Application Configuration > View More

  3. Go to Services > Toggle Enable mobile design mode ON

  4. Click Save on the top-right corner of the page.

    Congrats! You’ve successfully enabled Mobile Design Mode!

How it works

When Mobile Design Mode is enabled for an application at , the builder will display two new icons in the upper-left corner of the content area, as highlighted below.

The desktop view (screen icon on the left) will leverage your browser’s full width.

The mobile view (mobile icon on the right) will resize the work area width to 320px to simulate a mobile screen.

Note: When Mobile design mode is enabled, users will work on a single template that will include both the desktop design and the mobile one. The template doesn’t require any duplicates. The mobile edits will be automatically saved and reflected in the templates.

Mobile optimization settings

Beefree SDK provides settings both for rows and content blocks.

To change how content behaves on mobile and create a mobile version of an email, page, or popup:

  • Hide on mobile/Hide on desktop (available on developers.beefree.io)

    • A content property to hide a block when displaying the email/page on a specific device.

  • Do not stack on mobile (available on developers.beefree.io)

    • When this option is enabled for a row, adjacent columns will not be stacked on mobile devices. The columns will stay side-by-side, as in the desktop view.

  • Reverse stacking on mobile (available on developers.beefree.io)

    • When turned on for a row, columns for that row will stack in reverse order, i.e., from the rightmost to the leftmost.

These settings become more accessible with Mobile Design Mode, as users can immediately view the desktop vs. mobile design.

Displaying hidden elements

There is an additional setting to preview hidden elements included in a template. With the Hide-on enabled a “Visibility” icon will appear next to the Desktop vs. Mobile stage icons.

When the Visibility button is ON (default behavior):

  • The builder will display content blocks set as hidden for the current device;

  • Hidden elements will be blurred out;

  • A small icon in the outline of the block will appear whenever hovering with the mouse on the hidden element.

When Visibility is OFF:

  • Hidden elements won’t be visible in the content area;

  • The template will be available as it is;

Here is how the Visibility toggle changes the experience when editing a recent Beefree SDK newsletter.

The device preview matches the stage selected when accessing the design preview. This doesn’t apply if you have implemented a custom-built preview.

Builder limitations in mobile view

When a user is working in the Mobile stage, the features available are the same as in the desktop stage, with a few exceptions:

  • The content area width cannot be scaled – it can only be changed in the desktop view;

  • Users can add or delete columns within a row, but they won’t be able to resize them.

Designing content for Mobile

When designing content for Mobile, users may require more flexibility in the way they arrange or format elements to fit a smaller screen.

Thanks to the latest Mobile Design Mode updates, users can now control individual elements straight from the mobile stage without the need to duplicate them.

Users can optimize the design of the following content properties by switching to the Mobile Design Stage:

  • Padding

  • Alignment

  • Font size

It is now possible to style these elements for Mobile or Desktop.

These three mobile-optimized properties are available for the following content type modules:

  • Title

  • Paragraph

  • List

  • Form

  • Icons

  • Menu

  • Button

To edit a specific parameter for mobile, users must switch to the Mobile stage and select the content element they want to edit.

They will find the Mobile-optimized properties in the sidebar menu, under the “Content Properties” tab.

Mobile-optimized elements are flagged with a clickable “Mobile” pill, as shown in the image below:

When the pill is highlighted in light blue, it means the property has been edited and applied in the mobile stage. The mobile pill can be styled using if covered by your .

Users can click on the x to revert the property back to the desktop.

Editing Font Size on Mobile

We have also improved the user experience by moving the Font Size Controls, previously displayed in the formatting tiny menu available in the content area, to the Content Properties Tab in the sidebar menu.

Tracking changes in the history

All the edits performed in the Mobile Stage are tracked and flagged in the history as (Mobile) edits.

Customization options

Mobile Design Mode can be considered a “plug-and-play” feature because it just needs to be enabled on the and can be used by your users out of the box.

If you want to customize the user experience, Beefree SDK allows you to configure a few client-side options to control permissions and styles. Take a look at the code snippet below to see how to load these settings into the initial configuration as part of the workspace section.

Here is a brief description of the parameters and their options. They are all optional.

Parameter
Description
Values
Default

AddOns Overview

Learn more about AddOns at a high-level.

Why AddOns?

From the moment Beefree’s first email builder was released to the public, people started asking for new “things” to be available in the Content tab, so that they would be able to do more with the drag-and-drop editor.

Like inserting a countdown timer in a promotional email, or a QR code in an event ticket reminder, or live weather on a landing page.

They wanted to be able to go from this…

… to this:

… so that additional features are available in Beefree’s editors to build richer emails, landing pages, popups, and other digital content.

Everybody wins

Beefree SDK is used by over 600 software companies in all kinds of industries. Through their applications, hundreds of thousands of marketers create countless emails and landing pages, which reach millions of people.

With AddOns, richer emails and landing pages can be created, and everybody wins:

  • The people that receive those emails or view those pages, have a better experience.

  • The marketers that create them, have more ways to engage their audience.

  • The applications that embed Beefree’s builders can give those marketers better tools.

  • The AddOn providers reach more marketers through those apps.

  • And all of the above creates an overall more successful community around Beefree.

Types of AddOns

You can either that have been built by other companies or .

If you wish to build an AddOn, you can either build an AddOn that’s just for you, and one that is available to any application that uses Beefree SDK. We call the former , and the latter , as companies partner with us to extend the core functionality of Beefree’s content builders.

Custom AddOns

This feature is available on Beefree SDK's and above. If you're on the Core or Essentials plan, for free to try this and other Superpowers-level features.

To add your own content tiles to the Content tab in a Beefree editor, you will need to develop a Custom AddOn.

For example, say your application is an event marketing system and you want your users to be able to drag-n-drop a QR code into an email. The QR code is generated by your event marketing system when the email is sent. The feature only works for your application. That’s a .

For details on developing Custom AddOns, see .

This is an advanced feature that requires the . Of course, you can test it in a development environment at no extra charge, if you wish to do so.

Partner AddOns

This feature is available on Beefree SDK's only.

There is a growing for Beefree SDK customers, and there are more in the works. All these AddOns are available in a public directory inside the Beefree SDK Console. Application developers that have embedded a Beefree builder are able to quickly .

Interested in partnering with us? Learn how to submit a .

Using vs. building AddOns

Using AddOns

Here is how you can locate and :

  • Access the directory from within the , from the Details page of any application that you have created.

  • Browse the list. These AddOns can help your end-users with things like countdown timers, dynamic maps, personalized cards, etc.

  • Install any AddOn with just a few clicks. Please note that some AddOns will require that you become a customer of the AddOn provider and obtain an API key.

For more, see .

https://drive.google.com/file/d/1waaMV9dDwUqpIOcDzEnJC5PfzQgElK6l/view?usp=sharingdrive.google.com
Page Builder
Popup Builder
configuration parameters
content dialog
Learn more about this method
paid plans
Content dialog
Learn more about this method
paid plans
any form builder
edit fields
HTML5 form validation
Passing forms to the Builder
Form structure and parameters
Sample forms and templates
GitHub account

editorFonts: {
    showDefaultFonts: true,
    customFonts: [{
        name: "Comic Sans",
        fontFamily: "'Comic Sans MS', cursive, sans-serif"
    }, 
    {
        name: "Lobster",
        fontFamily: "'Lobster', Georgia, Times, serif",
        url: "https://fonts.googleapis.com/css?family=Lobster"
    }]
}

showDefaultsFonts

This boolean parameter indicates if the entire list of default fonts is available or not. When the value is false, only the fonts added as custom fonts will be active in the editor.

customFonts

When the default font parameter is true, the custom fonts declared inside this object will be added to the list of default fonts: both are loaded into the editor. Otherwise, only custom fonts will be shown. Each customFonts element can have the following properties:

Parameter
Description

name

This string will be shown in the font dropdown list. You can use the term you prefer and we suggest the usage of common font names, but you can go creative and use semantic names that fit on your application. Long strings may impact the interface, so we recommend to keep it short. The characters { } [ ] : ” / \ | ? * are invalid.

fontFamily

Describes the CSS font stack that will be applied to the final HTML. Is important that you provide at least one fallback font to ensure that the text is not displayed using an unwanted font family. Is important that you use single quote marks with the font names instead of double quotation marks to maintain a correct JSON syntax.

url

This parameter is used only when we work with web fonts. Is important that the URL points to a CSS file with the @font-face properties, and not directly to the font files. To work, the CSS must be hosted in HTTPS.

fontWeight

Adds a new option in the dropdown of the content block’s settings for title, button, paragraph, and list blocks (e.g. 100: Thin). If not defined, only Regular (400) and Bold (700) will be available.


editorFonts: {
    showDefaultFonts: false,
    customFonts: [{
        name: "Cabin",
        fontFamily: "'Cabin', Helvetica, Arial, sans-serif",
        url: "https://fonts.googleapis.com/css?family=Lobster"
    }, 
    {
        name: "Lobster",
        fontFamily: "'Lobster', Georgia, Times, serif",
        url: "https://fonts.googleapis.com/css?family=Lobster"
    }]
}

editorFonts: {
    showDefaultFonts: false,
    customFonts: [{
        name: "Helvetica",
        fontFamily: "'Helvetica Neue', Helvetica, Arial, sans-serif",
    },
    {
        name: "Lucida",
        fontFamily: "'Lucida Grande', 'Lucida Sans', Geneva, Verdana, sans-serif"
    },
    {
        name: "Georgia",
        fontFamily: "Georgia, Times, 'Times New Roman', serif"
     },
     {
        name: "Lato",
        fontFamily: "'Lato', Tahoma, Verdana, sans-serif",
        url: "https://fonts.googleapis.com/css?family=Lato"
     },
     {
        name: "Montserrat",
        fontFamily: "'Montserrat', Trebuchet MS, Lucida Grande, Lucida Sans Unicode, sans-serif",
        url: "https://fonts.googleapis.com/css?family=Montserrat"
      }]
}

  {
    name: "Arial",
    fontFamily: "Arial, 'Helvetica Neue', Helvetica, sans-serif"
  }, {
    name: "Courier",
    fontFamily: "'Courier New', Courier, 'Lucida Sans Typewriter', 'Lucida Typewriter', monospace"
  }, {
    name: "Georgia",
    fontFamily: "Georgia, Times, 'Times New Roman', serif"
  }, {
    name: "Helvetica Neue",
    fontFamily: "'Helvetica Neue', Helvetica, Arial, sans-serif"
  }, {
    name: "Lucida Sans",
    fontFamily: "'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Geneva, Verdana, sans-serif"
  }, {
    name: "Tahoma",
    fontFamily: "Tahoma, Verdana, Segoe, sans-serif"
  }, {
    name: "Times New Roman",
    fontFamily: "TimesNewRoman, 'Times New Roman', Times, Beskerville, Georgia, serif"
  }, {
    name: "Trebuchet MS",
    fontFamily: "'Trebuchet MS', 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, sans-serif"
  }, {
    name: "Verdana",
    fontFamily: "Verdana, Geneva, sans-serif"
  }, {
    name: "ヒラギノ角ゴ Pro W3",
    fontFamily: "ヒラギノ角ゴ Pro W3, Hiragino Kaku Gothic Pro,Osaka, メイリオ, Meiryo, MS Pゴシック, MS PGothic, sans-serif"
  }, {
    name: "メイリオ",
    fontFamily: "メイリオ, Meiryo, MS Pゴシック, MS PGothic, ヒラギノ角ゴ Pro W3, Hiragino Kaku Gothic Pro,Osaka, sans-serif"
  }, {
    name: "Bitter",
    fontFamily: "'Bitter', Georgia, Times, 'Times New Roman', serif",
    url: "https://fonts.googleapis.com/css?family=Bitter"
  }, {
    name: "Droid Serif",
    fontFamily: "'Droid Serif', Georgia, Times, 'Times New Roman', serif",
    url: "https://fonts.googleapis.com/css?family=Droid+Serif"
  }, {
    name: "Lato",
    fontFamily: "'Lato', Tahoma, Verdana, Segoe, sans-serif",
    url: "https://fonts.googleapis.com/css?family=Lato"
  }, {
    name: "Open Sans",
    fontFamily: "'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif",
    url: "https://fonts.googleapis.com/css?family=Open+Sans"
  }, {
    name: "Roboto",
    fontFamily: "'Roboto', Tahoma, Verdana, Segoe, sans-serif",
    url: "https://fonts.googleapis.com/css?family=Roboto"
  }, {
    name: "Source Sans Pro",
    fontFamily: "'Source Sans Pro', Tahoma, Verdana, Segoe, sans-serif",
    url: "https://fonts.googleapis.com/css?family=Source+Sans+Pro"
  }, {
    name: "Montserrat",
    fontFamily: "'Montserrat', 'Trebuchet MS', 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, sans-serif",
    url: "https://fonts.googleapis.com/css?family=Montserrat"
  }, {
    name: "Ubuntu",
    fontFamily: "'Ubuntu', Tahoma, Verdana, Segoe, sans-serif",
    url: "https://fonts.googleapis.com/css?family=Ubuntu"
}

var editorFonts = {
        showDefaultFonts: true,
        customFonts: [{
          name: "Comic Sans MS",
          fontFamily: "'Comic Sans MS', cursive, sans-serif"
        },{
          name: "Indie Flower",
          fontFamily: "'Indie Flower', cursive",
          url: "https://fonts.googleapis.com/css?family=Indie+Flower"
        },{
          name: "Oswald",
          fontFamily: "'Oswald', sans-serif",
          url: "https://fonts.googleapis.com/css2?family=Oswald:wght@200;300;400;500;600;700&display=swap",
          fontWeight: {
            200: 'Extra-light',
            300: 'Light',
            400: 'Regular',
            500: 'Medium',
            600: 'Semi-bold',
            700: 'Bold',
          }
        }]
      };
paid plans
client-side configuration
email design suite
builder configuration
use AddOns
build new ones
Custom AddOns
Partner AddOns
Superpowers plan
upgrade a development application
Custom AddOn
AddOn Development
Superpowers plan
paid plans
library of Partner AddOns
select and install any of those AddOns
Partner AddOn
install ready-to-go AddOns
Beefree SDK Console
Using AddOns
(smile)

Allowed form fields

This page provides a comprehensive list of HTML form field types, detailing their unique attributes and options, along with global attributes that apply to all fields.

Global Attributes

The following global attributes are applicable across all field types. They define essential properties related to accessibility, content structure, behavior, and presentation. Reference the Global attributes and Attributes sub-sections of the HTML reference in mdn web docs to try out the attributes and learn more about their specifications.

List of Global Attributes and their corresponding explanations:

  • accesskey: Defines a shortcut key to activate or focus an element.

  • class: Assigns one or more class names to an element, used for styling and script interaction.

  • contenteditable: Indicates whether the content of the element is editable.

  • dir: Specifies the text direction (ltr, rtl, or auto).

  • disabled: Disables an element, making it not selectable.

  • readonly: Prevents modification of the element’s content while still allowing interaction.

  • draggable: Allows the element to be dragged.

  • hidden: Hides the element.

  • id: Assigns a unique identifier to an element.

  • name: Specifies the name of the form control. Reference the mdn web docs on the name attribute to try it and learn more about its specifications.

  • itemid: Provides a unique identifier for items when using microdata.

  • itemprop: Specifies properties for microdata.

  • itemref: References other items related to the current item for microdata.

  • itemscope: Defines the scope of an item for microdata.

  • itemtype: Defines the type of an item for microdata.

  • lang: Declares the language of the element’s content.

  • tabindex: Defines the tab order for focusable elements.

  • title: Provides additional information about an element, often used as a tooltip.

  • value: Specifies the value of the input element.

Unique Attributes

The following sections list the unique attributes for each field type. Reference the <input> types sub-section of the HTML Reference section of the mdn web docs to try out and learn more about unique attributes outlined in the subsequent sections.

Note: Global Attributes apply to each of the field types listed in the following sections.

Checkbox Field

The checkbox field allows users to select multiple options from a list. It is often used to toggle between two states, like "checked" or "unchecked."

Unique Attributes:

  • checked (boolean): Specifies whether the checkbox is selected by default.

Available Options:

  • options: An array of options, each with:

    • value (string)

    • label (string)

Color Field

The color field allows users to select a color from a color picker.

Unique Attributes:

  • autocomplete (string): Specifies if the browser should provide autocomplete suggestions.

  • list (string): Refers to a <datalist> that provides predefined color options.

  • required (boolean): Specifies that the field must be filled before form submission.

Datalist Field

The datalist field provides a list of predefined options for other input fields, enhancing usability by offering suggestions.

Unique Attributes:

No unique attributes.

Available Options:

  • options: An array of options, each with:

    • value (string)

Date Field

The date field allows users to select a date, displayed as a date picker.

Unique Attributes:

  • autocomplete (string): Specifies if the browser should suggest previously entered dates.

  • max (string): Sets the maximum date allowed.

  • min (string): Sets the minimum date allowed.

  • required (boolean): Specifies that a date must be selected before submission.

  • step (string): Specifies the granularity of selectable dates (e.g., steps in days).

Datetime-Local Field

The datetime-local field allows users to input both a date and a time.

Unique Attributes:

  • autocomplete (string)

  • max (string): Sets the maximum allowed date and time.

  • min (string): Sets the minimum allowed date and time.

  • required (boolean): Requires a date and time before form submission.

  • step (string): Specifies the granularity of selectable times (e.g., steps in minutes).

Email Field

The email field is used for inputting one or more email addresses.

Unique Attributes:

  • autocomplete (string)

  • maxlength (string): Specifies the maximum number of characters allowed.

  • minlength (string): Specifies the minimum number of characters required.

  • multiple (boolean): Allows multiple email addresses.

  • placeholder (string): Displays a hint to the user.

  • required (boolean): Requires an email address before form submission.

  • size (string): Sets the visible width of the input.

File Field

The file field allows users to upload one or more files from their device.

Unique Attributes:

  • accept (string): Specifies the types of files accepted by the server (e.g., image/png).

  • capture (string): Allows capturing images/audio from the camera/microphone if supported.

  • multiple (boolean): Allows selecting multiple files.

  • required (boolean): Specifies that at least one file must be uploaded.

Hidden Field

The hidden field stores data that the user cannot see or interact with but is submitted with the form.

Unique Attributes:

  • autocomplete (string)

Image Field

The image field creates a graphical submit button using an image.

Unique Attributes:

  • alt (string): Provides alternate text if the image cannot be displayed.

  • height (string): Specifies the image URL.

  • src (string): Defines the height of the image (in pixels).

  • width (string): Defines the width of the image (in pixels).

Label Field

The label field associates a text label with a form control, improving accessibility.

Unique Attributes:

No unique attributes.

Month Field

The month field allows users to select a month and year without choosing a specific day.

Unique Attributes:

  • autocomplete (string)

  • max (string): Specifies the latest allowed month.

  • min (string): Specifies the earliest allowed month.

  • required (boolean): Ensures a selection is made before form submission.

  • step (string): Defines the interval for month selection.

Number Field

The number field allows users to input numeric values.

Unique Attributes:

  • autocomplete (string)

  • max (number): Sets the maximum allowed value.

  • min (number): Sets the minimum allowed value.

  • required (boolean): Requires a numeric value before submission.

  • step (number): Specifies the allowed increment for numbers.

Password Field

The password field allows users to input masked text (e.g., passwords).

Unique Attributes:

  • autocomplete (string)

  • maxlength (string): Limits the number of characters allowed.

  • minlength (string): Sets the minimum number of characters required.

  • pattern (string): Specifies a regular expression for validation.

  • placeholder (string): Provides a hint to the user.

  • required (boolean): Specifies that the field must be filled.

  • size (string): Defines the visible width of the input.

Radio Field

The radio field allows users to select one option from a group.

Unique Attributes:

  • checked (boolean): Indicates whether the radio button is selected by default.

  • required (boolean): Specifies that one option must be selected before form submission.

Available Options:

  • options: An array of options, each with:

    • value (string)

    • label (string)

Range Field

The range field allows users to select a numeric value within a range, often displayed as a slider.

Unique Attributes:

  • autocomplete (string)

  • max (number): Sets the maximum allowed value.

  • min (number): Sets the minimum allowed value.

  • step (number):Defines the granularity of the range (e.g., steps in increments of 1 or 10).

Select Field

The select field creates a dropdown list that allows users to choose one or more options.

Unique Attributes:

  • autocomplete (string)

  • multiple (boolean): Allows multiple selections if set to true.

  • required (boolean): Specifies that the user must select at least one option.

  • size (string): Defines the number of visible options in the dropdown.

Available Options:

  • options: An array of options, either:

    • option elements, with:

      • value (string)

      • label (string)

    • optgroup elements, containing groups of options.

Search Field

The search field allows users to enter search queries with specialized input handling.

Unique Attributes:

  • autocomplete (string)

  • dirname (string): Submits the text directionality of the search field with the form.

  • maxlength (string): Limits the number of characters allowed in the input.

  • minlength (string): Specifies the minimum number of characters.

  • placeholder (string): Provides a hint about the expected input.

  • required (boolean): Ensures that a search term is entered before submission.

Submit Field

The submit field creates a button that submits the form data.

Unique Attributes:

  • data-sitekey (string): Used in conjunction with reCAPTCHA to verify form submissions.

  • data-callback (string): Defines a JavaScript function to be executed after submission.

  • data-action (string): Defines an action to be associated with the submit button.

  • width (string): Defines the width of the submit button.

Tel Field

The tel field allows users to enter telephone numbers.

Unique Attributes:

  • autocomplete (string)

  • maxlength (string): Limits the number of characters allowed.

  • minlength (string): Sets the minimum number of characters required.

  • pattern (string): Provides a pattern for validation (e.g., for formatting telephone numbers).

  • placeholder (string): Displays a hint about the expected input.

  • required (boolean): Specifies that a telephone number must be entered before submission.

  • size (string): Defines the visible width of the input.

Text Field

The text field allows users to input text.

Unique Attributes:

  • autocomplete (string)

  • maxlength (string): Limits the number of characters allowed.

  • minlength (string): Specifies the minimum number of characters.

  • pattern (string): Provides a regular expression for validation.

  • placeholder (string): Displays a hint for the expected input.

  • required (boolean): Ensures that a value is entered before form submission.

  • size (string): Specifies the visible width of the text input.

Textarea Field

The textarea field allows for multi-line text input, offering more space than the text field.

Unique Attributes:

  • autocomplete (string)

  • cols (number): Defines the visible width of the textarea in characters.

  • rows (number): Defines the visible height of the textarea in lines.

  • maxlength (string): Limits the number of characters allowed.

  • minlength (string): Sets the minimum number of characters required.

  • placeholder (string): Provides a hint about the expected input.

  • spellcheck (string): Enables or disables spell checking.

  • wrap (string): Controls text wrapping behavior (e.g., "hard" or "soft").

  • required (boolean): Specifies that input is mandatory before form submission.

Time Field

The time field allows users to input a time (hours, minutes, and optionally seconds).

Unique Attributes:

  • autocomplete (string)

  • max (string): Sets the latest allowable time.

  • min (string): Sets the earliest allowable time.

  • required (boolean): Requires a time to be entered before form submission.

  • step (string): Specifies the time granularity (e.g., steps in seconds).

URL Field

The url field is used for inputting valid URLs.

Unique Attributes:

  • autocomplete (string)

  • maxlength (string): Sets the maximum number of characters allowed.

  • minlength (string): Specifies the minimum number of characters required.

  • placeholder (string): Provides a hint for the expected input.

  • required (boolean): Ensures that a valid URL is entered before form submission.

Week Field

The week field allows users to select a specific week within a year.

Unique Attributes:

  • autocomplete (string)

  • max (string): Specifies the latest week that can be selected.

  • min (string): Specifies the earliest week that can be selected.

  • required (boolean): Requires a week to be selected before form submission.

  • step (string): Specifies the granularity of week selection.



bee.loadStageMode({
  mode: 'mobile',
  display: 'hide',
})

bee.loadStageMode({
  mode: 'global',
})

workspace: {
  type: 'default', // default, mixed, amp_only, html_only
  stage: 'desktop', // desktop, mobile, global
  displayHidden: 'blur', // blur, hide
  hideStageToggle: true, // default = false
}

type

loads different workspace types (currently used to handle AMP content visibility).

default, mixed, amp_only, html_only

default

stage

Define if the builder starts in desktop view, mobile view, or global (i.e. without desktop/mobile views.)

desktop, mobile, global

inherits Developer account configuration

displayHidden

if defined, hidden elements will behave based on the parameter value.

blur, hide

blur

hideStageToggle

if true, the mobile/desktop icons to switch view are not visible

true, false

false

mobile optimization options
Login into developers.beefree.io
developers.beefree.io
Custom CSS
subscription plan
Beefree SDK Console

Configuration parameters

Discover the configuration parameters within Beefree SDK.

Passing Configurations to Beefree SDK

Once you have initialized your Beefree SDK application, you can pass a series of configuration parameters to it.

The following code displays an example of a default configuration:

var beeConfig = {
    uid: 'CmsUserName', // [mandatory]
    container: 'bee-plugin-container', // [mandatory]
    autosave: 30, // [optional, default:false]
    language: 'en-US', // [optional, default:'en-US']
    trackChanges: true, // [optional, default: false] 
    specialLinks: specialLinks, // [optional, default:[]] 
    mergeTags: mergeTags, // [optional, default:[]]
    mergeContents: mergeContents, // [optional, default:[]]
    preventClose: false, // [optional, default:false]
    editorFonts : {}, // [optional, default: see description]
    contentDialog : {}, // [optional, default: see description]
    defaultForm : {}, // [optional, default: {}]
    roleHash : "", // [optional, default: ""]
    rowDisplayConditions : {}, // [optional, default: {}]
    rowsConfiguration: {},
    workspace: { // [optional, default: {type : 'default'}]
        editSingleRow: false // [optional, default: false]},
    },
    commenting: false, // [optional, default: false]}
    commentingThreadPreview: true, // [optional, default: true]}
    commentingNotifications: true, // [optional, default: true]}
    disableLinkSanitize: true, // [optional, default: false]}
    loadingSpinnerDisableOnSave: false, // [optional, default: false]}
    loadingSpinnerDisableOnDialog: true, // [optional, default: false]}
    onSave: function(jsonFile, htmlFile) { /* Implements function for save */ }, // [optional]
    onChange: function(jsonFile, response) { /* Implements function for change */ }, // [optional]
    onSaveAsTemplate: function(jsonFile) { /* Implements function for save as template (only JSON file) */ }, // [optional]
    onAutoSave: function(jsonFile) { /* Implements function for auto save */ }, // [optional]
    onSend: function(htmlFile) { /* Implements function to send the message */ }, // [optional]
    onLoad: function(jsonFile) { /* Implements function to perform an action once the template is loaded */}, // [optional]
    onError: function(errorMessage) { /* Implements function to handle error messages */ }, // [optional]
    onWarning: function(alertMessage) { /* Implements function to handle error messages */ }, // [optional]
    translations: {
        'bee-common-widget-bar': {
            content: 'MODULES',
        },
        // additional translations...
    },
    // other properties...
};

Parameters

The following table provides a list of the required parameters.

Parameter
Description
Default

uid

An alphanumeric string that identifies the user and allows the SDK to load resources for that user (e.g. images).

  • Min length: 3 characters

  • Can contain letters from a to z (uppercase or lowercase), numbers and the special characters _ (underscore) and – (dash)

  • It is a string and not a numeric value

It uniquely identifies a user of Beefree SDK. When we say “uniquely”, we mean that:

  • It will be counted as a unique user for monthly billing purposes.

  • Images (and other files) used by the user when creating and editing messages will be associated with it and not visible to other users (when using the default storage).

container

Identifies the id of div element that contains Beefree SDK.

Language Parameter

The following table provides a list of the language options for the language parameter. The language parameter is not required and has a default value of en-US.

Available Languages

Language
4-letter language identifier (e.g. “en-US”, ISO 639-1 format)

English:

en-US

Spanish:

es-ES

French:

fr-FR

Italian:

it-IT

Portuguese:

pt-BR

Indonesian:

id-ID

Japanese:

ja-JP

Chinese:

zh-CN

Traditional Chinese:

zh-HK

German:

de-DE

Danish:

da-DK

Swedish:

sv-SE

Polish:

pl-PL

Hungarian:

hu-HU

Russian:

ru-RU

Korean:

ko-KR

Dutch:

nl-NL

Finnish:

fi-FI

Czech:

cs-CZ

Romanian:

ro-RO

Norwegian (Bokmål):

nb-NO

Slovenian:

sl-SI

Parameters

The following table provides a list of the optional parameters and their corresponding descriptions.

Parameter
Description
Default

trackChanges

Track message changes in the editor via the “onChange” callback. See “Tracking message changes” for further details.

false

specialLinks

An array of custom links that may be used in the message (e.g. unsubscribe). See “extending the editor” for further details.

[]

mergeTags

An array of merge tags that may be used in the message (e.g. first name of the recipient). See “extending the editor” for further details.

[]

mergeContents

An array of content elements that may be used in the message (e.g. small blocks of HTML). See “extending the editor” for further details.

[]

preventClose

Whether an alert should be shown when the user attempts to leave the page before saving.

false

editorFonts

Customize the list of available fonts in the editor’s text toolbar and the BODY settings panel. See “Font management” for further details.

See “Font management” for the default object.

roleHash

Identifies the user role:

  • Minimum length is 8, maximum is 30

  • Alphanumerical string only: No whitespaces, no special characters such as “_” and “-“

See “Roles and permissions” for further details.

""

rowDisplayConditions

Allows for conditional statements in email messages. See “Display Conditions” for further details.

{}

workspace

Configure the initial workspace for loading the editor. Currently used for AMP content visibility. See “Workspaces” for further details.

{type : 'default'}

contentDialog

Allows to exchange data with Beefree SDK using a UI layer you control. See the “” page for the complete reference.

{}

defaultForm

This should contain a structure object with the form data. See “” for further details.

{}

commenting

Enables commenting on content blocks and rows. See for further details.

false

commentingThreadPreview

Enables a pop-over preview on the stage for comments.

true

commentingNotifications

Enables notifications of new comments in co-editing.

true

disableLinkSanitize

Disables link validation for URLs, including telephone number or SMS to enable merge content use.

false

loadingSpinnerDisableOnSave

Controls the visibility of the builder in a loading state.

false

loadingSpinnerDisableOnDialog

Controls the visibility of the builder in a loading state.

false

AMP for Email

What is AMP for Email?

AMP is an open-source, web component framework, maintained by the OpenJS Foundation with significant support from Google. Its goal is to create great experiences across the web, focusing on interactivity and speed.

AMP for Email features interactive elements that email readers can use to take action directly in the inbox. It can also be used to fetch up-to-date information and present it each time an email is opened.

How AMP for email works

Traditionally, a marketing or a transactional email is a multipart message, with two different parts delivered as different MIME types.

  • HTML: this is what the vast majority of email clients support. It is also the usual output of our email builder.

  • Text: Originally, this was the only way to send emails. When the HTML MIME type was rolled out, not all email clients supported HTML, or readers could set their client to stick to the Text version. The text part still acts as a fallback for the HTML part. Beefree builders do not produce this MIME type.

AMP for Email works by creating AMP markup that looks like HTML but is a new specification. That code is written in a separate email file, delivered using a third, additional MIME type (on top of existing HTML and text types). We’ll provide an additional AMPHTML document when there’s AMP content in the email saved by Beefree’s email builder.

The AMPHTML version will be delivered only to the inboxes of service providers that support AMP – currently Gmail, Yahoo Mail (webmail only), and mail.ru. All other clients will fall back to the HTML version.

Please note that adding AMP content in Beefree’s email builder is only possible through our AMP-powered widgets. We currently do not support adding AMPHTML markup directly into the message. Our first AMP content block is the AMP Carousel.

Activating the AMP Carousel

The AMP Carousel is OFF by default and you must first activate it in the Beefree SDK Console.

To do so:

  • Login into the Beefree SDK Console

  • Click Details next to the application you want to configure

    • We recommend you first try the AMP carousel under a DEV or QA application

  • Click view more under Application configuration.

  • In the AMP Content section, toggle Enable AMP Carousel ON and click the Save button to activate Commenting for the application.

Next, to activate the AMP Carousel when launching the builder, you will need to initialize your Beefree application with an AMP-compatible workspace.

Using workspaces for AMP

We recommend starting by initializing a Beefree application with a “mixed” workspace, which is the most straightforward way of testing out the AMP Carousel. This parameter will:

  • activate the AMP Carousel block in the Content tab;

  • add a Hide on AMP/HTML property in the “block options” section of content blocks. This property will be essential when creating AMP emails to manage content visibility and fallbacks.

Also, when the message contains AMP content, you will:

  • see a switch between the HTML and the AMP version in the message preview;

  • receive an additional AMPHTML document when the OnSave method is fired.

Here is how to load a Beefree application with a “mixed” workspace:


type ClientConfig = {
  workspace?: {
    type:'default'|'mixed'|'amp_only'|'html_only'
  }
  // ....
}

const beeConfig: ClientConfig = {
  workspace:{
    type:'mixed'
  }
  // ....
}


//Create the instance 
function BeePlugin.create(token, beeConfig, (beePluginInstance) => { 
  //.... 
}

If the workspace is loaded successfully, a onLoadWorkspace(workspace) callback is triggered.


//SUCCESS 
onLoadWorkspace: function (workspace) {
  console.log(`workspace: ${workspace} has been loaded`);
},

Visit Workspaces to learn more about what workspaces are and the additional workspaces you can use for AMP content.

Loading a template with AMP content

If you don’t set a workspace when loading the builder, AMP widgets are not visible in the Content tab. However, if a message or template containing AMP is loaded, the builder will send an onWarning callback to your application. At that point, you may decide to switch to an AMP-compatible workspace, using the loadWorkspace method.

How to use the AMP carousel

The Carousel content tile will appear in the Content tab after enabling it in the Beefree SDK Console and loading the editor with an AMP-compatible workspace, as described above.

To start creating a carousel, users need to drag and drop the carousel block to the stage. By clicking on “browse” or dropping an image file in the block, they can start adding images, or as we call them in this context, “slides”.

The carousel looks best using images of the same size. However, it is possible to mix sizes in the slides: in that case, the logic that drives how the carousel is rendered is that the first slide will determine the carousel ratio. The slides that follow will be adapted to that ratio.

Beyond this, remember that images will be adapted to fill the carousel width, so if users choose an image less wide than the carousel, it will be stretched to fill it.

For each slide, users can:

  • set an alternate text in case the slide doesn’t load, the email client blocks images or the email is opened with a screen reader;

  • set a link so that clicking or tapping on the slide takes recipients to a specific destination;

  • rearrange the slides in the carousel by dragging the slide card inside the content properties panel;

  • Change image or delete the slide by using the controls in the slide card.

There are two additional properties for a carousel:

  • Autoplay, to enable automatic scrolling between slides, setting the interval in seconds between each slide (the autoplay stops if the recipient interacts with the carousel).

  • Dot navigation, to add a dot for each slide, so that the reader can jump to different images without scrolling with the arrows. The user can define the color of the dots.

The carousel can be previewed right inside the editing stage, using the left and right arrows in the AMP carousel block:

For a full preview, using real AMPHTML, users need to hit Preview, and they can switch between the AMP and the HTML version, both on mobile and desktop.

Creating the HTML fallback

When using AMP content, it’s essential to create fallback for email clients that don’t support AMP. The fallback can be easily obtained with the “Hide on AMP/HTML” widget, available on all blocks as a content property.

It is very similar to the “Hide on Desktop/Mobile” control. Users can add the content for the HTML fallback and mark it as “Hide on AMP”. Inside the stage, a visual cue in the block’s outline will identify the block as hidden on AMP.

Besides the carousel, users can mark any part of the email as AMP-only by applying the “Hide on HTML” property.

FAQs on the AMP Carousel

What image formats are supported?

There are no particular limitations. You can use any image type that already works with the standard Image block (GIFs included). Please note that if you have a custom file system provider that limits the image types that can be loaded in the builder, it will reflect also on the AMP carousel.

Can I edit an image used as a carousel slide?

No, it’s not possible to use the image editor. You might work around this limitation by editing the image in a standard Image block and then adding it to the carousel.

Are there any suggestions for image sizes?

The best way to build a carousel is to use images with the same size, or that respect the same image ratio. Plus, the first slide should be wide at least as the carousel block, to avoid image stretching.

Why am I getting an INVALID_AMP email in the inbox when I send a test email with AMP content?

AMP is a versatile but pretty strict framework, and it will not render messages that don’t respect its validation protocol. The most common validation error is related to invalid HREF value in links (e.g., no URL, invalid or missing protocol, or incorrect URL composition).

To validate an AMP message before sending it out, all post-processing steps must beperformed (e.g., substitution of text variables that may impact link validation). Since Beefree builders use a replacement syntax and do not handle substitutions, we can’t currently provide a built-in validation without triggering false positives. However, nothing prevents you from adding a validation service in your application before sending out AMP emails.

Is there a weight limit for the AMP part of an email?

The limit for the AMP version of an email, before being trimmed by Gmail clients, is 200Kb, up from 100Kb for HTML emails.

Disable the AMP Carousel for specific customers

Once you turn on the feature in the Beefree SDK Console, you may want to disable AMP Carousel for some customers. You can do so via the client-side configuration document that you feed to your Beefree application when initializing the editor.

Why? Because you may decide to make the feature available to your customers:

  • depending on the subscription plan that they are on (i.e. you could push users to a higher plan based on the ability to use AMP);

  • depending on the purchase of an optional feature (same);

  • only if they are “beta” customers, so they see it while keeping it hidden from the rest of your users.

Here’s how to do so:

  • Enable AMP Carousel in the Beefree SDK Console, as mentioned above.

  • Configure the ‘default’ workspace in the beeConfig document, so that AMP cannot be used (more details here). As an alternative, if you don’t configure a workspace, the Beefree application will be loaded with the default workspace.

What you need to do to send AMP emails

  • Your app must save the additional AMPHTML version of the email, when returned by the Beefree system, the same way it already saves the HTML version.

  • Your sending infrastructure must handle delivering an additional MIME type for AMP – this typically involves becoming an authorized sender for dynamic emails.

    • In alternative, you can leverage one of the existing ESPs that already support sending AMP emails via SMTP or API, such as Amazon SES, Mailgun, and Sparkpost. See the full list list here.

  • You should advise end-users on creating fallback for AMP content due to limited client support for AMP – optional, but highly recommended.

    • For example, if they create an image carousel with AMP, they should also add some images for the HTML version. They can hide content for the AMP version with the “Hide on AMP” content property.

What your end users need to do to send AMP emails

The email senders – i.e., the end-users of your application – need to:

  • Have domain authentication in place (SPF, DKIM, DMARC) for the domain they use to send emails with your app.

  • Register with Google, Verizon Media (Yahoo) and mail.ru as an authorized sender for dynamic emails, so that AMP emails will be rendered in the inbox of recipients who use these clients.

    • Each email client has a separate registration process.

    • Each email address that will be used to send AMP emails address needs to be authorized individually.

    • These registration processes usually involve

      • Meeting the client’s bulk sender guidelines.

      • Sending a real, production-quality AMP email, from their production servers to a registration address.

  • As a final step, fill out the AMP for Email: Sender Registration form. This is the only form they need to fill out to be allowlisted to send AMP emails for all supporting email clients.

Smart Merge Tags

This feature is available on Beefree SDK and above. If you're on the Essentials plan, for free to try this and other Core-level features.

Overview

Smart merge tags provide a better way for your customers to leverage personalization when creating content with Beefree SDK.

With Smart merge tags, users can:

  • quickly identify merge tags through a specific highlighting

  • see human-friendly names instead of the raw syntax – e.g., Customer Name instead of {%customer.name%}.

  • select, replace, and style merge tags with just one click

  • get sample content for each merge tag, both during editing and preview.

How it works

After enabling Smart merge tags, the builder will:

  • highlight merge tags with a dotted border

  • display the tag name you passed instead of the raw syntax

When users click on a tag, its border will become solid to signify that it has been selected. After selection, users can style, replace, or delete the merge tag with just one click.

Smart merge tags are easier to identify inside the content you’ve created and will save users tons of time. Furthermore, hiding the syntax will make it impossible for a user to break it while interacting with the overall text element.

On top of this, you can pass sample content for each merge tag, so that users can see an example of the data that will take the place of the merge tags when the web content is rendered:

How to enable it

Smart merge tags are disabled by default. If your application doesn’t have Smart merge tags, you need to activate it. It takes just a few clicks:

  • Click Details next to the application you want to configure

    • We recommend you first familiarize yourself with this feature under a DEV or QA application

  • Click view more under Application configuration.

  • Under the Services section, toggle Enable Smart merge tags ON and click the Save button.

Notice that, at this point, you will be prompted to enable the merge tag preview in the toolbar. You can skip this option when your integration is not using the or you’re not passing sample content for your .

Configuring sample content

After enabling Smart merge tags from your developer account, you need to apply a minor change to the merge tags’ .

The optional previewValue parameter is used to pass to the editor a sample content (text string) for every merge tag.

The value of this new parameter will replace the merge tag in the editor preview, meaning that there’s no need to build a custom preview to display the final result of an email or landing page with rich personalization strings.

Displaying sample content during editing

Sample content strings are not limited to the preview, but can be displayed in the editor’s stage as mentioned above.

The way to do this depends on how your integration manages the .

Toolbar enabled

In this case, you can simply enable the option “Show ‘Merge tag preview’ in toolbar” mentioned above.

When this option is active, the toolbar displays a new action to the user:

The option works as a toggle that alternates between displaying the previewValue and the name parameter inside the merge tag UI.

Toolbar disabled

As with all the actions available in the toolbar, to control this option from your own UI:

Use this method to replicate the behavior described for the standard toolbar.

Content Dialog
Passing forms to the builder
Commenting

{
  name: 'first name',
  value: '[first-name]',
  previewValue: 'John',
}
beePluginInstance.toggleMergeTagsPreview()
Core plan
upgrade a development application
Login into the Beefree SDK Console
standard toolbar
merge tags
initial configuration
toolbar options
we provide methods

Brand Style Management

post

Manage and modify the style of email, pages, and popup templates. Make template-wide design changes to existing templates quickly and easily, ensuring that all modules adhere to the broader design system or brand guidelines.

Authorizations
Body
Responses
200

Successful response

application/json
Responseobject
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/template/brand
POST /v1/template/brand HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 6315

{
  "styles": {
    "button": {
      "className": "Primary",
      "styles": {
        "color": "#FBF9FF",
        "fontSize": "16px",
        "fontFamily": "Inter,sans-serif",
        "backgroundColor": "#7747ff",
        "borderBottom": "0px solid transparent",
        "borderLeft": "0px solid transparent",
        "borderRight": "0px solid transparent",
        "borderTop": "0px solid transparent",
        "borderRadius": "5px",
        "lineHeight": "120%",
        "maxWidth": "100%",
        "paddingBottom": "8px",
        "paddingLeft": "20px",
        "paddingRight": "20px",
        "paddingTop": "8px"
      },
      "blockOptions": {
        "paddingBottom": "20px",
        "paddingLeft": "20px",
        "paddingRight": "20px",
        "paddingTop": "20px",
        "align": "left",
        "hideContentOnMobile": true
      }
    }
  },
  "template": {
    "page": {
      "body": {
        "container": {
          "style": {
            "background-color": "#fff"
          }
        },
        "content": {
          "computedStyle": {
            "linkColor": "#8a3b8f",
            "messageBackgroundColor": "transparent",
            "messageWidth": "650px"
          },
          "style": {
            "color": "#000000",
            "font-family": "Lato, Tahoma, Verdana, Segoe, sans-serif"
          }
        },
        "type": "mailup-bee-page-properties",
        "webFonts": [
          {
            "fontFamily": "'Lato', Tahoma, Verdana, Segoe, sans-serif",
            "name": "Lato",
            "url": "https://fonts.googleapis.com/css?family=Lato"
          }
        ]
      },
      "description": "",
      "rows": [
        {
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-repeat": "no-repeat",
              "background-position": "top left"
            }
          },
          "content": {
            "style": {
              "background-color": "transparent",
              "color": "#000000",
              "width": "500px",
              "background-image": "none",
              "background-repeat": "no-repeat",
              "background-position": "top left",
              "border-top": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-radius": "0px"
            },
            "computedStyle": {
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top",
              "hideContentOnMobile": false,
              "hideContentOnDesktop": false
            }
          },
          "columns": [
            {
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "modules": [
                {
                  "type": "mailup-bee-newsletter-modules-heading",
                  "descriptor": {
                    "heading": {
                      "title": "h1",
                      "text": "<span class=\"tinyMce-placeholder\">BUTTON</span>",
                      "style": {
                        "color": "#555555",
                        "font-size": "23px",
                        "font-family": "inherit",
                        "link-color": "#E01253",
                        "line-height": "120%",
                        "text-align": "left",
                        "direction": "ltr",
                        "font-weight": "700",
                        "letter-spacing": "0px"
                      }
                    },
                    "style": {
                      "width": "100%",
                      "text-align": "center",
                      "padding-top": "0px",
                      "padding-right": "0px",
                      "padding-bottom": "0px",
                      "padding-left": "0px"
                    },
                    "mobileStyle": {},
                    "computedStyle": {
                      "width": 52,
                      "height": 42
                    }
                  },
                  "uuid": "00a47280-8fa6-4519-b6c8-dcd5f28f35a2"
                }
              ],
              "grid-columns": 12,
              "uuid": "9b3de3ea-4f56-4e21-b7cc-848aea563dc0"
            }
          ],
          "type": "one-column-empty",
          "uuid": "dce46360-6ac7-4bee-bc24-f5688917b7b4"
        },
        {
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-repeat": "no-repeat",
              "background-position": "top left"
            }
          },
          "content": {
            "style": {
              "background-color": "transparent",
              "color": "#000000",
              "width": "500px",
              "background-image": "none",
              "background-repeat": "no-repeat",
              "background-position": "top left",
              "border-top": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-radius": "0px"
            },
            "computedStyle": {
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top",
              "hideContentOnMobile": false,
              "hideContentOnDesktop": false
            }
          },
          "columns": [
            {
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "modules": [
                {
                  "type": "mailup-bee-newsletter-modules-button",
                  "descriptor": {
                    "button": {
                      "label": "<div class=\"txtTinyMce-wrapper\" style=\"font-family: inherit;\" data-mce-style=\"font-family: inherit;\"><p dir=\"ltr\" style=\"word-break: break-word;\" data-mce-style=\"word-break: break-word;\">Call to action button</p></div>",
                      "href": "",
                      "target": "_blank",
                      "style": {
                        "font-family": "'Courier New', Courier, 'Lucida Sans Typewriter', 'Lucida Typewriter', monospace",
                        "font-size": "14px",
                        "font-weight": "400",
                        "background-color": "#3AAEE0",
                        "border-radius": "4px",
                        "border-top": "0px solid transparent",
                        "border-right": "0px solid transparent",
                        "border-bottom": "0px solid transparent",
                        "border-left": "0px solid transparent",
                        "color": "#ffffff",
                        "line-height": "200%",
                        "padding-top": "5px",
                        "padding-right": "20px",
                        "padding-bottom": "5px",
                        "padding-left": "20px",
                        "width": "auto",
                        "max-width": "100%",
                        "direction": "ltr"
                      }
                    },
                    "style": {
                      "text-align": "left",
                      "padding-top": "10px",
                      "padding-right": "10px",
                      "padding-bottom": "10px",
                      "padding-left": "10px"
                    },
                    "mobileStyle": {},
                    "computedStyle": {
                      "width": 216,
                      "height": 38,
                      "hideContentOnMobile": false
                    }
                  },
                  "customFields": {
                    "className": "Primary"
                  },
                  "uuid": "be31ba9a-b0b0-4ae7-b3ea-562ff74bb775"
                },
                {
                  "type": "mailup-bee-newsletter-modules-button",
                  "descriptor": {
                    "button": {
                      "label": "<div class=\"txtTinyMce-wrapper\" style=\"font-family: inherit;\" data-mce-style=\"font-family: inherit;\"><p dir=\"ltr\" style=\"word-break: break-word;\" data-mce-style=\"word-break: break-word;\">100% width button example</p></div>",
                      "href": "",
                      "target": "_blank",
                      "style": {
                        "font-family": "inherit",
                        "font-size": "14px",
                        "font-weight": "400",
                        "background-color": "#3AAEE0",
                        "border-radius": "4px",
                        "border-top": "0px solid transparent",
                        "border-right": "0px solid transparent",
                        "border-bottom": "0px solid transparent",
                        "border-left": "0px solid transparent",
                        "color": "#ffffff",
                        "line-height": "200%",
                        "padding-top": "5px",
                        "padding-right": "20px",
                        "padding-bottom": "5px",
                        "padding-left": "20px",
                        "width": "100%",
                        "max-width": "100%",
                        "direction": "ltr"
                      }
                    },
                    "style": {
                      "text-align": "center",
                      "padding-top": "10px",
                      "padding-right": "10px",
                      "padding-bottom": "10px",
                      "padding-left": "10px"
                    },
                    "mobileStyle": {},
                    "computedStyle": {
                      "width": 630,
                      "height": 38,
                      "hideContentOnMobile": false
                    },
                    "customAttributes": [
                      {
                        "key": "class",
                        "name": "class",
                        "value": "Primary",
                        "target": "tag"
                      }
                    ]
                  },
                  "customFields": {
                    "className": "Primary"
                  },
                  "uuid": "220b02a8-1cb9-429a-88c6-c2b7028a9f31"
                }
              ],
              "grid-columns": 12,
              "uuid": "3967ef9b-ed2b-4e9e-8fe4-2367736e32cc"
            }
          ],
          "type": "one-column-empty",
          "uuid": "ce0b0367-bb90-4eaa-92e2-095d5a9170dc"
        }
      ],
      "template": {
        "name": "template-base",
        "type": "basic",
        "version": "2.0.0"
      },
      "title": ""
    },
    "comments": {}
  }
}
{
  "message": "Success"
}
How do I enable the Azure AI Vision - Image Analysis AddOn?
Privacy Policy

Custom Languages

You can choose one of 20+ languages for the visual builder's UI when initializing the builder. If you want to use custom language strings, however, you will need to use a Custom Language. This feature is available on Beefree SDK Core plan and above. If you're on the Essentials plan, upgrade a development application for free to try this and other Core-level features.

What are Custom Languages?

In Beefree SDK, Custom Languages allow you to accomplish two things:

  • Translate the default text in the builder to your preferred language.

  • Override the default text in the builder to your preferred text, even if you keep the same language.

Translating the default text in the builder is useful when you have diverse end users and you'd like to provide them with a builder experience that resonates with them.

Overriding the default text in the builder with your preferred text is useful when you want to customize the builder experience and apply your application's unique tone.

This page discusses how you can accomplish both use cases with Custom Languages. Keep in mind that you can utilize Custom Languages for overriding default text in the builder, even if you are not translating any of it to another language.

Before getting started, ensure you access and familiarize yourself with the beefree-sdk-assets-languages GitHub repository. This repository includes important JSON files for you to utilize to accomplish the steps outlined on this page.

Important: Familiarize yourself with the beefree-sdk-assets-lanaguges GitHub repository prior to continuing into the steps.

How to Use Custom Languages

This section includes two examples on how to use Custom Languages based on the above scenarios.

Example One: Overriding Default Text

In the .en-US JSON file, you'll find the following section at the beginning:

{
    "bee-common-top-bar": {
        "actions": "Actions",
        "help": "Help",
        "preview": "Preview",
        "save": "SAVE",
        "save-as-template": "Save as template",
        "show-structure": "Show structure",
    },

This JSON includes the default text in the builder, which you can see in the image of the Top bar below.

By adding the translations parameter to the beeConfig with the following configuration, the top bar can easily be customized.

const beeConfig = {
  uid: config.uid,
  container: 'bee-plugin-container',
  translations: {
    'bee-common-top-bar': {
      'actions': 'Design Management',
      'send-test': 'Test your design',
      'help': 'Need support? Contact us.',
      'preview': 'View your masterpiece',
      'save': 'Save changes',
      'save-as-template': 'Download your design',
      'show-structure': 'Show outline',
    },
  },

The following image shows how this configuration appears in the builder.

Example Two: Translating Default Text

Translating the content to another language follows the same approach. The following configuration overrides the default text with the Spanish translation.

const beeConfig = {
  uid: config.uid,
  container: 'bee-plugin-container',
  translations: {
    'bee-common-top-bar': {
      'actions': 'Acciones',
      'send-test': 'Enviar prueba',
      'help': 'Ayuda',
      'preview': 'Vista Previa',
      'save': 'GUARDAR',
      'save-as-template': 'Guardar como plantilla',
      'show-structure': 'Mostrar estructura',
    },

The following image shows the result of the configuration with the Spanish configuration.

Using a Translation URL

You can override the default Beefree SDK language file by providing a URL to your own translations. This is an advanced feature and will replace all languages used by the editor with the languages defined in the custom file.


var beeConfig = {
      uid: config.uid,
      ...
      translationsUrl: 'https://www.yourdomain.com/xx-XX.json',
      ...
}

Using a JSON Object

The easiest method to override specific text labels is to pass a JSON object in your beeConfig, which contains the segments of the language file you want to override.

var beeConfig = {
    uid: config.uid,
    // additional configuration properties...
    language: 'en-US',
    translations: {
        'bee-common-widget-bar': {
            content: 'MODULES',
        },
        // additional translations...
    },
    // other properties...
};

Additional Examples

Overriding the Help icon label in the default toolbar


var beeConfig = {
      uid: config.uid,
      ...
      translations: {
         "bee-common-top-bar": {
           help: "Support"
         },
      }
      ...
}

Overriding the Rows tab label in the sidebar


var beeConfig = {
      uid: config.uid,
      ...
      translations: {
          "bee-common-widget-bar": {
            "structure": "Catalog"
          }
        },
      }
      ...
}

Overriding the Preheader

{
    "translations": {
        "bee-head-meta-preheader": {
            "name": "New Preheader",
            "placeholder": "New Enter Preheader"
        }
    }
}

Defining or adding a translation for "email"

The following code defines a translation object where the title for "bee-settings-details" is set to "New Email Details" specifically for the "email" field.

translations: {
    "bee-settings-details": {
        "title": {
            "email": "New Email Details"
        }
    }
}

Overriding AI Writing Assistant Default Text

You can override the default text for the AI Writing Assistant. The following configuration sample includes the AI component and the various default text fields you can override.

const beeConfig = {
  uid: config.uid,
  container: 'bee-plugin-container',
  translations: {
    'bee-common-top-bar': {
      'actions': 'Design Management',
      'send-test': 'Test your design',
      'help': 'Need support? Contact us.',
      'preview': 'View your masterpiece',
      'save': 'Save changes',
      'save-as-template': 'Download your design',
      'show-structure': 'Show outline',
    },
    'mailup-bee-common-component-ai': {
      'welcome-body-title': 'Welcome to Your Design Journey',
      'welcome-body-subtitle': 'Start creating stunning emails with ease.',
      'welcome-example': 'Example: Explore our templates to get inspired.',
      'welcome-heading-title': 'Craft Your Message',
      'welcome-heading-subtitle': 'Make every word count with our tools.',
      'welcome-heading-example': 'Example: Write a compelling subject line.',
      'welcome-list-title': 'Key Features to Explore',
      'welcome-list-subtitle': 'Discover what makes our editor unique.',
      'welcome-list-example': 'Example: Drag-and-drop functionality.',
      'welcome-button-title': 'Get Started Now',
      'welcome-button-subtitle': 'Click to begin your design adventure.',
      'welcome-button-example': 'Example: Create your first email.',
    },
  },
};

Paragraph Block

The following image shows the results for the overwritten default text for AI Paragraph Assistant based on the above configuration.

Title Block

The following image shows the results for the overwritten default text for AI Title Assistant based on the above configuration.

List Block

The following image shows the results for the overwritten default text for AI List Assistant based on the above configuration.

Button Block

The following image shows the results for the overwritten default text for AI Button Assistant based on the above configuration.

Reference the Customize Prompt Suggestions section of the AI Writing Assistant page for additional customization options and details.

Confirmation Dialogs

The following section lists translations that correspond with Confirmation Dialogs for Rows, Columns, Modules, and the File Manager.

Delete Row

This list details the translations corresponding with the Delete Row Confirmation Dialog.

Translations Variations

  • Title: 🆕 Delete row

    • confirmation-dialogs.delete-row-confirmation-title

  • Secondary Button: 🆕 Keep

    • confirmation-dialogs.keep-button

  • Primary Button: 🆕 Delete

    • confirmation-dialogs.delete-button

Reference the corresponding classnames for Delete Row.

Delete Column

This list details the translations corresponding with the Delete Column Confirmation Dialog.

Translations Variations

  • Title: 🆕 Delete column

    • confirmation-dialogs.delete-column-confirmation-title

  • Secondary Button: 🆕 Keep

    • confirmation-dialogs.keep-button

  • Primary Button: 🆕 Delete

    • confirmation-dialogs.delete-button

Reference the corresponding classnames for Delete Column.

Delete Module

This list details the translations corresponding with the Delete Module Confirmation Dialog.

Translations Variations

  • Title: 🆕 Delete module

    • confirmation-dialogs.delete-module-confirmation-title

  • Secondary Button: 🆕 Keep

    • confirmation-dialogs.keep-button

  • Primary Button: 🆕 Delete

    • confirmation-dialogs.delete-button

Reference the corresponding classnames for Delete Module.

Hide Row on Mobile with Module Already Hidden on Desktop

This list details the translations corresponding with the Hide Row on Mobile Confirmation Dialog.

Translations Variations

  • Title: 🆕 Hide row

    • confirmation-dialogs.hide-row-confirmation-title

  • Heading: 🆕 Are you sure you want to hide this?

    • confirmation-dialogs.hide-row-confirmation-heading

Reference the corresponding classnames for Hide Row on Mobile with Module Already Hidden on Desktop.

Remove Custom Display Condition

This list details the translations corresponding with the Remove Custom Display Condition Confirmation Dialog.

Translations Variations

  • Title: 🆕 Delete display condition

    • confirmation-dialogs.delete-display-condition-confirmation-title

Reference the corresponding classnames for Remove Custom Display Condition.

Confirm Delete Single File

This list details the translations corresponding with the Confirm Delete Single File Confirmation Dialog.

Translations Variations

  • Title: 🆕 Delete {filename}

    • confirmation-dialogs.delete-file-confirmation-title

  • Secondary Button: 🆕 Keep

    • confirmation-dialogs.keep-button

  • Primary Button: 🆕 Delete

    • confirmation-dialogs.delete-button

Reference the corresponding classnames for Confirm Delete Single File.

Confirm Delete Multiple Files

This list details the translations corresponding with the Confirm Delete Multiple Files Confirmation Dialog.

Translations Variations

  • Title: 🆕 Delete {count} files

    • confirmation-dialogs.delete-files-confirmation-title

  • Secondary Button: 🆕 Keep

    • confirmation-dialogs.keep-button

  • Primary Button: 🆕 Delete

    • confirmation-dialogs.delete-button

Reference the corresponding classnames for Confirm Delete Multiple Files.

Confirm Update Existing File | Custom FSP

Note: This section is relevant if both the Custom FSP and ConfirmOverwriteModalEnabled are activate.

This list details the translations corresponding with the Confirm Update Existing File Confirmation Dialog.

Text Updates:

  • Title: 🆕 Replace {filename}

    • confirmation-dialogs.replace-file-confirmation-title

  • Secondary Button: 🆕 Keep

    • confirmation-dialogs.keep-button

Reference the corresponding classnames for Confirm Update Existing File.

Confirm Update Existing File

This list details the translations corresponding with the Update Existing File Confirmation Dialog.

Translations Variations

  • Title: 🆕 File {filename} already exists

    • confirmation-dialogs.file-already-exists-title

  • Heading: 🆕 Do you want to replace or keep both files?

    • confirmation-dialogs.replace-file-confirmation-heading

Reference the corresponding classnames: Not applicable.

File Manager - Move File Replace Confirmation

This list details the translations corresponding with the Move File Replace Confirmation Dialog.

Translations Variations

  • Title: 🆕 File {filename} already exists

    • confirmation-dialogs.file-already-exists-title

  • Heading: 🆕 Do you want to replace or keep both files?

    • confirmation-dialogs.replace-file-confirmation-heading

Reference the corresponding classnames: Not applicable.

Sample language file

Check out our Github repository for starter language templates in all supported languages.

Custom Attributes

This feature is available on Beefree SDK Core plan and above. If you're on the Essentials plan, upgrade a development application for free to try this and other Core-level features.

Overview

With Custom Attributes, your end users can easily append additional information to HTML tags in emails and web pages, at the same moment they are creating their content in Beefree SDK. These attributes can be applied to links, both in text blocks and buttons, and images, and they serve a variety of scenarios: personalization, segmentation, styling, accessibility, etc.

Use cases

Custom attributes enable a wide array of use cases, depending on your application’s capabilities and your users’ needs. Here are a few examples:

  • flagging specific links so that user activity for those won’t be tracked (e.g. clicktracking="off” in SendGrid);

  • handling internal statistical segmentation or reporting (e.g. data-reportingname="October_promo" data-reportingtags="promo,iphone");

  • adding conditions to a single content element (using an attribute such as condition="customer_exists");

  • embedding a single image by adding an attribute like embedded="true", processed when the message is sent;

  • adding custom CSS classes for custom CSS;

  • adding WAI-ARIA attributes for accessibility requirements.

How it works

The host application can provide the editor with a list of attributes that will be available to the user through the UI. How the attribute value is formatted impacts how the builder UI displays it and how the user interacts with it.

Custom attributes can be applied to:

  • Links in text blocks

  • Links in buttons

  • Images (including thumbnails generated by the Video block)

For images and buttons, these attributes will be visible in the editor sidebar, under the new “ATTRIBUTES” section.

For links in text blocks, they will be part of the dialog window for creating a link.

You can provide the editor with a list of attributes that will be available to the user through the UI. How the attribute value is formatted impacts how the builder UI displays it and how the user interacts with it.

Depending on how custom attributes are implemented, users may:

  • add a custom attribute from a list of attributes already defined, and specify the value of the attribute, if appliable:

    • from a predefined list

    • in a text input

    • defining a boolean property (yes/no, true/false, etc.)

  • add a “custom” custom attribute by manually specifying both name and value

  • open an additional interface, through a content dialog, where users have complete freedom on how to build custom attributes.

Regardless of how a custom attribute is added, it will be included in the a or img tag when HTML is generated for an email/page, like the segment attribute in this hyperlink:


<a href=”https://beefree.io/” segment=”emaildesign”>Visit BEE!</a>

How to activate it

Custom attributes are a client-side configuration that needs to be passed when initializing the editor. There are different shades of implementation complexity, based on the outcome you want to obtain. These approaches can be combined as preferred.

Basic

The easiest implementation is to just pass a simple configuration at startup:


customAttributes: {
  enableOpenFields: true
}

With this setup, users can indicate a “Custom” custom attribute by manually specifying Name and Value. Please note that users must know exactly what they are doing, as there will be no guidance in the editor.

Standard

You can pass the necessary custom attributes in the initial configuration. Those attributes will be available in the interface, and the user will be able to specify the value for these attributes, if possible.


customAttributes:{
  attributes: [
    { 
      key: "Deeplink",
      value: true,
      target: "link"
    },
    { 
      key: "data-segment",
      value: ['travel', 'luxury'],
      target: "link"
    },
    { 
      key: "class",
      target: "tag"
    }
  ]
}

Let’s look through the attributes defined in the example above, and how they will look like in the builder.

The Deeplink attribute has a single, predefined value, so when added in the builder it will look like this:

The Segment attribute has two possible values, which can be selected by the user:

The Class attribute has no defined value, so the user can enter anything in a text input:

Advanced

You can totally customize the UX of adding attributes by invoking a Content Dialog that will take over the editor’s UI. The dialog will need to return the attribute that needs to be applied.

Collaborative Editing

This feature is available on the Beefree SDK and above. Additional limitations apply (). If you're on the Essentials or Core plan, for free to try this and other Superpowers-level features.

Overview

With Co-editing, multiple users can work on the same asset (email, page or popup) simultaneously. Co-editors can see what each other is doing, as their changes are synced to the stage in real-time.

Each user is represented by a round icon with the initial of the user, and hovering the mouse on the icon will show the full name for that user.

When a user selects a row or a content block, other co-editors will see it highlighted with that user’s color. To avoid conflicting edits, only one user at a time can edit a row or block. A feedback message will guide users when this situation happens.

Use Cases

In many companies, it’s rare that someone works alone on everything related to an email and or a landing page. Your customers may have multiple people sharing duties – copywriting, designing, testing, reviewing, etc. That is why SaaS applications typically offer additional users or seats, so that more people can log into an account at the same time and collaborate.

When multiple people collaborate on creating content, co-editing is the logical solution for an authentic teamwork experience, Google-doc style.

If you add to the mix, Beefree SDK becomes an all-around, real-time, collaborative content creation platform to design and review emails, landing pages, and popups, unifying your customers’ workflow under one roof.

Availability

Co-editing is available for Beefree SDK and plans:

  • Superpowers plans are limited to a maximum of 5 co-editors per session.

  • Enterprise plans are limited to a maximum of 20 co-editors per session.

This means that on the Superpowers plan, no more than five users can edit the same email or web page simultaneously. Your application will only receive an error code from the Beefree SDK platform when the limit is reached and the editor will not load – you’ll need to add a user notification to let them know they cannot join the editing session (e.g. “Sorry, you cannot edit this message because you’ve reached the limit of five co-editors, try again later”).

Even better, you can monitor sessions and disable editing for an email or landing page once the limit is reached.

How it Works

Creating a co-edit session is nearly identical to starting a traditional, single-user session of your Beefree SDK application. You simply need to pass a shared flag, indicating the template is sharable, along with some simple user settings.

User Settings

The following parameters are all required.

Description
Type
Value

Example beeConfig

Options

The following shared parameter is required to start a co-editing session.

Description
Type
Value

You pass this argument in the start instance method’s options parameter.

Example Instance Method When Not Using Co-editing:

Example Instance Method With Co-editing Enabled:

Session Started Callback

Once the session is started, a globally unique id will be created and returned to the host application via the onSessionStarted callback. The host application will save this session id, and use it when users want to join the same session.

Description
Type
Value

Example Callback Handler

Join a Session

The host application can add a user to any active co-edit session by using the new join instance method. The join method replaces the bee.start method and accepts the session id as a parameter, and loads the current template directly from the active session.

Monitor a Session

Once the session is started, all changes to the session are reported to the onSessionChange callback. The host application can monitor this callback to understand the session’s status.

Example Return JSON

Example onSessionChange Handler:

Use Cases to Monitor a Session

  • Only display a “join” button when a session is active

  • Display an “edit” session only if there is at least one free co-editing spot

  • Know when someone logs on or logs off, and notify other users in the host application

  • Know when the session contains only a single user, so the user knows it’s safe to send a campaign

Usage Limitations

There are some limitations set for the Co-editing feature to preserve the integrity of the experience. These are:

  • Undo/redo: If only a single user is present in the co-editing session at any given time, undo/redo will function the same as in a normal session. When a second user is present, undo/redo will be limited to only allow changes while the content or row is locked, and users cannot undo the changes of other users or those that have been synchronized across all sessions.

  • Load/reload: The host application cannot trigger any action that overwrites the user’s changes.

  • Autosave: The autosave timer is set on the instance that started the session; it’s not recommended for co-editing sessions.

  • onChange: The onChange callback occurs only for the user that makes the change. For example, if user A makes a change, the onChange event fires only for their instance, and user B won’t receive the notification.

Versioning

During the co-edit session, the host application may receive callbacks for saving JSON and HTML. However, with multiple users editing the content, potentially all over the world, the host application needs to confirm which changes are new vs. old. For this reason, a new version parameter has been added to all of the callbacks that return JSON or HTML.

The version is a simple integration counter: 1, 2, 3, …

onChange Callback Handler:

onSave Callback Handler:

onSaveAsTemplate Callback Handler

onSend Callback Handler

Track Message Changes

You can for the main user and additional users in a collaborative editing session.

The onChange callback allows you to track the activities and changes to the design JSON performed by session's main user (User A). Reference the onChange to learn more about implementing and using this callback.

The onRemoteChange callback allows you to track the activities and changes to the design's JSON performed by additional users (User B, User C, and so on). Reference the onRemoteChange to learn more about implementing and using this callback.

Custom Languages

You may override any of the default language strings using . The code block below contains the JSON required to replace all co-editing strings.

Session Lifecycle and Error Codes

Heartbeat

Both the server and client regularly check the connection using the “ping-pong” heartbeat.

If the client misses 5 consecutive pings (ping is emitted every 10s), the server considers the connection to be lost and disconnects the client.

If the server misses 5 consecutive pings (also every 10s), the client considers the connection to be lost and will attempt to reconnect (see below).

Reconnect Mechanism

If the server disconnects without reason (the disconnection is not clean), or it misses 5 consecutive pings, the client will attempt to reconnect to the session. It will keep trying for the 60s before emitting an error with code 5400.

Reconnect mechanism is also employed after certain recoverable errors, specifically 5001, 5100 and 5300. The error itself is only emitted if the reconnect fails.

The server will wait for 60s after the last user of the session disconnects (or the connection is lost) before erasing the session data.

Error State

During reconnecting, the builder is covered with an overlay to prevent the user from doing any changes (since they cannot be synchronized). This overlay also appears if the server has missed a ping.

In case of error, another overlay modal is displayed to prevent the user from interacting with the builders in an error state. The host application should handle the errors and restart the Beefree SDK.

Error Codes

You can monitor the onError callback to know when a problem occurs, and then alert users of the problem. For example, if a user loses internet connection, you can display an alert in the host application to let them know their changes have not been saved.

Here is the full list of error codes that can be returned for Co-editing.

Code
Message
Details
Is recoverable?

username

string

The user’s display name

userColor

string

Hex color code (e.g. #FFFFFF)


var config = {
  uid: '1234', 
  ...
  username: 'Jane Doe', 
  userColor: 'black',
  ...
}

shared

boolean

true or false


bee.start(template)

bee.start(template, { shared: true })

sessionId

string

globally unique id saved from onSessionStarted callback


onSessionStarted: function(sessionInfo) {
  console.log('*** [integration] --> (onSessionStarted) ', sessionInfo)
  prompt('press ctrl+c to copy the session ID', sessionInfo.sessionId)
}

bee.join(sessionId)

{
  change: { 
    type: "USER_JOINED", 
    value: {
      username: "John Doe", 
      userColor: "#c0ffee" 
      userId: "johndoe"
    }
  },
  sessionData: {
    users: {
      668bf8aa-97b9-4f5d-80a2-dc3e0986a370: { 
        userId: "johndoe", 
        username: "John Doe", 
        userColor: "#c0ffee" 
      },
      ...
    }
  }
}

onSessionChange: function(data) {
  console.log('*** [integration] --> (onSessionChange) ', data)
}
onChange: function(jsonFile, response, version) {
   console.log(`*** [integration] (onChange) version ${version}, ${new Date().toISOString()}`);
},

onSave: function(jsonFile, htmlFile, version) {
   console.log(`*** [integration] (onSave) version ${version}, ${new Date().toISOString()}`);
},

onSaveAsTemplate: function(jsonFile, version) {
   console.log(`*** [integration] (onSaveAsTemplate) version ${version}, ${new Date().toISOString()}`);
},


onSend: function(htmlFile, version) {
   console.log(`*** [integration] (onSend) version ${version}, ${new Date().toISOString()}`);
},


translations: {
  "mailup-bee-newsletter-collaboration": {
    "locked-module-warning-message": "This module is being edited by another user and therefore its content cannot be edited.",
    "locked-module-warning-title": "This module is locked",
    "locked-row-warning-message": "This row is being edited by another user and therefore its content cannot be edited.",
    "locked-row-warning-title": "This row is locked",
    "row-delete-confirm-title": "Are you sure you want to delete this row?",
    "row-delete-confirm-message": "Another user is currently editing a module inside this row. By deleting it, you might cause their work to be lost.",
    "lock-rejected-title": "Element was locked by another user.",
    "lock-rejected-message": "The element is currently being edited by another user. Please wait until they are finished with their changes."
  }
},

5001

Unexpected error occurred during co-editing.

General error.

Yes

5100

Failed to open co-editing session.

Unexpected error when creating/joining a co-editing session.

Yes

5150

Session does not exist.

The client attempted to join a non-existing (or expired) session.

No

5200

Failed to synchronize changes.

Emitted if an unexpected error occurs on the server during the real-time synchronization of changes.

No

5300

Connection to the synchronization server was lost.

The server closed the connection. Reason is given in the detail field.

Yes

5400

Connection to the synchronization server was lost.

Caused by network connection error or the server unexpectedly dying.

No

5500

Co-editing is not supported for your current plan.

If the client attempts to initiate or join a co-editing session with a lower plan.

No

5600

Co-editing server is not available.

Please try again later.

No

Superpowers plan
learn more
upgrade a development application
Commenting
Superpowers
Enterprise
track message changes
section of the Track Message Changes page
section of the Track Message Changes page
custom translations

Transform Beefree JSON into HTML

post

Use this endpoint to transform any template's Beefree JSON into HTML. This endpoint is compatible with Email, Page, and Popup builder designs.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
commentsobjectOptional

An object field for comments

beautifyHtmlEnabledintegerOptional

An integer field for beautifyHtmlEnabled

Responses
200

Successful response

text/html
Responsestring
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/html
POST /v1/{collection}/html HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 35263

{
  "page": {
    "body": {
      "container": {
        "style": {
          "background-color": "#FFFFFF"
        }
      },
      "content": {
        "computedStyle": {
          "linkColor": "#FF819C",
          "messageBackgroundColor": "transparent",
          "messageWidth": "675px"
        },
        "style": {
          "color": "#000000",
          "font-family": "Arial, Helvetica Neue, Helvetica, sans-serif"
        }
      },
      "type": "mailup-bee-page-properties",
      "webFonts": [
        {
          "fontFamily": "'Montserrat', 'Trebuchet MS', 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, sans-serif",
          "name": "Montserrat",
          "url": "https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap"
        }
      ]
    },
    "description": "BF-ecommerce-template",
    "rows": [
      {
        "columns": [
          {
            "grid-columns": 6,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "class": "left fixedwidth",
                    "width": "287px"
                  },
                  "image": {
                    "alt": "Image",
                    "height": "142px",
                    "href": "https://beefree.io",
                    "prefix": "",
                    "src": "https://d1oco4z2z1fhwp.cloudfront.net/templates/default/113/logo_1.png",
                    "target": "_self",
                    "width": "546px"
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "15px",
                    "padding-right": "15px",
                    "padding-top": "5px",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-image",
                "uuid": "ca41c638-c8fa-4b88-b4de-db0584002b4d"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "align": "center",
                    "hideContentOnMobile": true
                  },
                  "divider": {
                    "style": {
                      "border-top": "0px solid transparent",
                      "height": "20px",
                      "width": "100%"
                    }
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-divider",
                "uuid": "b3ad4612-0b4c-48e4-b4c9-b63eb9f4014b"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "0px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "30px"
            },
            "uuid": "63f745dd-ab3f-49b3-b173-a0ba7fa77732"
          },
          {
            "grid-columns": 6,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnMobile": false
                  },
                  "spacer": {
                    "style": {
                      "height": "25px"
                    }
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-spacer",
                "uuid": "49740804-c7a9-4cec-b307-9ad3d05eec58"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnAmp": false,
                    "hideContentOnDesktop": false,
                    "hideContentOnHtml": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068a5",
                      "paragraphSpacing": "16px"
                    },
                    "html": "<p>ANY DEVICE, ANYWHERE, FAST.</p>",
                    "style": {
                      "color": "#ffffff",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "18px",
                      "font-weight": "400",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "text-align": "right"
                    }
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "8e540cc4-4a11-4469-acf2-34cd3e6b5d56"
              },
              {
                "type": "mailup-bee-newsletter-modules-heading",
                "descriptor": {
                  "heading": {
                    "title": "h1",
                    "text": "<span class=\"tinyMce-placeholder\">This is English​</span>",
                    "style": {
                      "color": "#555555",
                      "font-size": "23px",
                      "font-family": "inherit",
                      "link-color": "#E01253",
                      "line-height": "120%",
                      "text-align": "center",
                      "direction": "ltr",
                      "font-weight": "700",
                      "letter-spacing": "0px"
                    },
                    "translations": {
                      "fr-FR": {
                        "text": "<span class=\"tinyMce-placeholder\">This is french</span>"
                      },
                      "it-IT": {
                        "text": "<span class=\"tinyMce-placeholder\">This is Italian</span>"
                      }
                    }
                  },
                  "style": {
                    "width": "100%",
                    "text-align": "center",
                    "padding-top": "0px",
                    "padding-right": "0px",
                    "padding-bottom": "0px",
                    "padding-left": "0px"
                  },
                  "mobileStyle": {},
                  "computedStyle": {
                    "width": 52,
                    "height": 42
                  }
                },
                "uuid": "122f4b0f-9e7e-475c-ad0a-b56ea67c3537",
                "locked": false
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "20px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "30px"
            },
            "uuid": "9f69fc4a-f3cc-46aa-be89-625913f374a6"
          }
        ],
        "container": {
          "style": {
            "background-color": "#3f005a",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#333",
            "width": "675px"
          }
        },
        "empty": false,
        "locked": false,
        "synced": false,
        "type": "two-columns-empty",
        "uuid": "9624ba86-b3d4-47ad-962d-f6701f1c61af"
      },
      {
        "columns": [
          {
            "grid-columns": 12,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnMobile": false
                  },
                  "spacer": {
                    "style": {
                      "height": "60px"
                    }
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-spacer",
                "uuid": "cd500e1b-70e3-48f4-9c3b-dfee60b3b6df"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnAmp": false,
                    "hideContentOnDesktop": false,
                    "hideContentOnHtml": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068a5",
                      "paragraphSpacing": "12px"
                    },
                    "html": "<p>INTRODUCING</p>",
                    "style": {
                      "color": "#ffffff",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "28px",
                      "font-weight": "400",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "5px",
                    "padding-left": "5px",
                    "padding-right": "5px",
                    "padding-top": "5px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "ad5fc7a7-b4c5-4db3-bbf9-905d0040649d"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "height": 42,
                    "width": 52
                  },
                  "heading": {
                    "style": {
                      "color": "#ffffff",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "75px",
                      "font-weight": "400",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#E01253",
                      "text-align": "center"
                    },
                    "text": "HACKISTER<strong>4</strong>",
                    "title": "h1"
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-heading",
                "uuid": "25d452fb-d07d-49e0-bf2b-b26969b89ff0"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "class": "center fixedwidth",
                    "width": "371.25000000000006px"
                  },
                  "image": {
                    "alt": "rocket",
                    "height": "256px",
                    "href": "https://beefree.io",
                    "prefix": "",
                    "src": "https://pre-assets.imgdist.com/public/users/Integrators/BeeAppPre/roberto/rocket_1f680.png",
                    "target": "_self",
                    "width": "256px"
                  },
                  "style": {
                    "padding-bottom": "20px",
                    "padding-left": "20px",
                    "padding-right": "20px",
                    "padding-top": "20px",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-image",
                "uuid": "9a2ae0f8-785c-49fd-a2eb-73e00153e3a9"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnMobile": false
                  },
                  "spacer": {
                    "style": {
                      "height": "30px"
                    }
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-spacer",
                "uuid": "1fe2d079-351a-4920-bf7c-a56ed7660fca"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "50px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "0px"
            },
            "uuid": "ed93c48c-f593-4c8e-9069-0c5135f4be6f"
          }
        ],
        "container": {
          "style": {
            "background-color": "#fa8072",
            "background-image": "url('https://pre-assets.imgdist.com/public/users/Integrators/BeeAppPre/roberto/windows-11-365-purple-abstract-background-4k-wallpaper-uhdpaper.com-551%400%40i.jpg')",
            "background-position": "top center",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#000000",
            "width": "675px"
          }
        },
        "empty": false,
        "locked": false,
        "synced": false,
        "type": "one-column-empty",
        "uuid": "973b04b3-19ab-4519-ad9e-b4c99b74068c"
      },
      {
        "columns": [
          {
            "grid-columns": 12,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "height": 42,
                    "width": 52
                  },
                  "heading": {
                    "style": {
                      "color": "#680080",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "34px",
                      "font-weight": "400",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#E01253",
                      "text-align": "center"
                    },
                    "text": "<span class=\"tinyMce-placeholder\">The <strong>fake</strong> <strong>app</strong> for <br /><strong>real-time</strong> collaboration</span>",
                    "title": "h1"
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-heading",
                "uuid": "5f570375-ba13-4cb2-b136-4a1ab89477fb"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnAmp": false,
                    "hideContentOnDesktop": false,
                    "hideContentOnHtml": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068a5",
                      "paragraphSpacing": "4px"
                    },
                    "html": "<p>Aenean eu leo quam. Pellentesque ornare sem</p>\n<p>lacinia quam venenatis vestibulum.</p>\n<p>Donec sed odio dui.</p>",
                    "style": {
                      "color": "#555555",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "18px",
                      "font-weight": "400",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "ce6062a1-3ba6-437b-b378-cacb1ec2fb0d"
              },
              {
                "descriptor": {
                  "button": {
                    "label": "<div class=\"txtTinyMce-wrapper\" style=\"\" data-mce-style=\"\"><p style=\"word-break:break-word;\" data-mce-style=\"word-break:break-word;\"><span style=\"\" data-mce-style=\"\"><span style=\"\" data-mce-style=\"\">SHOW MORE</span></span></p></div>",
                    "style": {
                      "background-color": "transparent",
                      "border-bottom": "3px solid #800080",
                      "border-left": "3px solid #800080",
                      "border-radius": "30px",
                      "border-right": "3px solid #800080",
                      "border-top": "3px solid #800080",
                      "color": "#680080",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "20px",
                      "font-weight": "700",
                      "line-height": "200%",
                      "max-width": "100%",
                      "padding-bottom": "5px",
                      "padding-left": "20px",
                      "padding-right": "20px",
                      "padding-top": "5px",
                      "width": "35%"
                    },
                    "target": "_self"
                  },
                  "computedStyle": {
                    "height": 56,
                    "width": 229
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "15px",
                    "text-align": "center"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-button",
                "uuid": "a2e52ec4-59dd-44e9-a68b-6273a7d9385d"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnMobile": false
                  },
                  "spacer": {
                    "style": {
                      "height": "10px"
                    }
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-spacer",
                "uuid": "9d131f36-752d-4ebc-8944-51c9873d22b0"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "30px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "30px"
            },
            "uuid": "e065afb1-62dd-45f4-8aca-08a5f719eed1"
          }
        ],
        "container": {
          "style": {
            "background-color": "#eacaf6",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#333",
            "width": "675px"
          }
        },
        "empty": false,
        "locked": false,
        "synced": false,
        "type": "one-column-empty",
        "uuid": "8656050f-2d7d-4a3e-ac37-0f0504985539"
      },
      {
        "columns": [
          {
            "grid-columns": 12,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnMobile": false
                  },
                  "spacer": {
                    "style": {
                      "height": "30px"
                    }
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-spacer",
                "uuid": "f9890128-2034-43ea-97a8-3cc92737873e"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "15px"
            },
            "uuid": "0f59cf03-19e2-44a1-80fb-6a8441cf381c"
          }
        ],
        "container": {
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#000000",
            "width": "675px"
          }
        },
        "empty": false,
        "locked": false,
        "synced": false,
        "type": "one-column-empty",
        "uuid": "fd2b49d3-2668-4d32-a46d-2d5031268ebe"
      },
      {
        "columns": [
          {
            "grid-columns": 6,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "class": "center  autowidth ",
                    "width": "103px"
                  },
                  "image": {
                    "alt": "Image",
                    "height": "120px",
                    "href": "https://beefree.io",
                    "prefix": "",
                    "src": "https://d1oco4z2z1fhwp.cloudfront.net/templates/default/113/icon-globe.png",
                    "target": "_self",
                    "width": "103px"
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-image",
                "uuid": "d7c13f74-1679-460c-86c3-528ec2148f6f"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "height": 42,
                    "width": 52
                  },
                  "heading": {
                    "style": {
                      "color": "#d2687f",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "23px",
                      "font-weight": "700",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#ff819c",
                      "text-align": "center"
                    },
                    "text": "Fusce Nullam",
                    "title": "h1"
                  },
                  "style": {
                    "padding-bottom": "5px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "20px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-heading",
                "uuid": "d1a1bb5b-5668-421d-ba55-0d70be81ce85"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnAmp": false,
                    "hideContentOnDesktop": false,
                    "hideContentOnHtml": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#ff819c",
                      "paragraphSpacing": "16px"
                    },
                    "html": "<p>Nullam quis risus eget urna mollis.<br />Sed turpi est quisquam nobis</p>",
                    "style": {
                      "color": "#9d9da1",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "14px",
                      "font-weight": "400",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "494dcda2-890e-43d2-bf22-e5a7008563d8"
              },
              {
                "descriptor": {
                  "button": {
                    "href": "https://beefree.io",
                    "label": "<div class=\"txtTinyMce-wrapper\" style=\"\" data-mce-style=\"\"><p style=\"word-break:break-word;\" data-mce-style=\"word-break:break-word;\"><span style=\"\" data-mce-style=\"\"><span style=\"\" data-mce-style=\"\">SHOW MORE</span></span></p></div>",
                    "style": {
                      "background-color": "transparent",
                      "border-bottom": "3px solid #D2687F",
                      "border-left": "3px solid #D2687F",
                      "border-radius": "30px",
                      "border-right": "3px solid #D2687F",
                      "border-top": "3px solid #D2687F",
                      "color": "#d2687f",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "16px",
                      "font-weight": "700",
                      "line-height": "200%",
                      "max-width": "100%",
                      "padding-bottom": "0px",
                      "padding-left": "15px",
                      "padding-right": "15px",
                      "padding-top": "0px",
                      "width": "auto"
                    },
                    "target": "_self"
                  },
                  "computedStyle": {
                    "height": 38,
                    "width": 146
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "15px",
                    "text-align": "center"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-button",
                "uuid": "f204ceb2-f285-4a20-944e-205a6ac62f8a"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "e2b2669a-0185-4565-a4a2-1644c9989d74"
          },
          {
            "grid-columns": 6,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "class": "center  autowidth ",
                    "width": "110px"
                  },
                  "image": {
                    "alt": "Image",
                    "height": "110px",
                    "href": "https://beefree.io",
                    "prefix": "",
                    "src": "https://d1oco4z2z1fhwp.cloudfront.net/templates/default/113/icon-chat.png",
                    "target": "_self",
                    "width": "110px"
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-image",
                "uuid": "43f99492-43c1-4451-9376-67d4e78d7e4b"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "height": 42,
                    "width": 52
                  },
                  "heading": {
                    "style": {
                      "color": "#d2687f",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "23px",
                      "font-weight": "700",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#ff819c",
                      "text-align": "center"
                    },
                    "text": "<span class=\"tinyMce-placeholder\">Lorem Ipsum</span>",
                    "title": "h1"
                  },
                  "style": {
                    "padding-bottom": "5px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "20px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-heading",
                "uuid": "ade54875-7cd5-4bcc-8f97-fa496745949b"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnAmp": false,
                    "hideContentOnDesktop": false,
                    "hideContentOnHtml": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#ff819c",
                      "paragraphSpacing": "16px"
                    },
                    "html": "<p>Nullam quis risus eget urna mollis.<br />Sed turpi est quisquam nobis</p>",
                    "style": {
                      "color": "#9d9da1",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "14px",
                      "font-weight": "400",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "2cd0fdf7-00ce-48e0-9cd0-0946e0a7f280"
              },
              {
                "descriptor": {
                  "button": {
                    "href": "https://beefree.io",
                    "label": "<div class=\"txtTinyMce-wrapper\" style=\"\" data-mce-style=\"\"><p style=\"word-break:break-word;\" data-mce-style=\"word-break:break-word;\"><span style=\"\" data-mce-style=\"\"><span style=\"\" data-mce-style=\"\">SHOW MORE</span></span></p></div>",
                    "style": {
                      "background-color": "transparent",
                      "border-bottom": "3px solid #D2687F",
                      "border-left": "3px solid #D2687F",
                      "border-radius": "30px",
                      "border-right": "3px solid #D2687F",
                      "border-top": "3px solid #D2687F",
                      "color": "#d2687f",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "16px",
                      "font-weight": "700",
                      "line-height": "200%",
                      "max-width": "100%",
                      "padding-bottom": "0px",
                      "padding-left": "15px",
                      "padding-right": "15px",
                      "padding-top": "0px",
                      "width": "auto"
                    },
                    "target": "_self"
                  },
                  "computedStyle": {
                    "height": 38,
                    "width": 146
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "15px",
                    "text-align": "center"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-button",
                "uuid": "c27985f5-a92d-4c0c-9f8d-8e3bedf71a8b"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "f3b0abb4-6068-419b-bfed-60727570c366"
          }
        ],
        "container": {
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#333",
            "width": "675px"
          }
        },
        "empty": false,
        "locked": false,
        "synced": false,
        "type": "two-columns-empty",
        "uuid": "3bb64451-93bd-44e8-ab28-62ee2d09013d"
      },
      {
        "columns": [
          {
            "grid-columns": 12,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "align": "center"
                  },
                  "divider": {
                    "style": {
                      "border-top": "1px solid #F0F0F0",
                      "height": "0px",
                      "width": "100%"
                    }
                  },
                  "style": {
                    "padding-bottom": "20px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "20px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-divider",
                "uuid": "d5d46fc7-aeca-49ff-98e8-6453b7b076d6"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "db0f8784-ade7-42e0-bb2f-9273190070ff"
          }
        ],
        "container": {
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#333",
            "width": "675px"
          }
        },
        "empty": false,
        "locked": false,
        "synced": false,
        "type": "one-column-empty",
        "uuid": "e936284c-d052-43da-8a13-806b7b17289b"
      },
      {
        "columns": [
          {
            "grid-columns": 6,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "class": "center  autowidth ",
                    "width": "120px"
                  },
                  "image": {
                    "alt": "Image",
                    "height": "120px",
                    "href": "https://beefree.io",
                    "prefix": "",
                    "src": "https://d1oco4z2z1fhwp.cloudfront.net/templates/default/113/icon-heart.png",
                    "target": "_self",
                    "width": "120px"
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-image",
                "uuid": "2f90053a-b4fd-4215-9684-0acded4a61f8"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "height": 42,
                    "width": 52
                  },
                  "heading": {
                    "style": {
                      "color": "#d2687f",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "23px",
                      "font-weight": "700",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#ff819c",
                      "text-align": "center"
                    },
                    "text": "<strong>Quibus numquam</strong>",
                    "title": "h1"
                  },
                  "style": {
                    "padding-bottom": "5px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "20px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-heading",
                "uuid": "011a8c2b-02cf-4b5f-9285-dd71e8f1c93d"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnAmp": false,
                    "hideContentOnDesktop": false,
                    "hideContentOnHtml": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#ff819c",
                      "paragraphSpacing": "16px"
                    },
                    "html": "<p>Nullam quis risus eget urna mollis.<br />Sed turpi est quisquam nobis</p>",
                    "style": {
                      "color": "#9d9da1",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "14px",
                      "font-weight": "400",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "90cae6a9-b1a8-4b89-9447-ad7a54dff03e"
              },
              {
                "descriptor": {
                  "button": {
                    "href": "https://beefree.io",
                    "label": "<div class=\"txtTinyMce-wrapper\" style=\"\" data-mce-style=\"\"><p style=\"word-break:break-word;\" data-mce-style=\"word-break:break-word;\"><span style=\"\" data-mce-style=\"\"><span style=\"\" data-mce-style=\"\">SHOW MORE</span></span></p></div>",
                    "style": {
                      "background-color": "transparent",
                      "border-bottom": "3px solid #D2687F",
                      "border-left": "3px solid #D2687F",
                      "border-radius": "30px",
                      "border-right": "3px solid #D2687F",
                      "border-top": "3px solid #D2687F",
                      "color": "#d2687f",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "16px",
                      "font-weight": "700",
                      "line-height": "200%",
                      "max-width": "100%",
                      "padding-bottom": "0px",
                      "padding-left": "15px",
                      "padding-right": "15px",
                      "padding-top": "0px",
                      "width": "auto"
                    },
                    "target": "_self"
                  },
                  "computedStyle": {
                    "height": 38,
                    "width": 146
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "15px",
                    "text-align": "center"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-button",
                "uuid": "ca616f2e-7d96-43a6-a1cb-7642f4d27549"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "e2b2669a-0185-4565-a4a2-1644c9989d74"
          },
          {
            "grid-columns": 6,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "class": "center  autowidth ",
                    "width": "115px"
                  },
                  "image": {
                    "alt": "Image",
                    "height": "120px",
                    "href": "https://beefree.io",
                    "prefix": "",
                    "src": "https://d1oco4z2z1fhwp.cloudfront.net/templates/default/113/icon-bulb.png",
                    "target": "_self",
                    "width": "115px"
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-image",
                "uuid": "49fbfb1d-66eb-416b-a832-2dde397b2556"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "height": 42,
                    "width": 52
                  },
                  "heading": {
                    "style": {
                      "color": "#d2687f",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "23px",
                      "font-weight": "700",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#ff819c",
                      "text-align": "center"
                    },
                    "text": "<strong>Dolor sit amet</strong>",
                    "title": "h1"
                  },
                  "style": {
                    "padding-bottom": "5px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "20px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-heading",
                "uuid": "049de2bd-a524-4313-9c2e-b3afac36eb0d"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnAmp": false,
                    "hideContentOnDesktop": false,
                    "hideContentOnHtml": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#ff819c",
                      "paragraphSpacing": "16px"
                    },
                    "html": "<p>Nullam quis risus eget urna mollis.<br />Sed turpi est quisquam nobis</p>",
                    "style": {
                      "color": "#9d9da1",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "14px",
                      "font-weight": "400",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "9720d206-2560-48ae-91cd-102739610088"
              },
              {
                "descriptor": {
                  "button": {
                    "href": "https://beefree.io",
                    "label": "<div class=\"txtTinyMce-wrapper\" style=\"\" data-mce-style=\"\"><p style=\"word-break:break-word;\" data-mce-style=\"word-break:break-word;\"><span style=\"\" data-mce-style=\"\"><span style=\"\" data-mce-style=\"\">SHOW MORE</span></span></p></div>",
                    "style": {
                      "background-color": "transparent",
                      "border-bottom": "3px solid #D2687F",
                      "border-left": "3px solid #D2687F",
                      "border-radius": "30px",
                      "border-right": "3px solid #D2687F",
                      "border-top": "3px solid #D2687F",
                      "color": "#d2687f",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "16px",
                      "font-weight": "700",
                      "line-height": "200%",
                      "max-width": "100%",
                      "padding-bottom": "0px",
                      "padding-left": "15px",
                      "padding-right": "15px",
                      "padding-top": "0px",
                      "width": "auto"
                    },
                    "target": "_self"
                  },
                  "computedStyle": {
                    "height": 38,
                    "width": 146
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "15px",
                    "text-align": "center"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-button",
                "uuid": "4b3fd148-e154-414c-9b06-9d8bf1856a52"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "f3b0abb4-6068-419b-bfed-60727570c366"
          }
        ],
        "container": {
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#333",
            "width": "675px"
          }
        },
        "empty": false,
        "locked": false,
        "synced": false,
        "type": "two-columns-empty",
        "uuid": "fd36cf36-dbb3-4834-9464-6a6a8f27907b"
      },
      {
        "columns": [
          {
            "grid-columns": 12,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "align": "center"
                  },
                  "divider": {
                    "style": {
                      "border-top": "1px solid #F0F0F0",
                      "height": "0px",
                      "width": "100%"
                    }
                  },
                  "style": {
                    "padding-bottom": "30px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "15px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-divider",
                "uuid": "445a1956-deac-4e2e-a48d-2a458c83993d"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "height": 42,
                    "width": 52
                  },
                  "heading": {
                    "style": {
                      "color": "#606060",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "38px",
                      "font-weight": "700",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#E01253",
                      "text-align": "center"
                    },
                    "text": "<strong>Fusce Nullam Consectetur</strong>",
                    "title": "h1"
                  },
                  "style": {
                    "padding-bottom": "15px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-heading",
                "uuid": "970cbd50-f921-4166-bf17-766251359e91"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnAmp": false,
                    "hideContentOnDesktop": false,
                    "hideContentOnHtml": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068a5",
                      "paragraphSpacing": "16px"
                    },
                    "html": "<p>Vestibulum id ligula porta felis euismod semper. Nulla vitae elit.</p>",
                    "style": {
                      "color": "#828282",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "16px",
                      "font-weight": "400",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "aa354280-903e-4ca5-8374-19ccb07b6277"
              },
              {
                "descriptor": {
                  "button": {
                    "label": "<div class=\"txtTinyMce-wrapper\" style=\"\" data-mce-style=\"\"><p style=\"word-break:break-word;\" data-mce-style=\"word-break:break-word;\"><span style=\"\" data-mce-style=\"\"><span style=\"\" data-mce-style=\"\">SHOW MORE</span></span></p></div>",
                    "style": {
                      "background-color": "transparent",
                      "border-bottom": "3px solid #800080",
                      "border-left": "3px solid #800080",
                      "border-radius": "30px",
                      "border-right": "3px solid #800080",
                      "border-top": "3px solid #800080",
                      "color": "#680080",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "20px",
                      "font-weight": "700",
                      "line-height": "200%",
                      "max-width": "100%",
                      "padding-bottom": "5px",
                      "padding-left": "20px",
                      "padding-right": "20px",
                      "padding-top": "5px",
                      "width": "35%"
                    },
                    "target": "_self"
                  },
                  "computedStyle": {
                    "height": 56,
                    "width": 229
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "15px",
                    "text-align": "center"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-button",
                "uuid": "051b8a87-1989-4a20-ade6-42fc0dcadf23"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnMobile": false
                  },
                  "spacer": {
                    "style": {
                      "height": "55px"
                    }
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-spacer",
                "uuid": "5aeb2aff-b6dc-4f20-9518-25e64a374653"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "2595bc5d-0dde-4b9e-9eca-d969700fd3df"
          }
        ],
        "container": {
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#000000",
            "width": "675px"
          }
        },
        "empty": false,
        "locked": false,
        "synced": false,
        "type": "one-column-empty",
        "uuid": "6fd5ca61-d6a8-49f6-8463-82a5d4a342a5"
      },
      {
        "columns": [
          {
            "grid-columns": 12,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "height": 57,
                    "iconsDefaultWidth": 32,
                    "padding": "0 5px 5px 0",
                    "width": 151
                  },
                  "iconsList": {
                    "icons": [
                      {
                        "image": {
                          "alt": "Facebook",
                          "href": "https://www.facebook.com/",
                          "prefix": "https://www.facebook.com/",
                          "src": "https://app-rsrc.getbee.io/public/resources/social-networks-icon-sets/t-outline-circle-color/facebook.png",
                          "target": "_self",
                          "title": "Facebook"
                        },
                        "name": "facebook",
                        "text": "",
                        "type": "follow"
                      },
                      {
                        "image": {
                          "alt": "Twitter",
                          "href": "http://twitter.com/",
                          "prefix": "http://twitter.com/",
                          "src": "https://app-rsrc.getbee.io/public/resources/social-networks-icon-sets/t-outline-circle-color/twitter.png",
                          "target": "_self",
                          "title": "Twitter"
                        },
                        "name": "twitter",
                        "text": "",
                        "type": "follow"
                      },
                      {
                        "image": {
                          "alt": "Instagram",
                          "href": "https://instagram.com/",
                          "prefix": "https://instagram.com/",
                          "src": "https://app-rsrc.getbee.io/public/resources/social-networks-icon-sets/t-outline-circle-color/[email protected]",
                          "target": "_self",
                          "title": "Instagram"
                        },
                        "name": "instagram",
                        "text": "",
                        "type": "follow"
                      }
                    ]
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px",
                    "text-align": "center"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-social",
                "uuid": "a901f3ec-f8f0-4a59-9260-2ace7ef36ff5"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnAmp": false,
                    "hideContentOnDesktop": false,
                    "hideContentOnHtml": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#ff819c",
                      "paragraphSpacing": "16px"
                    },
                    "html": "<p>Your Company &copy; All rights reserved</p>",
                    "style": {
                      "color": "#959595",
                      "direction": "ltr",
                      "font-family": "Montserrat, Arial, Helvetica, sans-serif",
                      "font-size": "14px",
                      "font-weight": "400",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "543e160e-c86e-4863-abbe-ec17524260fc"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "30px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "30px"
            },
            "uuid": "d38114b4-b17f-41c7-86cc-f016916e09c6"
          }
        ],
        "container": {
          "style": {
            "background-color": "#f5e4ff",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#333",
            "width": "675px"
          }
        },
        "empty": false,
        "locked": false,
        "synced": false,
        "type": "one-column-empty",
        "uuid": "fb49b3e5-5808-4945-9244-6211badb95bb"
      }
    ],
    "template": {
      "name": "template-base",
      "type": "basic",
      "version": "2.0.0"
    },
    "title": "BF-ecommerce-template"
  },
  "comments": {},
  "beautifyHtmlEnabled": true
}
<html>Hello World!</html>

Transform Beefree JSON into Plain Text

post

Use this endpoint to transform any template's Beefree JSON into HTML. This endpoint is compatible with Email builder designs.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
languagestringOptional

A string field for language

Responses
200

Successful response

text/plain
Responsestring
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/plain-text
POST /v1/{collection}/plain-text HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 18838

{
  "page": {
    "body": {
      "container": {
        "style": {
          "background-color": "#fff",
          "background-image": "none",
          "background-position": "top left",
          "background-repeat": "no-repeat",
          "background-size": "auto"
        }
      },
      "content": {
        "computedStyle": {
          "linkColor": "#8a3b8f",
          "messageBackgroundColor": "transparent",
          "messageWidth": "650px"
        },
        "style": {
          "color": "#000000",
          "font-family": "Lato, Tahoma, Verdana, Segoe, sans-serif"
        }
      },
      "type": "mailup-bee-page-properties",
      "webFonts": [
        {
          "fontFamily": "'Lato', Tahoma, Verdana, Segoe, sans-serif",
          "name": "Lato",
          "url": "https://fonts.googleapis.com/css?family=Lato"
        }
      ]
    },
    "description": "",
    "rows": [
      {
        "columns": [
          {
            "grid-columns": 12,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "align": "center",
                    "hideContentOnMobile": false
                  },
                  "divider": {
                    "style": {
                      "border-top": "0px solid transparent",
                      "height": "10px",
                      "width": "100%"
                    }
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-divider",
                "uuid": "b89c3d25-dbec-439a-8ad1-4939a28678e9"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "0px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "0px"
            },
            "uuid": "3bd72010-5175-4326-b848-8beacea852d6"
          }
        ],
        "container": {
          "style": {
            "background-color": "#8a3b8f",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#000000",
            "width": "650px"
          }
        },
        "empty": false,
        "locked": false,
        "metadata": {
          "category": 625122,
          "dateCreated": "2022-01-20T09:49:32.875165Z",
          "dateModified": "2022-01-20T09:49:32.875165Z",
          "description": "",
          "idParent": null,
          "name": "Pre header purple row",
          "slug": "pre-header-purple-row",
          "thumb_large": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/8b99691b-8e39-47a7-8773-4540cd7ff113_large.jpg",
          "thumb_medium": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/8b99691b-8e39-47a7-8773-4540cd7ff113_medium.jpg",
          "thumb_small": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/8b99691b-8e39-47a7-8773-4540cd7ff113_small.jpg",
          "uuid": "8b99691b-8e39-47a7-8773-4540cd7ff113"
        },
        "synced": false,
        "type": "one-column-empty",
        "uuid": "7fa3e6c4-ac4f-421f-b9eb-db1b9f629fb3"
      },
      {
        "columns": [
          {
            "grid-columns": 12,
            "modules": [
              {
                "align": "left",
                "descriptor": {
                  "computedStyle": {
                    "class": "left fixedwidth",
                    "width": "162.5px"
                  },
                  "image": {
                    "alt": "BEE Pro Logo",
                    "height": "109px",
                    "href": "https://beefree.io/",
                    "percWidth": 25,
                    "prefix": "",
                    "src": "https://d15k2d11r6t6rl.cloudfront.net/public/users/Integrators/BeeProAgency/53601_655907/editor_images/BEEPro_logo_2.png",
                    "target": "_self",
                    "width": "291px"
                  },
                  "style": {
                    "padding-bottom": "40px",
                    "padding-left": "20px",
                    "padding-right": "20px",
                    "padding-top": "20px",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-image",
                "uuid": "cc54124d-97bd-44e0-b15e-710a577840ec"
              },
              {
                "align": "left",
                "descriptor": {
                  "computedStyle": {
                    "align": "center"
                  },
                  "divider": {
                    "style": {
                      "border-top": "1px dotted #CCCCCC",
                      "width": "100%"
                    }
                  },
                  "style": {
                    "padding-bottom": "20px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "15px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-divider",
                "uuid": "2cd36842-fbe8-4f43-9688-ff6c964aaa89"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnAmp": false,
                    "hideContentOnDesktop": false,
                    "hideContentOnHtml": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068a5",
                      "paragraphSpacing": "16px"
                    },
                    "html": "<p>Hi 🙂</p>\n<p><strong>Would you be interested to participate in a user research project with us?</strong></p>\n<p>The research will consist of a video call. It usually takes 30 to 45 minutes maximum, but we schedule 1 hour in case we need more time. We'll be asking questions about you, your team, and your email/page creation workflow. The idea is for us to understand how BEE Pro fits in your work day.</p>\n<p><strong>Sounds good?</strong> Pick a time slot at your convenience using <a href=\"https://calendly.com/beepro-product-team/beepro-interview?month=2022-06\" target=\"_blank\" rel=\"noopener\" style=\"text-decoration: underline;\">this link ↗</a></p>\n<p>Look forward to hearing back from you.</p>\n<p>Best,</p>\n<p>Dalila from the Product Team 💜</p>\n<p>P.S. Probably your colleagues that use BEE Pro have received this email too. If you'd like you can add one guest to the booking link and participate together, or you can join us alone. We would love to talk to you in any case.&nbsp;</p>",
                    "style": {
                      "color": "#000000",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "14px",
                      "font-weight": "400",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "text-align": "left"
                    },
                    "translations": {
                      "de-DE": {
                        "html": "<p>Hallo 🙂<br /><br />Is het interessant om deel te nemen aan een onderzoek naar nieuwe gebruikersonderzoeken?<br /><br />Het onderzoek bestaat uit een videofilm. Wacht tussen 30 en 45 minuten als het maximum, maar het programma duurt 1 uur voordat u meer tijd nodig heeft. De haremos worden nu gebruikt, uw uitrusting en uw vloeiende creatie van pagina's/correos elektronische. Het idee is dat BEE Pro op zijn werk werkt.<br /><br />&iquest;Suena bien? Elija un horario de su conveniencia usando este enlace ↗<br />Esperamos tener noticias suyas.<br /><br />Groot,<br /><br />Dalila del equipo de producto 💜<br /><br /><br />PD Waarschijnlijk is uw partner die BEE Pro gebruikt, deze recibido is elektrisch correct. Als je dit hebt gedaan, kun je een uitnodiging voor het reserveren en de deelname aan de wedstrijd verzamelen, of je kunt een nieuwe solo spelen. Geen enkele gebeurtenis wordt in een ander geval verwisseld.</p>"
                      },
                      "es-ES": {
                        "html": "<p>Hola 🙂<br /><br />&iquest;Estar&iacute;a interesado en participar en un proyecto de investigaci&oacute;n de usuarios con nosotros?<br /><br />La investigaci&oacute;n consistir&aacute; en una videollamada. Suele tardar entre 30 y 45 minutos como m&aacute;ximo, pero programamos 1 hora por si necesitamos m&aacute;s tiempo. Le haremos preguntas sobre usted, su equipo y su flujo de trabajo de creaci&oacute;n de p&aacute;ginas/correos electr&oacute;nicos. La idea es que entendamos c&oacute;mo encaja BEE Pro en su jornada laboral.<br /><br /><br />&iquest;Suena bien? Elija un horario de su conveniencia usando este enlace ↗<br />Esperamos tener noticias suyas.<br /><br /><br />Mejor,<br /><br />Dalila del equipo de producto 💜<br /><br /><br /><br />PD Probablemente tus compa&ntilde;eros que utilizan BEE Pro tambi&eacute;n hayan recibido este correo electr&oacute;nico. Si lo desea, puede agregar un invitado al enlace de reserva y participar juntos, o puede unirse a nosotros solo. Nos encantar&iacute;a hablar con usted en cualquier caso.</p>"
                      }
                    }
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "0456f2de-7125-475c-b016-41f77b3fda47"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "10px",
              "padding-right": "10px",
              "padding-top": "5px"
            },
            "uuid": "61614a04-eb36-4d98-b28e-c6c9e048877d"
          }
        ],
        "container": {
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#000000",
            "width": "650px"
          }
        },
        "empty": false,
        "locked": false,
        "metadata": {
          "category": 625122,
          "dateCreated": "2022-01-20T09:51:57.896884Z",
          "dateModified": "2022-01-20T09:51:57.896884Z",
          "description": "",
          "idParent": null,
          "name": "body with: logo + pre title + title + subtitle + body",
          "slug": "body-with-logo-pre-title-title-subtitle-body",
          "thumb_large": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/35d02430-32b2-41d6-a115-68d7bb476d64_large.jpg",
          "thumb_medium": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/35d02430-32b2-41d6-a115-68d7bb476d64_medium.jpg",
          "thumb_small": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/35d02430-32b2-41d6-a115-68d7bb476d64_small.jpg",
          "uuid": "35d02430-32b2-41d6-a115-68d7bb476d64"
        },
        "synced": false,
        "type": "two-columns-empty",
        "uuid": "f57920be-d9e4-41c0-a009-eb85fd2a8034"
      },
      {
        "columns": [
          {
            "grid-columns": 12,
            "modules": [
              {
                "align": "left",
                "descriptor": {
                  "computedStyle": {
                    "align": "center"
                  },
                  "divider": {
                    "style": {
                      "border-top": "1px dotted #CCCCCC",
                      "width": "100%"
                    }
                  },
                  "style": {
                    "padding-bottom": "30px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "15px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-divider",
                "uuid": "ab4460e6-1206-45c1-ba56-9f6d6409508e"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "6ac459ef-5e34-468a-b064-07ea57e1e37c"
          }
        ],
        "container": {
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#000000",
            "width": "650px"
          }
        },
        "empty": false,
        "locked": false,
        "metadata": {
          "category": 625122,
          "dateCreated": "2021-06-29T08:19:25.800829Z",
          "dateModified": "2021-06-29T08:19:27.572522Z",
          "description": "",
          "idParent": null,
          "name": "Footer Line",
          "slug": "footer-line",
          "uuid": "77127825-a508-4127-9155-b5161f9e1703"
        },
        "synced": false,
        "type": "row-1-columns-12",
        "uuid": "b759c29c-fb9e-4b1a-add9-a464eeb568f5"
      },
      {
        "columns": [
          {
            "grid-columns": 3,
            "modules": [
              {
                "align": "left",
                "descriptor": {
                  "computedStyle": {
                    "class": "left fixedwidth",
                    "width": "130px"
                  },
                  "image": {
                    "alt": "Elena Loatelli & Dalila Bonomi",
                    "height": "263px",
                    "href": "",
                    "percWidth": 80,
                    "prefix": "",
                    "src": "https://d15k2d11r6t6rl.cloudfront.net/public/users/Integrators/BeeProAgency/53601_655907/editor_images/dalila.png",
                    "target": "_self",
                    "width": "263px"
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "15px",
                    "padding-right": "0px",
                    "padding-top": "5px",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-image",
                "uuid": "682c9273-3090-43fb-9acc-a2e2cda857b7"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "a434440b-92d8-4841-90cc-2ab49b1afc14"
          },
          {
            "grid-columns": 9,
            "modules": [
              {
                "align": "left",
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnMobile": false
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "15px",
                    "padding-right": "10px",
                    "padding-top": "10px"
                  },
                  "text": {
                    "computedStyle": {
                      "linkColor": "#8a3b8f"
                    },
                    "html": "<div class=\"txtTinyMce-wrapper\" style=\"font-size:14px;line-height:16px;font-family:inherit;\" data-mce-style=\"font-size:14px;line-height:16px;font-family:inherit;\"><p style=\"font-size:14px;line-height:16px;word-break:break-word;\" data-mce-style=\"font-size:14px;line-height:16px;word-break:break-word;\"><strong><span style=\"font-size:16px;line-height:19px;\" data-mce-style=\"font-size:16px;line-height:19px;\">DALILA BONOMI</span></strong></p></div>",
                    "style": {
                      "color": "#8a3b8f",
                      "font-family": "inherit",
                      "line-height": "120%"
                    }
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-text",
                "uuid": "b37a5a73-5f40-4e2d-8d7b-6a117aa686eb"
              },
              {
                "align": "left",
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false
                  },
                  "style": {
                    "padding-bottom": "5px",
                    "padding-left": "15px",
                    "padding-right": "0px",
                    "padding-top": "10px"
                  },
                  "text": {
                    "computedStyle": {
                      "linkColor": "#8a3b8f"
                    },
                    "html": "<div class=\"txtTinyMce-wrapper\" style=\"font-size:12px;line-height:21px;font-family:inherit;\" data-mce-style=\"font-size:12px;line-height:21px;font-family:inherit;\"><p style=\"font-size:14px;line-height:25px;word-break:break-word;text-align:left;\" data-mce-style=\"font-size:14px;line-height:25px;word-break:break-word;text-align:left;\"><strong><span style=\"font-size:16px;line-height:28px;\" data-mce-style=\"font-size:16px;line-height:28px;\">BEE | The email &amp; page builder for everyone.</span></strong></p><p style=\"line-height:21px;word-break:break-word;\" data-mce-style=\"line-height:21px;word-break:break-word;\"><span style=\"font-size:16px;line-height:28px;\" data-mce-style=\"font-size:16px;line-height:28px;\">Design Researcher</span></p></div>",
                    "style": {
                      "color": "#454562",
                      "font-family": "inherit",
                      "line-height": "180%"
                    }
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-text",
                "uuid": "a916773b-42f4-4efc-af64-3b2a9f801015"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "bc078241-a4ab-4a26-b28b-b7aba3180d3a"
          }
        ],
        "container": {
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#000000",
            "width": "650px"
          }
        },
        "empty": false,
        "locked": false,
        "metadata": {
          "category": 706433,
          "dateCreated": "2022-01-31T09:21:17.612857Z",
          "dateModified": "2022-01-31T09:21:20.633639Z",
          "description": "",
          "idParent": null,
          "name": "Dalila single sign",
          "slug": "dalila-single-sign",
          "uuid": "37bceb9d-b1c9-4724-b5ad-31645653d1c2"
        },
        "synced": false,
        "type": "two-columns-3-9-empty",
        "uuid": "3218627f-a68a-4f5d-b3e9-adfa19bb82ec"
      },
      {
        "columns": [
          {
            "grid-columns": 12,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "align": "center",
                    "hideContentOnMobile": false
                  },
                  "divider": {
                    "style": {
                      "border-top": "0px solid transparent",
                      "height": "50px",
                      "width": "100%"
                    }
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-divider",
                "uuid": "5a247632-900c-4a38-8bf1-2307938d9bb5"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "ecfdb53f-a7a0-40dd-9fd9-67d7e2677832"
          }
        ],
        "container": {
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#000000",
            "width": "650px"
          }
        },
        "empty": false,
        "locked": false,
        "synced": false,
        "type": "one-column-empty",
        "uuid": "feb66cab-ac4a-4ec2-b5d6-657eeabd1039"
      },
      {
        "columns": [
          {
            "grid-columns": 12,
            "modules": [
              {
                "align": "left",
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false,
                    "iconHeight": "16px",
                    "iconSpacing": {
                      "padding-bottom": "5px",
                      "padding-left": "5px",
                      "padding-right": "6px",
                      "padding-top": "5px"
                    },
                    "itemsSpacing": "0px"
                  },
                  "iconsList": {
                    "icons": [
                      {
                        "alt": "Designed with BEE",
                        "height": "325px",
                        "href": "https://beefree.io/",
                        "id": "1879a39d-9303-43e5-8458-990ac7b0a429",
                        "image": "https://d15k2d11r6t6rl.cloudfront.net/public/users/Integrators/BeeProAgency/53601_510656/Signature/bee_w.png",
                        "target": "_blank",
                        "text": "Designed with BEE",
                        "textPosition": "right",
                        "title": "Designed with BEE",
                        "width": "325px"
                      }
                    ]
                  },
                  "style": {
                    "color": "#ffffff",
                    "font-family": "inherit",
                    "font-size": "15px",
                    "padding-bottom": "5px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "5px",
                    "text-align": "center"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-icons",
                "uuid": "35f3f7a2-37aa-4471-bd26-ce2b51e6e39b"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "8d6cbc30-0a36-4037-ae02-827d71033fee"
          }
        ],
        "container": {
          "style": {
            "background-color": "#8a3b8f",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#000000",
            "width": "650px"
          }
        },
        "empty": false,
        "locked": false,
        "metadata": {
          "category": 706433,
          "dateCreated": "2022-01-20T09:44:21.371097Z",
          "dateModified": "2022-01-20T11:01:58.708887Z",
          "description": "",
          "idParent": null,
          "name": "Designed with BEE",
          "slug": "designed-with-bee",
          "thumb_large": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/727e515b-7455-4661-8e85-22b9f7178d3f_large.jpg",
          "thumb_medium": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/727e515b-7455-4661-8e85-22b9f7178d3f_medium.jpg",
          "thumb_small": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/727e515b-7455-4661-8e85-22b9f7178d3f_small.jpg",
          "uuid": "727e515b-7455-4661-8e85-22b9f7178d3f"
        },
        "synced": false,
        "type": "one-column-empty",
        "uuid": "cc615b28-4773-45ef-b0bf-4ef7ef89b1bf"
      }
    ],
    "template": {
      "name": "template-base",
      "type": "basic",
      "version": "2.0.0"
    },
    "title": ""
  },
  "language": "it-IT"
}
Hello world! Welcome to [Beefree SDK](https://developers.beefree.io/)!

Transform HTML into a PDF

post

Transform email or page HTML into a PDF that can be attached to emails, SMS messages, or physically printed out.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
page_sizestringOptional

A string field for page_size

page_orientationstringOptional

A string field for page_orientation

htmlstringOptional

A string field for html

Responses
200

Successful response

application/json
Responseobject
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/pdf
POST /v1/{collection}/pdf HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 189

{
  "page_size": "Full",
  "page_orientation": "landscape",
  "html": "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"></head><body><div style='width:900px; margin: 30px;'>test</div></body></html>"
}
{
  "message": "Success"
}

Transform HTML into an Image

post

Use this endpoint to transform a design's HTML into an Image, which can be used for thumbnails and similar purposes. Compatible with Email and Page builder.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
file_typestringOptional

A string field for file_type

sizestringOptional

A string field for size

htmlstringOptional

A string field for html

Responses
200

Successful response

image/png
Responsestring
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/image
POST /v1/{collection}/image HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 37420

{
  "file_type": "png",
  "size": "1000",
  "html": "<!DOCTYPE html>\r\n<html lang=\"en\" xmlns:v=\"urn:schemas-microsoft-com:vml\">\r\n  <head></head>\r\n  <head>\r\n    <meta charset=\"utf-8\">\r\n    <meta name=\"x-apple-disable-message-reformatting\">\r\n    <meta http-equiv=\"x-ua-compatible\" content=\"ie=edge\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n    <meta name=\"format-detection\" content=\"telephone=no, date=no, address=no, email=no\">\r\n    <meta name=\"color-scheme\" content=\"light dark\">\r\n    <meta name=\"supported-color-schemes\" content=\"light dark\">\r\n    <!--[if mso]>\r\n\t\t\t\t\t\t\t\t\t<noscript>\r\n\t\t\t\t\t\t\t\t\t\t<xml>\r\n\t\t\t\t\t\t\t\t\t\t\t<o:OfficeDocumentSettings\r\n\t\t\t\t\t\t\t\t\t\t\t\txmlns:o=\"urn:schemas-microsoft-com:office:office\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<o:PixelsPerInch>96</o:PixelsPerInch>\r\n\t\t\t\t\t\t\t\t\t\t\t</o:OfficeDocumentSettings>\r\n\t\t\t\t\t\t\t\t\t\t</xml>\r\n\t\t\t\t\t\t\t\t\t</noscript>\r\n\t\t\t\t\t\t\t\t\t<style>\r\n    td,th,div,p,a,h1,h2,h3,h4,h5,h6 {font-family: \"Segoe UI\", sans-serif; mso-line-height-rule: exactly;}\r\n  </style>\r\n\t\t\t\t\t\t\t\t\t<![endif]-->\r\n    <title>Black Friday Booster 50% OFF</title>\r\n    <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\r\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin=\"\">\r\n    <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap\" rel=\"stylesheet\" media=\"screen\">\r\n    <style>\r\n      .hover-bg-cool-gray-100:hover {\r\n        background-color: #f7f8fa !important;\r\n      }\r\n\r\n      .hover-bg-primary-600:hover {\r\n        background-color: #003cdf !important;\r\n      }\r\n\r\n      .hover-text-cool-gray-600:hover {\r\n        color: #585e83 !important;\r\n      }\r\n\r\n      @media (max-width: 648px) {\r\n        .sm-block {\r\n          display: block !important;\r\n        }\r\n\r\n        .sm-hidden {\r\n          display: none !important;\r\n        }\r\n\r\n        .sm-h-px {\r\n          height: 1px !important;\r\n        }\r\n\r\n        .sm-w-full {\r\n          width: 100% !important;\r\n        }\r\n\r\n        .sm-py-12 {\r\n          padding-top: 12px !important;\r\n          padding-bottom: 12px !important;\r\n        }\r\n\r\n        .sm-px-0 {\r\n          padding-left: 0 !important;\r\n          padding-right: 0 !important;\r\n        }\r\n\r\n        .sm-px-24 {\r\n          padding-left: 24px !important;\r\n          padding-right: 24px !important;\r\n        }\r\n\r\n        .sm-pb-12 {\r\n          padding-bottom: 12px !important;\r\n        }\r\n\r\n        .sm-text-center {\r\n          text-align: center !important;\r\n        }\r\n\r\n        .sm-text-4xl {\r\n          font-size: 36px !important;\r\n        }\r\n\r\n        .sm-leading-16 {\r\n          line-height: 16px !important;\r\n        }\r\n\r\n        .sm-leading-2 {\r\n          line-height: 2px !important;\r\n        }\r\n\r\n        .sm-leading-40 {\r\n          line-height: 40px !important;\r\n        }\r\n      }\r\n\r\n      @media (prefers-color-scheme: dark) {\r\n        .dark-border-gray-600 {\r\n          border-color: #272727 !important;\r\n        }\r\n\r\n        .dark-bg-gray-800 {\r\n          background-color: #1e1e1e !important;\r\n        }\r\n\r\n        .dark-bg-gray-900 {\r\n          background-color: #121212 !important;\r\n        }\r\n\r\n        .dark-bg-white {\r\n          background-color: #ffffff !important;\r\n        }\r\n\r\n        .dark-bg-gray-600 {\r\n          background-color: #272727 !important;\r\n        }\r\n\r\n        .dark-bg-gray-700 {\r\n          background-color: #222222 !important;\r\n        }\r\n\r\n        .dark-bg-gray-500 {\r\n          background-color: #2d2d2d !important;\r\n        }\r\n\r\n        .dark-text-gray-200 {\r\n          color: #ababab !important;\r\n        }\r\n\r\n        .dark-text-gray-800 {\r\n          color: #1e1e1e !important;\r\n        }\r\n\r\n        .dark-text-gray-900 {\r\n          color: #121212 !important;\r\n        }\r\n\r\n        .dark-text-gray-50 {\r\n          color: #f9fafb !important;\r\n        }\r\n\r\n        .dark-text-primary-500 {\r\n          color: #0047ff !important;\r\n        }\r\n\r\n        .dark-hover-bg-gray-50:hover {\r\n          background-color: #f9fafb !important;\r\n        }\r\n\r\n        .dark-hover-text-gray-100:hover {\r\n          color: #d5d5d5 !important;\r\n        }\r\n      }\r\n    </style>\r\n  </head>\r\n  <body class=\"dark-bg-gray-900\" style=\"margin: 0; width: 100%; padding: 0; word-break: break-word; -webkit-font-smoothing: antialiased; background-color: #f7f8fa;\">\r\n    <div role=\"article\" aria-roledescription=\"email\" aria-label=\"Black Friday Booster 50% OFF\" lang=\"en\" style=\"font-size: 16px; font-size: 1rem; font-size: max(16px, 1rem)\">\r\n      <table style=\"width: 100%; font-family: 'Inter', -apple-system, ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n        <tr>\r\n          <td align=\"center\">\r\n            <!--[if mso]>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<v:rect\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\txmlns:v=\"urn:schemas-microsoft-com:vml\" fill=\"true\" stroke=\"false\" style=\"height:300px; mso-width-percent: 1000; position: absolute; left: -10px; top: -20px; z-index: -1;\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<v:fill type=\"tile\" color=\"#dee2e9\" />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<v:textbox inset=\"0,0,0,0\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<![endif]-->\r\n            <div style=\"max-height: 40px;\">\r\n              <div class=\"dark-bg-gray-900\" style=\"height: 300px; background-color: #dee2e9;\"></div>\r\n            </div>\r\n            <!--[if mso]>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</v:textbox>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</v:rect>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<![endif]-->\r\n            <table class=\"sm-w-full\" style=\"position: relative; max-height: 0; width: 568px; opacity: 0.999;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n              <tr>\r\n                <td style=\"vertical-align: top;\" valign=\"top\">\r\n                  <div class=\"sm-px-24\">\r\n                    <table style=\"width: 100%;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                      <tr>\r\n                        <td class=\"sm-px-24\" style=\"padding-left: 40px; padding-right: 40px;\">\r\n                          <table style=\"width: 100%;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                            <tr>\r\n                              <td>\r\n                                <a href=\"https://example.com\" style=\"text-decoration: none;\">\r\n                                  <picture>\r\n                                    <source srcset=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/logo-dark_2x.png\" media=\"(prefers-color-scheme: dark)\">\r\n                                    <img src=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/logo_2x.png\" width=\"88\" alt=\"Company Logo\" style=\"max-width: 100%; vertical-align: middle; line-height: 100%; border: 0;\">\r\n                                  </picture>\r\n                                </a>\r\n                              </td>\r\n                              <td align=\"right\">\r\n                                <a href=\"https://example.com\" class=\"dark-text-gray-900 dark-bg-white hover-bg-cool-gray-100\" style=\"display: inline-block; border-radius: 8px; background-color: #ffffff; padding: 7px 12px; text-align: center; font-size: 12px; font-weight: 700; color: #191847; text-decoration: none; box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.06), 0px 1px 3px rgba(0, 0, 0, 0.1);\">\r\n                                  <!--[if mso]>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i style=\"letter-spacing: 24px; mso-font-width: -100%; mso-text-raise: 30px;\">&nbsp;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<![endif]-->\r\n                                  <span style=\"mso-text-raise: 15px; margin-right: 6px;\"> Shop\r\n                                    <!--[if mso]>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i style=\"letter-spacing: 6px; mso-font-width: -100%;\">&nbsp;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<![endif]-->\r\n                                  </span>\r\n                        <span style=\"mso-text-raise: 10px;\">\r\n                          <img src=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/cart_2x.png\" width=\"18\"></span>\r\n                                  <!--[if mso]>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i style=\"letter-spacing: 24px; mso-font-width: -100%;\">&nbsp;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<![endif]-->\r\n                                </a>\r\n                              </td>\r\n                            </tr>\r\n                          </table>\r\n                        </td>\r\n                      </tr>\r\n                    </table>\r\n                    <div role=\"separator\" style=\"line-height: 40px;\">&zwnj;</div>\r\n                    <table class=\"dark-bg-gray-600\" style=\"width: 100%; border-radius: 8px; background-color: #ffffff; box-shadow: 0px 10px 10px -5px rgba(0, 0, 0, 0.04), 0px 20px 25px -5px rgba(0, 0, 0, 0.1);\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                      <tr>\r\n                        <td class=\"sm-px-24\" style=\"padding: 40px;\">\r\n                          <table style=\"width: 100%;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                            <tr>\r\n                              <td>\r\n                                <div>\r\n                                  <a href=\"https://example.com\">\r\n                                    <img src=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/hero/black-friday.png\" width=\"488\" style=\"max-width: 100%; vertical-align: middle; line-height: 100%; border: 0;\" alt=\"\">\r\n                                  </a>\r\n                                </div>\r\n                                <div role=\"separator\" style=\"line-height: 24px;\">&zwnj;</div>\r\n                                <h2 class=\"sm-text-4xl dark-text-gray-50\" style=\"margin: 0; font-size: 60px; font-weight: 700; line-height: 1; letter-spacing: -0.025em; color: #191847;\"> Black Friday <br class=\"sm-hidden\"> Booster <br>\r\n                                  <span style=\"font-family: -apple-system-ui-serif, ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; font-weight: 400; font-style: italic;\">50% OFF</span>\r\n                                </h2>\r\n                                <div role=\"separator\" style=\"line-height: 24px;\">&zwnj;</div>\r\n                                <p class=\"dark-text-gray-50\" style=\"margin: 0; font-size: 16px; line-height: 26px; color: #191847;\"> Hi Smiles Davis, <br>\r\n                                  <br> This Black Friday, we’re offering loyal [Product Name] customers like you the chance to take advantage of our entire range of Teams services for only HALF the usual price. <br>\r\n                                  <br> For <strong>$XX / month</strong>, you can upgrade your experience to include all these great benefits:\r\n                                </p>\r\n                              </td>\r\n                            </tr>\r\n                            <tr role=\"separator\">\r\n                              <td style=\"line-height: 24px;\">&zwnj;</td>\r\n                            </tr>\r\n                            <tr>\r\n                              <td>\r\n                                <table style=\"width: 100%;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                                  <tr>\r\n                                    <td class=\"dark-border-gray-600 dark-bg-gray-700 dark-text-gray-50\" style=\"border-radius: 8px; border: 1px solid #dee2e9; background-color: #f7f8fa; padding: 24px; color: #191847;\">\r\n                                      <h3 style=\"margin: 0; font-size: 12px; font-weight: 700;\"> Free Plan <em class=\"dark-text-gray-200\" style=\"font-weight: 400; color: #424670;\">(Currently 15 Members)</em>\r\n                                      </h3>\r\n                                      <div role=\"separator\" style=\"line-height: 4px;\">&zwnj;</div>\r\n                                      <p style=\"margin: 0; font-size: 18px; font-weight: 700; line-height: 28px;\"> $0 </p>\r\n                                      <div role=\"separator\" style=\"line-height: 12px;\">&zwnj;</div>\r\n                                      <p style=\"margin: 0; font-size: 14px; line-height: 21px;\"> Free Plan features include: </p>\r\n                                      <div role=\"separator\" style=\"line-height: 12px;\">&zwnj;</div>\r\n                                      <table style=\"width: 100%;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                                        <tr>\r\n                                          <td class=\"sm-w-full sm-block sm-pb-12\" style=\"width: 50%;\">\r\n                                            <table style=\"width: 100%;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                                              <tr>\r\n                                                <td style=\"width: 32px;\">\r\n                                                  <picture>\r\n                                                    <source srcset=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-dark-3x.png\" media=\"(prefers-color-scheme: dark)\">\r\n                                                    <img src=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-3x.png\" width=\"24\" alt=\"✔\" style=\"max-width: 100%; vertical-align: middle; line-height: 100%; border: 0;\">\r\n                                                  </picture>\r\n                                                </td>\r\n                                                <td style=\"font-size: 14px;\">[Feature name]</td>\r\n                                              </tr>\r\n                                              <tr role=\"separator\">\r\n                                                <td style=\"line-height: 12px;\">&zwnj;</td>\r\n                                              </tr>\r\n                                              <tr>\r\n                                                <td style=\"width: 32px;\">\r\n                                                  <picture>\r\n                                                    <source srcset=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-dark-3x.png\" media=\"(prefers-color-scheme: dark)\">\r\n                                                    <img src=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-3x.png\" width=\"24\" alt=\"✔\" style=\"max-width: 100%; vertical-align: middle; line-height: 100%; border: 0;\">\r\n                                                  </picture>\r\n                                                </td>\r\n                                                <td style=\"font-size: 14px;\">[Feature name]</td>\r\n                                              </tr>\r\n                                            </table>\r\n                                          </td>\r\n                                          <td class=\"sm-w-full sm-block\" style=\"width: 50%;\">\r\n                                            <table style=\"width: 100%;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                                              <tr>\r\n                                                <td style=\"width: 32px;\">\r\n                                                  <picture>\r\n                                                    <source srcset=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-dark-3x.png\" media=\"(prefers-color-scheme: dark)\">\r\n                                                    <img src=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-3x.png\" width=\"24\" alt=\"✔\" style=\"max-width: 100%; vertical-align: middle; line-height: 100%; border: 0;\">\r\n                                                  </picture>\r\n                                                </td>\r\n                                                <td style=\"font-size: 14px;\">[Feature name]</td>\r\n                                              </tr>\r\n                                              <tr role=\"separator\">\r\n                                                <td style=\"line-height: 12px;\">&zwnj;</td>\r\n                                              </tr>\r\n                                              <tr>\r\n                                                <td style=\"width: 32px;\">\r\n                                                  <picture>\r\n                                                    <source srcset=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-dark-3x.png\" media=\"(prefers-color-scheme: dark)\">\r\n                                                    <img src=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-3x.png\" width=\"24\" alt=\"✔\" style=\"max-width: 100%; vertical-align: middle; line-height: 100%; border: 0;\">\r\n                                                  </picture>\r\n                                                </td>\r\n                                                <td style=\"font-size: 14px;\">[Feature name]</td>\r\n                                              </tr>\r\n                                            </table>\r\n                                          </td>\r\n                                        </tr>\r\n                                      </table>\r\n                                    </td>\r\n                                  </tr>\r\n                                </table>\r\n                              </td>\r\n                            </tr>\r\n                            <tr role=\"separator\">\r\n                              <td style=\"line-height: 24px;\">&zwnj;</td>\r\n                            </tr>\r\n                            <tr>\r\n                              <td>\r\n                                <table style=\"width: 100%;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                                  <tr>\r\n                                    <td class=\"dark-border-gray-600 dark-bg-gray-500 dark-text-gray-50\" style=\"border-radius: 8px; border: 1px solid #dee2e9; background-color: #ffffff; padding: 24px; color: #191847;\">\r\n                                      <h3 style=\"margin: 0; font-size: 12px; font-weight: 700;\"> Team Plan </h3>\r\n                                      <div role=\"separator\" style=\"line-height: 4px;\">&zwnj;</div>\r\n                                      <p style=\"margin: 0; font-size: 18px; font-weight: 700; line-height: 28px;\"> $7 monthly </p>\r\n                                      <div role=\"separator\" style=\"line-height: 12px;\">&zwnj;</div>\r\n                                      <p style=\"margin: 0; font-size: 14px; line-height: 21px;\"> All features of the Free plan plus: </p>\r\n                                      <div role=\"separator\" style=\"line-height: 12px;\">&zwnj;</div>\r\n                                      <table style=\"width: 100%;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                                        <tr>\r\n                                          <td class=\"sm-w-full sm-block sm-pb-12\" style=\"width: 50%;\">\r\n                                            <table style=\"width: 100%;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                                              <tr>\r\n                                                <td style=\"width: 32px;\">\r\n                                                  <picture>\r\n                                                    <source srcset=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-dark-3x.png\" media=\"(prefers-color-scheme: dark)\">\r\n                                                    <img src=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-3x.png\" width=\"24\" alt=\"✔\" style=\"max-width: 100%; vertical-align: middle; line-height: 100%; border: 0;\">\r\n                                                  </picture>\r\n                                                </td>\r\n                                                <td style=\"font-size: 14px;\">[Feature name]</td>\r\n                                              </tr>\r\n                                              <tr role=\"separator\">\r\n                                                <td style=\"line-height: 12px;\">&zwnj;</td>\r\n                                              </tr>\r\n                                              <tr>\r\n                                                <td style=\"width: 32px;\">\r\n                                                  <picture>\r\n                                                    <source srcset=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-dark-3x.png\" media=\"(prefers-color-scheme: dark)\">\r\n                                                    <img src=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-3x.png\" width=\"24\" alt=\"✔\" style=\"max-width: 100%; vertical-align: middle; line-height: 100%; border: 0;\">\r\n                                                  </picture>\r\n                                                </td>\r\n                                                <td style=\"font-size: 14px;\">[Feature name]</td>\r\n                                              </tr>\r\n                                            </table>\r\n                                          </td>\r\n                                          <td class=\"sm-w-full sm-block\" style=\"width: 50%;\">\r\n                                            <table style=\"width: 100%;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                                              <tr>\r\n                                                <td style=\"width: 32px;\">\r\n                                                  <picture>\r\n                                                    <source srcset=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-dark-3x.png\" media=\"(prefers-color-scheme: dark)\">\r\n                                                    <img src=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-3x.png\" width=\"24\" alt=\"✔\" style=\"max-width: 100%; vertical-align: middle; line-height: 100%; border: 0;\">\r\n                                                  </picture>\r\n                                                </td>\r\n                                                <td style=\"font-size: 14px;\">[Feature name]</td>\r\n                                              </tr>\r\n                                              <tr role=\"separator\">\r\n                                                <td style=\"line-height: 12px;\">&zwnj;</td>\r\n                                              </tr>\r\n                                              <tr>\r\n                                                <td style=\"width: 32px;\">\r\n                                                  <picture>\r\n                                                    <source srcset=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-dark-3x.png\" media=\"(prefers-color-scheme: dark)\">\r\n                                                    <img src=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/icon-check-3x.png\" width=\"24\" alt=\"✔\" style=\"max-width: 100%; vertical-align: middle; line-height: 100%; border: 0;\">\r\n                                                  </picture>\r\n                                                </td>\r\n                                                <td style=\"font-size: 14px;\">[Feature name]</td>\r\n                                              </tr>\r\n                                            </table>\r\n                                          </td>\r\n                                        </tr>\r\n                                      </table>\r\n                                      <div role=\"separator\" style=\"line-height: 24px;\">&zwnj;</div>\r\n                                      <a href=\"https://example.com\" class=\"sm-block dark-text-primary-500 hover-bg-primary-600 dark-bg-white dark-hover-bg-gray-50\" style=\"display: inline-block; border-radius: 8px; background-color: #0047ff; padding: 14px 24px; text-align: center; font-size: 16px; font-weight: 700; color: #ffffff; text-decoration: none; box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.06), 0px 4px 6px -1px rgba(0, 0, 0, 0.1);\">\r\n                                        <!--[if mso]>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i style=\"letter-spacing: 24px; mso-font-width: -100%; mso-text-raise:30px;\">&nbsp;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<![endif]-->\r\n                                        <span style=\"mso-text-raise: 15px;\">Upgrade to Team Plan</span>\r\n                                        <!--[if mso]>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i style=\"letter-spacing: 24px; mso-font-width: -100%;\">&nbsp;</i>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<![endif]-->\r\n                                      </a>\r\n                                      <div role=\"separator\" style=\"line-height: 16px;\">&zwnj;</div>\r\n                                      <p class=\"dark-text-gray-200 sm-text-center\" style=\"margin: 0; font-size: 12px; line-height: 16px; color: #767e9d;\"> Upgrade and save 50% today. </p>\r\n                                    </td>\r\n                                  </tr>\r\n                                </table>\r\n                              </td>\r\n                            </tr>\r\n                            <tr role=\"separator\">\r\n                              <td style=\"line-height: 24px;\">&zwnj;</td>\r\n                            </tr>\r\n                            <tr>\r\n                              <td>\r\n                                <p class=\"dark-text-gray-50\" style=\"margin: 0; font-size: 16px; line-height: 26px; color: #191847;\"> But act fast &mdash; this deal is for a limited time only! </p>\r\n                              </td>\r\n                            </tr>\r\n                          </table>\r\n                        </td>\r\n                      </tr>\r\n                    </table>\r\n                  </div>\r\n                </td>\r\n              </tr>\r\n            </table>\r\n            <div class=\"sm-leading-40\" role=\"separator\" style=\"line-height: 64px;\">&zwnj;</div>\r\n            <table class=\"sm-w-full dark-text-gray-200\" style=\"width: 568px; color: #767e9d;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n              <tr>\r\n                <td style=\"padding-left: 40px; padding-right: 40px;\">\r\n                  <a href=\"https://example.com\" style=\"text-decoration: none;\">\r\n                    <picture>\r\n                      <source srcset=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/logo-footer-dark_2x.png\" media=\"(prefers-color-scheme: dark)\">\r\n                      <img src=\"https://res.cloudinary.com/dxa66e5ic/image/upload/v1637601683/holidays/logo-footer_2x.png\" width=\"79\" alt=\"Company Logo\" style=\"max-width: 100%; vertical-align: middle; line-height: 100%; border: 0;\">\r\n                    </picture>\r\n                  </a>\r\n                  <div role=\"separator\" style=\"line-height: 16px;\">&zwnj;</div>\r\n                  <table class=\"sm-w-full\" style=\"font-size: 12px; line-height: 16px;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                    <tr>\r\n                      <td class=\"sm-block sm-w-full\">\r\n                        <a href=\"https://example.com\" class=\"hover-text-cool-gray-600 dark-text-gray-200 dark-hover-text-gray-100\" style=\"font-weight: 700; color: #767e9d; text-decoration: none;\"> Shop </a>\r\n                      </td>\r\n                      <td class=\"sm-block sm-py-12 sm-px-0\" style=\"padding-left: 12px; padding-right: 12px;\">\r\n                        <table class=\"sm-hidden\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                          <tr>\r\n                            <td class=\"dark-bg-gray-800\" style=\"height: 24px; width: 1px; background-color: #dee2e9;\"></td>\r\n                          </tr>\r\n                        </table>\r\n                        <!--[if !mso]>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<!-->\r\n                        <div class=\"sm-block sm-h-px dark-bg-gray-800\" style=\"mso-hide: all; display: none; background-color: #dee2e9;\"></div>\r\n                        <!--\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<![endif]-->\r\n                      </td>\r\n                      <td class=\"sm-block sm-w-full\">\r\n                        <a href=\"https://twitter.com\" class=\"hover-text-cool-gray-600 dark-text-gray-200 dark-hover-text-gray-100\" style=\"font-weight: 700; color: #767e9d; text-decoration: none;\"> Twitter </a>\r\n                      </td>\r\n                      <td class=\"sm-block sm-py-12 sm-px-0\" style=\"padding-left: 12px; padding-right: 12px;\">\r\n                        <table class=\"sm-hidden\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                          <tr>\r\n                            <td class=\"dark-bg-gray-800\" style=\"height: 24px; width: 1px; background-color: #dee2e9;\"></td>\r\n                          </tr>\r\n                        </table>\r\n                        <!--[if !mso]>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<!-->\r\n                        <div class=\"sm-block sm-h-px dark-bg-gray-800\" style=\"mso-hide: all; display: none; background-color: #dee2e9;\"></div>\r\n                        <!--\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<![endif]-->\r\n                      </td>\r\n                      <td class=\"sm-block sm-w-full\">\r\n                        <a href=\"https://instagram.com\" class=\"hover-text-cool-gray-600 dark-text-gray-200 dark-hover-text-gray-100\" style=\"font-weight: 700; color: #767e9d; text-decoration: none;\"> Instagram </a>\r\n                      </td>\r\n                    </tr>\r\n                  </table>\r\n                  <hr class=\"dark-bg-gray-800 dark-text-gray-800\" style=\"margin-top: 12px; margin-bottom: 16px; height: 1px; border-width: 0px; background-color: #dee2e9; color: #dee2e9;\">\r\n                  <p style=\"margin: 0; font-size: 12px; line-height: 16px;\"> If you have questions or need help, don't hesitate to contact our support team! <br>\r\n                    <br> DEMOCO USA Inc, 4 World Trade Center, 150 Greenwich Street, 62nd Floor, New York, NY 10007, USA\r\n                  </p>\r\n                  <div class=\"sm-leading-16\" role=\"separator\" style=\"line-height: 20px;\">&zwnj;</div>\r\n                  <table class=\"sm-w-full\" style=\"font-size: 12px; line-height: 16px;\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                    <tr>\r\n                      <td class=\"sm-block sm-w-full\">\r\n                        <a href=\"https://example.com\" class=\"hover-text-cool-gray-600 dark-text-gray-200 dark-hover-text-gray-100\" style=\"font-weight: 700; color: #767e9d; text-decoration: none;\"> Terms &amp; conditions </a>\r\n                      </td>\r\n                      <td class=\"sm-block sm-py-12 sm-px-0\" style=\"padding-left: 12px; padding-right: 12px;\">\r\n                        <table class=\"sm-hidden\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                          <tr>\r\n                            <td class=\"dark-bg-gray-800\" style=\"height: 24px; width: 1px; background-color: #dee2e9;\"></td>\r\n                          </tr>\r\n                        </table>\r\n                        <!--[if !mso]>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<!-->\r\n                        <div class=\"sm-block sm-h-px dark-bg-gray-800\" style=\"mso-hide: all; display: none; background-color: #dee2e9;\"></div>\r\n                        <!--\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<![endif]-->\r\n                      </td>\r\n                      <td class=\"sm-block sm-w-full\">\r\n                        <a href=\"https://example.com\" class=\"hover-text-cool-gray-600 dark-text-gray-200 dark-hover-text-gray-100\" style=\"font-weight: 700; color: #767e9d; text-decoration: none;\"> Privacy policy </a>\r\n                      </td>\r\n                      <td class=\"sm-block sm-py-12 sm-px-0\" style=\"padding-left: 12px; padding-right: 12px;\">\r\n                        <table class=\"sm-hidden\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\">\r\n                          <tr>\r\n                            <td class=\"dark-bg-gray-800\" style=\"height: 24px; width: 1px; background-color: #dee2e9;\"></td>\r\n                          </tr>\r\n                        </table>\r\n                        <!--[if !mso]>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<!-->\r\n                        <div class=\"sm-block sm-h-px dark-bg-gray-800\" style=\"mso-hide: all; display: none; background-color: #dee2e9;\"></div>\r\n                        <!--\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<![endif]-->\r\n                      </td>\r\n                      <td class=\"sm-block sm-w-full\">\r\n                        <a href=\"https://example.com\" class=\"hover-text-cool-gray-600 dark-text-gray-200 dark-hover-text-gray-100\" style=\"font-weight: 700; color: #767e9d; text-decoration: none;\"> Contact us </a>\r\n                      </td>\r\n                      <td class=\"sm-block sm-px-0 sm-py-12\" style=\"mso-hide: all; display: none; padding-left: 12px; padding-right: 12px;\">\r\n                        <!--[if !mso]>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<!-->\r\n                        <div class=\"sm-block sm-h-px dark-bg-gray-800\" style=\"mso-hide: all; display: none; background-color: #dee2e9;\"></div>\r\n                        <!--\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<![endif]-->\r\n                      </td>\r\n                    </tr>\r\n                  </table>\r\n                  <div class=\"sm-leading-2\" role=\"separator\" style=\"line-height: 20px;\">&zwnj;</div>\r\n                  <p style=\"margin: 0; font-size: 12px; line-height: 16px;\"> This message was sent to [email protected]. If you don't want to receive these emails from DEMOCO in the future, you can <a href=\"https://example.com\" class=\"hover-text-cool-gray-600 dark-text-gray-200 dark-hover-text-gray-100\" style=\"font-weight: 700; color: #767e9d; text-decoration: none;\">edit your profile</a> or <a href=\"https://example.com\" class=\"hover-text-cool-gray-600 dark-text-gray-200 dark-hover-text-gray-100\" style=\"font-weight: 700; color: #767e9d; text-decoration: none;\">unsubscribe</a>. </p>\r\n                  <div role=\"separator\" style=\"line-height: 40px;\">&zwnj;</div>\r\n                </td>\r\n              </tr>\r\n            </table>\r\n          </td>\r\n        </tr>\r\n      </table>\r\n    </div>\r\n  </body>\r\n</html>"
}
https://s3.example.com/generic-image.png

Merge to replace or update content

post

Replace or update content in a Beefree template using a specific path and value. Compatible with Email and Page builders.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
Responses
200

Successful response

application/json
Responseobject
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/merge
POST /v1/{collection}/merge HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 46687

{
  "replace": [
    {
      "path": "$..rows[?(@.metadata.uid=='508824c4-8d45-11ee-84be-aafd6b2aca16')]",
      "value": {
        "columns": [
          {
            "grid-columns": 4,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "class": "center autowidth",
                    "hideContentOnMobile": false,
                    "width": "156.66666666666666px"
                  },
                  "image": {
                    "alt": "",
                    "dynamicSrc": "$product_reco[1].image_url$",
                    "height": "500px",
                    "href": "",
                    "prefix": "",
                    "src": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCIgdmlld0JveD0iMCAwIDUwMCA1MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjUwMCIgaGVpZ2h0PSI1MDAiIGZpbGw9IiNGM0YzRjMiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMzMS4yNTMgMjExLjY1NEwyMzUuOTc5IDE4Ni4xMjZMMjE1LjA3OSAyNjQuMTI5TDI1MS45ODkgMjQ4LjUxM0wyNzEuMzUgMjYzLjQwN0wzMjMuMTcyIDI0MS44MTVMMzMxLjI1MyAyMTEuNjU0Wk0zMDUuNzI1IDMwNi45MjhMMjc5LjgxNCAyOTkuOTg1TDMwNS44OTEgMzA2LjMwN0wzMDUuNzI1IDMwNi45MjhaTTIzNy4yNzQgMTgxLjI5NkwyMzIuNDQ0IDE4MC4wMDJMMjMxLjE1IDE4NC44MzJMMjA1LjYyMSAyODAuMTA2TDIwNC4zMjcgMjg0LjkzNUwyMDkuMTU3IDI4Ni4yMjlMMzA0LjQzMSAzMTEuNzU4TDMwOS4yNiAzMTMuMDUyTDMxMC41NTQgMzA4LjIyMkwzMzYuMDgzIDIxMi45NDhMMzM3LjM3NyAyMDguMTE5TDMzMi41NDggMjA2LjgyNUwyMzcuMjc0IDE4MS4yOTZaTTI1OS40MzUgMjM2LjU5NUMyNjYuODM4IDIzNi41OTUgMjcyLjgzOSAyMzAuNTk0IDI3Mi44MzkgMjIzLjE5MUMyNzIuODM5IDIxNS43ODggMjY2LjgzOCAyMDkuNzg2IDI1OS40MzUgMjA5Ljc4NkMyNTIuMDMyIDIwOS43ODYgMjQ2LjAzIDIxNS43ODggMjQ2LjAzIDIyMy4xOTFDMjQ2LjAzIDIzMC41OTQgMjUyLjAzMiAyMzYuNTk1IDI1OS40MzUgMjM2LjU5NVoiIGZpbGw9IiM5Nzk4OTQiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIxNy42MDQgMjEyLjc2NEgyMTQuNTAyVjIxNC4wMTRWMjE1LjI2NEgyMTYuOTM0TDIxNy42MDQgMjEyLjc2NFpNMTYyLjYyMiAyMTguMTI1SDE2My44NzJIMTY1LjEyMlYyMTUuMjY0SDE2Ny4zMzhWMjE0LjAxNFYyMTIuNzY0SDE2NS4xMjJIMTYzLjg3MkgxNjIuNjIyVjIxNC4wMTRWMjE1LjI2NFYyMTguMTI1Wk0xNzYuNzcxIDIxMi43NjRIMTg2LjIwNFYyMTQuMDE0VjIxNS4yNjRIMTc2Ljc3MVYyMTQuMDE0VjIxMi43NjRaTTE5NS42MzcgMjE0LjAxNFYyMTIuNzY0SDIwNS4wNjlWMjE0LjAxNFYyMTUuMjY0SDE5NS42MzdWMjE0LjAxNFpNMjc0LjU2NSAzMTQuNjM3SDI3NS44MTVWMzE3LjQ5OVYzMTguNzQ5VjMxOS45OTlIMjc0LjU2NUgyNzMuMzE1SDI3MS4wOTlWMzE4Ljc0OVYzMTcuNDk5SDI3My4zMTVWMzE0LjYzN0gyNzQuNTY1Wk0yNjEuNjY2IDMxOC43NDlWMzE5Ljk5OUgyNTIuMjMzVjMxOC43NDlWMzE3LjQ5OUgyNjEuNjY2VjMxOC43NDlaTTI0Mi44IDMxOC43NDlWMzE5Ljk5OUgyMzMuMzY4VjMxOC43NDlWMzE3LjQ5OUgyNDIuOFYzMTguNzQ5Wk0yMjMuOTM1IDMxOC43NDlWMzE5Ljk5OUgyMTQuNTAyVjMxOC43NDlWMzE3LjQ5OUgyMjMuOTM1VjMxOC43NDlaTTIwNS4wNjkgMzE4Ljc0OVYzMTkuOTk5SDE5NS42MzdWMzE4Ljc0OVYzMTcuNDk5SDIwNS4wNjlWMzE4Ljc0OVpNMTg2LjIwNCAzMTguNzQ5VjMxOS45OTlIMTc2Ljc3MVYzMTguNzQ5VjMxNy40OTlIMTg2LjIwNFYzMTguNzQ5Wk0xNjcuMzM4IDMxOC43NDlWMzE5Ljk5OUgxNjUuMTIySDE2My44NzJIMTYyLjYyMlYzMTguNzQ5VjMxNy40OTlWMzE0LjYzN0gxNjMuODcySDE2NS4xMjJWMzE3LjQ5OUgxNjcuMzM4VjMxOC43NDlaTTE2My44NzIgMzAzLjkxNEgxNjIuNjIyVjI5My4xOUgxNjMuODcySDE2NS4xMjJWMzAzLjkxNEgxNjMuODcyWk0xNjMuODcyIDI4Mi40NjdIMTYyLjYyMlYyNzEuNzQzSDE2My44NzJIMTY1LjEyMlYyODIuNDY3SDE2My44NzJaTTE2My44NzIgMjYxLjAySDE2Mi42MjJWMjUwLjI5NkgxNjMuODcySDE2NS4xMjJWMjYxLjAySDE2My44NzJaTTE2My44NzIgMjM5LjU3M0gxNjIuNjIyVjIyOC44NDlIMTYzLjg3MkgxNjUuMTIyVjIzOS41NzNIMTYzLjg3MloiIGZpbGw9IiM5Nzk4OTQiLz4KPC9zdmc+Cg==",
                    "target": "_blank",
                    "width": "500px"
                  },
                  "style": {
                    "padding-bottom": "5px",
                    "padding-left": "5px",
                    "padding-right": "5px",
                    "padding-top": "5px",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-image",
                "uuid": "ebce211c-e771-4a85-ac7b-e4b40f9dc041"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068A5"
                    },
                    "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product name 1\" data-bee-value=\"$product_reco[1].name (new)$\"><q>no-content</q></code>",
                    "style": {
                      "color": "#555555",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "14px",
                      "font-weight": "500",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#E01253",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "1dff7521-11ca-4fa5-aab0-ef3ab1e7cc28"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068A5"
                    },
                    "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product description 1\" data-bee-value=\"$product_reco[1].description$\"><q>no-content</q></code>",
                    "style": {
                      "color": "#555555",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "12px",
                      "font-weight": "500",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#E01253",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "dfe9b1ee-13a2-4d64-b6b6-f917fe359874"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068A5"
                    },
                    "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product price 1\" data-bee-value=\"$product_reco[1].price$\"><q>no-content</q></code> €",
                    "style": {
                      "color": "#555555",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "13px",
                      "font-weight": "500",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#E01253",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "edd551af-b2d5-4e84-a03e-188f5612c242"
              },
              {
                "descriptor": {
                  "button": {
                    "href": "$product_reco[1].extid$",
                    "label": "<div class=\"txtTinyMce-wrapper\" style=\"\" data-mce-style=\"\"><p style=\"word-break:break-word;\" data-mce-style=\"word-break:break-word;\">product button 1</p></div>",
                    "style": {
                      "background-color": "#3AAEE0",
                      "border-bottom": "0px solid transparent",
                      "border-left": "0px solid transparent",
                      "border-radius": "4px",
                      "border-right": "0px solid transparent",
                      "border-top": "0px solid transparent",
                      "color": "#ffffff",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "14px",
                      "font-weight": "400",
                      "line-height": "200%",
                      "max-width": "100%",
                      "padding-bottom": "5px",
                      "padding-left": "15px",
                      "padding-right": "15px",
                      "padding-top": "5px",
                      "width": "auto"
                    },
                    "target": "_blank"
                  },
                  "computedStyle": {
                    "height": 38,
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false,
                    "width": 131
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px",
                    "text-align": "center"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-button",
                "uuid": "f2dfb43a-9b2c-4a6c-934c-185b8995cf4a"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "909f2b4f-557e-4aad-acc8-ae48b2fd8fd1"
          },
          {
            "grid-columns": 4,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "class": "center autowidth",
                    "hideContentOnMobile": false,
                    "width": "156.66666666666666px"
                  },
                  "image": {
                    "alt": "",
                    "dynamicSrc": "$product_reco[2].image_url$",
                    "height": "500px",
                    "href": "",
                    "prefix": "",
                    "src": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCIgdmlld0JveD0iMCAwIDUwMCA1MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjUwMCIgaGVpZ2h0PSI1MDAiIGZpbGw9IiNGM0YzRjMiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMzMS4yNTMgMjExLjY1NEwyMzUuOTc5IDE4Ni4xMjZMMjE1LjA3OSAyNjQuMTI5TDI1MS45ODkgMjQ4LjUxM0wyNzEuMzUgMjYzLjQwN0wzMjMuMTcyIDI0MS44MTVMMzMxLjI1MyAyMTEuNjU0Wk0zMDUuNzI1IDMwNi45MjhMMjc5LjgxNCAyOTkuOTg1TDMwNS44OTEgMzA2LjMwN0wzMDUuNzI1IDMwNi45MjhaTTIzNy4yNzQgMTgxLjI5NkwyMzIuNDQ0IDE4MC4wMDJMMjMxLjE1IDE4NC44MzJMMjA1LjYyMSAyODAuMTA2TDIwNC4zMjcgMjg0LjkzNUwyMDkuMTU3IDI4Ni4yMjlMMzA0LjQzMSAzMTEuNzU4TDMwOS4yNiAzMTMuMDUyTDMxMC41NTQgMzA4LjIyMkwzMzYuMDgzIDIxMi45NDhMMzM3LjM3NyAyMDguMTE5TDMzMi41NDggMjA2LjgyNUwyMzcuMjc0IDE4MS4yOTZaTTI1OS40MzUgMjM2LjU5NUMyNjYuODM4IDIzNi41OTUgMjcyLjgzOSAyMzAuNTk0IDI3Mi44MzkgMjIzLjE5MUMyNzIuODM5IDIxNS43ODggMjY2LjgzOCAyMDkuNzg2IDI1OS40MzUgMjA5Ljc4NkMyNTIuMDMyIDIwOS43ODYgMjQ2LjAzIDIxNS43ODggMjQ2LjAzIDIyMy4xOTFDMjQ2LjAzIDIzMC41OTQgMjUyLjAzMiAyMzYuNTk1IDI1OS40MzUgMjM2LjU5NVoiIGZpbGw9IiM5Nzk4OTQiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIxNy42MDQgMjEyLjc2NEgyMTQuNTAyVjIxNC4wMTRWMjE1LjI2NEgyMTYuOTM0TDIxNy42MDQgMjEyLjc2NFpNMTYyLjYyMiAyMTguMTI1SDE2My44NzJIMTY1LjEyMlYyMTUuMjY0SDE2Ny4zMzhWMjE0LjAxNFYyMTIuNzY0SDE2NS4xMjJIMTYzLjg3MkgxNjIuNjIyVjIxNC4wMTRWMjE1LjI2NFYyMTguMTI1Wk0xNzYuNzcxIDIxMi43NjRIMTg2LjIwNFYyMTQuMDE0VjIxNS4yNjRIMTc2Ljc3MVYyMTQuMDE0VjIxMi43NjRaTTE5NS42MzcgMjE0LjAxNFYyMTIuNzY0SDIwNS4wNjlWMjE0LjAxNFYyMTUuMjY0SDE5NS42MzdWMjE0LjAxNFpNMjc0LjU2NSAzMTQuNjM3SDI3NS44MTVWMzE3LjQ5OVYzMTguNzQ5VjMxOS45OTlIMjc0LjU2NUgyNzMuMzE1SDI3MS4wOTlWMzE4Ljc0OVYzMTcuNDk5SDI3My4zMTVWMzE0LjYzN0gyNzQuNTY1Wk0yNjEuNjY2IDMxOC43NDlWMzE5Ljk5OUgyNTIuMjMzVjMxOC43NDlWMzE3LjQ5OUgyNjEuNjY2VjMxOC43NDlaTTI0Mi44IDMxOC43NDlWMzE5Ljk5OUgyMzMuMzY4VjMxOC43NDlWMzE3LjQ5OUgyNDIuOFYzMTguNzQ5Wk0yMjMuOTM1IDMxOC43NDlWMzE5Ljk5OUgyMTQuNTAyVjMxOC43NDlWMzE3LjQ5OUgyMjMuOTM1VjMxOC43NDlaTTIwNS4wNjkgMzE4Ljc0OVYzMTkuOTk5SDE5NS42MzdWMzE4Ljc0OVYzMTcuNDk5SDIwNS4wNjlWMzE4Ljc0OVpNMTg2LjIwNCAzMTguNzQ5VjMxOS45OTlIMTc2Ljc3MVYzMTguNzQ5VjMxNy40OTlIMTg2LjIwNFYzMTguNzQ5Wk0xNjcuMzM4IDMxOC43NDlWMzE5Ljk5OUgxNjUuMTIySDE2My44NzJIMTYyLjYyMlYzMTguNzQ5VjMxNy40OTlWMzE0LjYzN0gxNjMuODcySDE2NS4xMjJWMzE3LjQ5OUgxNjcuMzM4VjMxOC43NDlaTTE2My44NzIgMzAzLjkxNEgxNjIuNjIyVjI5My4xOUgxNjMuODcySDE2NS4xMjJWMzAzLjkxNEgxNjMuODcyWk0xNjMuODcyIDI4Mi40NjdIMTYyLjYyMlYyNzEuNzQzSDE2My44NzJIMTY1LjEyMlYyODIuNDY3SDE2My44NzJaTTE2My44NzIgMjYxLjAySDE2Mi42MjJWMjUwLjI5NkgxNjMuODcySDE2NS4xMjJWMjYxLjAySDE2My44NzJaTTE2My44NzIgMjM5LjU3M0gxNjIuNjIyVjIyOC44NDlIMTYzLjg3MkgxNjUuMTIyVjIzOS41NzNIMTYzLjg3MloiIGZpbGw9IiM5Nzk4OTQiLz4KPC9zdmc+Cg==",
                    "target": "_blank",
                    "width": "500px"
                  },
                  "style": {
                    "padding-bottom": "5px",
                    "padding-left": "5px",
                    "padding-right": "5px",
                    "padding-top": "5px",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-image",
                "uuid": "1b5fa1b7-8ce8-4f67-a9e0-9b19038a788b"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068A5"
                    },
                    "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product name 2\" data-bee-value=\"$product_reco[2].name$\"><q>no-content</q></code>",
                    "style": {
                      "color": "#555555",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "14px",
                      "font-weight": "500",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#E01253",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "de22ee0a-c86e-4811-a8ed-76dd8039267b"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068A5"
                    },
                    "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product description 2\" data-bee-value=\"$product_reco[2].description$\"><q>no-content</q></code>",
                    "style": {
                      "color": "#555555",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "12px",
                      "font-weight": "500",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#E01253",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "a8f24663-e5bc-4cf4-b448-1cbc8ebf9349"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068A5"
                    },
                    "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product price 2\" data-bee-value=\"$product_reco[2].price$\"><q>no-content</q></code> €",
                    "style": {
                      "color": "#555555",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "13px",
                      "font-weight": "500",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#E01253",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "a665bd50-39d6-43f6-9148-d7ed7de1d931"
              },
              {
                "descriptor": {
                  "button": {
                    "href": "$product_reco[2].extid$",
                    "label": "<div class=\"txtTinyMce-wrapper\" style=\"\" data-mce-style=\"\"><p style=\"word-break:break-word;\" data-mce-style=\"word-break:break-word;\">product button 2</p></div>",
                    "style": {
                      "background-color": "#3AAEE0",
                      "border-bottom": "0px solid transparent",
                      "border-left": "0px solid transparent",
                      "border-radius": "4px",
                      "border-right": "0px solid transparent",
                      "border-top": "0px solid transparent",
                      "color": "#ffffff",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "14px",
                      "font-weight": "400",
                      "line-height": "200%",
                      "max-width": "100%",
                      "padding-bottom": "5px",
                      "padding-left": "15px",
                      "padding-right": "15px",
                      "padding-top": "5px",
                      "width": "auto"
                    },
                    "target": "_blank"
                  },
                  "computedStyle": {
                    "height": 38,
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false,
                    "width": 131
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px",
                    "text-align": "center"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-button",
                "uuid": "f1c7e4e9-e11f-4be5-99c6-a36ee56378ce"
              },
              {
                "type": "mailup-bee-newsletter-modules-button",
                "descriptor": {
                  "button": {
                    "label": "<div class=\"txtTinyMce-wrapper\"><p style='font-family: inherit;'>Button</p></div>",
                    "href": "",
                    "target": "_blank",
                    "style": {
                      "font-family": "inherit",
                      "font-size": "14px",
                      "font-weight": "400",
                      "background-color": "#3AAEE0",
                      "border-radius": "4px",
                      "border-top": "0px solid transparent",
                      "border-right": "0px solid transparent",
                      "border-bottom": "0px solid transparent",
                      "border-left": "0px solid transparent",
                      "color": "#ffffff",
                      "line-height": "200%",
                      "padding-top": "5px",
                      "padding-right": "20px",
                      "padding-bottom": "5px",
                      "padding-left": "20px",
                      "width": "auto",
                      "max-width": "100%",
                      "direction": "ltr"
                    }
                  },
                  "style": {
                    "text-align": "center",
                    "padding-top": "10px",
                    "padding-right": "10px",
                    "padding-bottom": "10px",
                    "padding-left": "10px"
                  },
                  "mobileStyle": {},
                  "computedStyle": {
                    "width": 52,
                    "height": 42,
                    "hideContentOnMobile": false
                  }
                },
                "uuid": "974e36a4-dd64-43ac-a6d2-ddbe74120e13",
                "locked": false
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "e2982735-0bbc-473d-b2f3-ae2f70f1e14e"
          },
          {
            "grid-columns": 4,
            "modules": [
              {
                "descriptor": {
                  "computedStyle": {
                    "class": "center autowidth",
                    "hideContentOnMobile": false,
                    "width": "156.66666666666666px"
                  },
                  "image": {
                    "alt": "",
                    "dynamicSrc": "$product_reco[3].image_url$",
                    "height": "500px",
                    "href": "",
                    "prefix": "",
                    "src": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCIgdmlld0JveD0iMCAwIDUwMCA1MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjUwMCIgaGVpZ2h0PSI1MDAiIGZpbGw9IiNGM0YzRjMiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMzMS4yNTMgMjExLjY1NEwyMzUuOTc5IDE4Ni4xMjZMMjE1LjA3OSAyNjQuMTI5TDI1MS45ODkgMjQ4LjUxM0wyNzEuMzUgMjYzLjQwN0wzMjMuMTcyIDI0MS44MTVMMzMxLjI1MyAyMTEuNjU0Wk0zMDUuNzI1IDMwNi45MjhMMjc5LjgxNCAyOTkuOTg1TDMwNS44OTEgMzA2LjMwN0wzMDUuNzI1IDMwNi45MjhaTTIzNy4yNzQgMTgxLjI5NkwyMzIuNDQ0IDE4MC4wMDJMMjMxLjE1IDE4NC44MzJMMjA1LjYyMSAyODAuMTA2TDIwNC4zMjcgMjg0LjkzNUwyMDkuMTU3IDI4Ni4yMjlMMzA0LjQzMSAzMTEuNzU4TDMwOS4yNiAzMTMuMDUyTDMxMC41NTQgMzA4LjIyMkwzMzYuMDgzIDIxMi45NDhMMzM3LjM3NyAyMDguMTE5TDMzMi41NDggMjA2LjgyNUwyMzcuMjc0IDE4MS4yOTZaTTI1OS40MzUgMjM2LjU5NUMyNjYuODM4IDIzNi41OTUgMjcyLjgzOSAyMzAuNTk0IDI3Mi44MzkgMjIzLjE5MUMyNzIuODM5IDIxNS43ODggMjY2LjgzOCAyMDkuNzg2IDI1OS40MzUgMjA5Ljc4NkMyNTIuMDMyIDIwOS43ODYgMjQ2LjAzIDIxNS43ODggMjQ2LjAzIDIyMy4xOTFDMjQ2LjAzIDIzMC41OTQgMjUyLjAzMiAyMzYuNTk1IDI1OS40MzUgMjM2LjU5NVoiIGZpbGw9IiM5Nzk4OTQiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIxNy42MDQgMjEyLjc2NEgyMTQuNTAyVjIxNC4wMTRWMjE1LjI2NEgyMTYuOTM0TDIxNy42MDQgMjEyLjc2NFpNMTYyLjYyMiAyMTguMTI1SDE2My44NzJIMTY1LjEyMlYyMTUuMjY0SDE2Ny4zMzhWMjE0LjAxNFYyMTIuNzY0SDE2NS4xMjJIMTYzLjg3MkgxNjIuNjIyVjIxNC4wMTRWMjE1LjI2NFYyMTguMTI1Wk0xNzYuNzcxIDIxMi43NjRIMTg2LjIwNFYyMTQuMDE0VjIxNS4yNjRIMTc2Ljc3MVYyMTQuMDE0VjIxMi43NjRaTTE5NS42MzcgMjE0LjAxNFYyMTIuNzY0SDIwNS4wNjlWMjE0LjAxNFYyMTUuMjY0SDE5NS42MzdWMjE0LjAxNFpNMjc0LjU2NSAzMTQuNjM3SDI3NS44MTVWMzE3LjQ5OVYzMTguNzQ5VjMxOS45OTlIMjc0LjU2NUgyNzMuMzE1SDI3MS4wOTlWMzE4Ljc0OVYzMTcuNDk5SDI3My4zMTVWMzE0LjYzN0gyNzQuNTY1Wk0yNjEuNjY2IDMxOC43NDlWMzE5Ljk5OUgyNTIuMjMzVjMxOC43NDlWMzE3LjQ5OUgyNjEuNjY2VjMxOC43NDlaTTI0Mi44IDMxOC43NDlWMzE5Ljk5OUgyMzMuMzY4VjMxOC43NDlWMzE3LjQ5OUgyNDIuOFYzMTguNzQ5Wk0yMjMuOTM1IDMxOC43NDlWMzE5Ljk5OUgyMTQuNTAyVjMxOC43NDlWMzE3LjQ5OUgyMjMuOTM1VjMxOC43NDlaTTIwNS4wNjkgMzE4Ljc0OVYzMTkuOTk5SDE5NS42MzdWMzE4Ljc0OVYzMTcuNDk5SDIwNS4wNjlWMzE4Ljc0OVpNMTg2LjIwNCAzMTguNzQ5VjMxOS45OTlIMTc2Ljc3MVYzMTguNzQ5VjMxNy40OTlIMTg2LjIwNFYzMTguNzQ5Wk0xNjcuMzM4IDMxOC43NDlWMzE5Ljk5OUgxNjUuMTIySDE2My44NzJIMTYyLjYyMlYzMTguNzQ5VjMxNy40OTlWMzE0LjYzN0gxNjMuODcySDE2NS4xMjJWMzE3LjQ5OUgxNjcuMzM4VjMxOC43NDlaTTE2My44NzIgMzAzLjkxNEgxNjIuNjIyVjI5My4xOUgxNjMuODcySDE2NS4xMjJWMzAzLjkxNEgxNjMuODcyWk0xNjMuODcyIDI4Mi40NjdIMTYyLjYyMlYyNzEuNzQzSDE2My44NzJIMTY1LjEyMlYyODIuNDY3SDE2My44NzJaTTE2My44NzIgMjYxLjAySDE2Mi42MjJWMjUwLjI5NkgxNjMuODcySDE2NS4xMjJWMjYxLjAySDE2My44NzJaTTE2My44NzIgMjM5LjU3M0gxNjIuNjIyVjIyOC44NDlIMTYzLjg3MkgxNjUuMTIyVjIzOS41NzNIMTYzLjg3MloiIGZpbGw9IiM5Nzk4OTQiLz4KPC9zdmc+Cg==",
                    "target": "_blank",
                    "width": "500px"
                  },
                  "style": {
                    "padding-bottom": "5px",
                    "padding-left": "5px",
                    "padding-right": "5px",
                    "padding-top": "5px",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-image",
                "uuid": "0be65661-f596-4dc8-afa2-f886d64439b2"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068A5"
                    },
                    "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product name 3\" data-bee-value=\"$product_reco[3].name$\"><q>no-content</q></code>",
                    "style": {
                      "color": "#555555",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "14px",
                      "font-weight": "500",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#E01253",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "23c9c3b8-ce5c-48e1-8491-90a982799c35"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068A5"
                    },
                    "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product description 3\" data-bee-value=\"$product_reco[3].description$\"><q>no-content</q></code>",
                    "style": {
                      "color": "#555555",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "12px",
                      "font-weight": "500",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#E01253",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "e4a351b9-cf06-4040-8db0-31202ec9e37c"
              },
              {
                "descriptor": {
                  "computedStyle": {
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false
                  },
                  "paragraph": {
                    "computedStyle": {
                      "linkColor": "#0068A5"
                    },
                    "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product price 3\" data-bee-value=\"$product_reco[3].price$\"><q>no-content</q></code> €",
                    "style": {
                      "color": "#555555",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "13px",
                      "font-weight": "500",
                      "letter-spacing": "0px",
                      "line-height": "120%",
                      "link-color": "#E01253",
                      "text-align": "center"
                    }
                  },
                  "style": {
                    "padding-bottom": "0px",
                    "padding-left": "0px",
                    "padding-right": "0px",
                    "padding-top": "0px",
                    "text-align": "center",
                    "width": "100%"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-paragraph",
                "uuid": "131bac4a-4396-4559-819c-688abbb571cb"
              },
              {
                "descriptor": {
                  "button": {
                    "href": "$product_reco[3].extid$",
                    "label": "<div class=\"txtTinyMce-wrapper\" style=\"\" data-mce-style=\"\"><p style=\"word-break:break-word;\" data-mce-style=\"word-break:break-word;\">product button 3</p></div>",
                    "style": {
                      "background-color": "#3AAEE0",
                      "border-bottom": "0px solid transparent",
                      "border-left": "0px solid transparent",
                      "border-radius": "4px",
                      "border-right": "0px solid transparent",
                      "border-top": "0px solid transparent",
                      "color": "#ffffff",
                      "direction": "ltr",
                      "font-family": "inherit",
                      "font-size": "14px",
                      "font-weight": "400",
                      "line-height": "200%",
                      "max-width": "100%",
                      "padding-bottom": "5px",
                      "padding-left": "15px",
                      "padding-right": "15px",
                      "padding-top": "5px",
                      "width": "auto"
                    },
                    "target": "_blank"
                  },
                  "computedStyle": {
                    "height": 38,
                    "hideContentOnDesktop": false,
                    "hideContentOnMobile": false,
                    "width": 131
                  },
                  "style": {
                    "padding-bottom": "10px",
                    "padding-left": "10px",
                    "padding-right": "10px",
                    "padding-top": "10px",
                    "text-align": "center"
                  }
                },
                "locked": false,
                "type": "mailup-bee-newsletter-modules-button",
                "uuid": "264812f2-d487-4d1c-baab-554921508b56"
              }
            ],
            "style": {
              "background-color": "transparent",
              "border-bottom": "0px solid transparent",
              "border-left": "0px solid transparent",
              "border-right": "0px solid transparent",
              "border-top": "0px solid transparent",
              "padding-bottom": "5px",
              "padding-left": "0px",
              "padding-right": "0px",
              "padding-top": "5px"
            },
            "uuid": "2bfe2efe-af8f-43cf-9b6a-b6003a85f937"
          }
        ],
        "container": {
          "displayCondition": {
            "after": "{ SPLIO ENDPRODUCT_RECO }",
            "before": "{ SPLIO PRODUCT_RECO 4 }",
            "description": "desc product reco 4",
            "label": "product reco 4",
            "type": "BEE_CUSTOM_DISPLAY_CONDITION"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat"
          }
        },
        "content": {
          "computedStyle": {
            "hideContentOnDesktop": false,
            "hideContentOnMobile": false,
            "rowColStackOnMobile": true,
            "rowReverseColStackOnMobile": false,
            "verticalAlign": "top"
          },
          "style": {
            "background-color": "transparent",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "color": "#000000",
            "width": "500px"
          }
        },
        "empty": false,
        "locked": false,
        "metadata": {
          "name": "ProductReco NEW 2",
          "uid": "508824c4-8d45-11ee-84be-aafd6b2aca16"
        },
        "synced": true,
        "type": "",
        "uuid": "8b547e1e-2b19-46af-a86d-3dc0cb3d3893"
      }
    }
  ],
  "source": {
    "page": {
      "body": {
        "container": {
          "style": {
            "background-color": "#FFFFFF"
          }
        },
        "content": {
          "computedStyle": {
            "linkColor": "#0068A5",
            "messageBackgroundColor": "transparent",
            "messageWidth": "500px"
          },
          "style": {
            "color": "#000000",
            "font-family": "Arial, 'Helvetica Neue', Helvetica, sans-serif"
          }
        },
        "type": "mailup-bee-page-properties",
        "webFonts": []
      },
      "description": "",
      "rows": [
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "type": "mailup-bee-newsletter-modules-heading",
                  "descriptor": {
                    "heading": {
                      "title": "h1",
                      "text": "<span class=\"tinyMce-placeholder\">ProductRecoOne</span>",
                      "style": {
                        "color": "#555555",
                        "font-size": "23px",
                        "font-family": "inherit",
                        "link-color": "#E01253",
                        "line-height": "120%",
                        "text-align": "center",
                        "direction": "ltr",
                        "font-weight": "700",
                        "letter-spacing": "0px"
                      }
                    },
                    "style": {
                      "width": "100%",
                      "text-align": "center",
                      "padding-top": "0px",
                      "padding-right": "0px",
                      "padding-bottom": "0px",
                      "padding-left": "0px"
                    },
                    "mobileStyle": {},
                    "computedStyle": {
                      "width": 52,
                      "height": 42
                    }
                  },
                  "uuid": "ba1fd29b-4e18-4a69-a708-9755a2da87d5",
                  "locked": false
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px dotted transparent",
                "border-left": "0px dotted transparent",
                "border-right": "0px dotted transparent",
                "border-top": "0px dotted transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "56978ed0-79cd-494f-8c72-b6f9470c5ef3"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "500px"
            }
          },
          "empty": false,
          "locked": false,
          "synced": false,
          "type": "one-column-empty",
          "uuid": "a0a410e4-3b14-4a41-98ba-fe6a355b79fa"
        },
        {
          "columns": [
            {
              "uuid": "736d2504-9d0d-485f-87c9-d1ff3dfd1588",
              "grid-columns": 4,
              "modules": [
                {
                  "uuid": "60650bb5-c0f5-449f-bfa0-2ffc25a7b04a",
                  "descriptor": {
                    "computedStyle": {
                      "class": "center autowidth",
                      "hideContentOnMobile": false,
                      "width": "156.66666666666666px"
                    },
                    "image": {
                      "alt": "",
                      "dynamicSrc": "$product_reco[1].image_url$",
                      "href": "",
                      "src": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCIgdmlld0JveD0iMCAwIDUwMCA1MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjUwMCIgaGVpZ2h0PSI1MDAiIGZpbGw9IiNGM0YzRjMiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMzMS4yNTMgMjExLjY1NEwyMzUuOTc5IDE4Ni4xMjZMMjE1LjA3OSAyNjQuMTI5TDI1MS45ODkgMjQ4LjUxM0wyNzEuMzUgMjYzLjQwN0wzMjMuMTcyIDI0MS44MTVMMzMxLjI1MyAyMTEuNjU0Wk0zMDUuNzI1IDMwNi45MjhMMjc5LjgxNCAyOTkuOTg1TDMwNS44OTEgMzA2LjMwN0wzMDUuNzI1IDMwNi45MjhaTTIzNy4yNzQgMTgxLjI5NkwyMzIuNDQ0IDE4MC4wMDJMMjMxLjE1IDE4NC44MzJMMjA1LjYyMSAyODAuMTA2TDIwNC4zMjcgMjg0LjkzNUwyMDkuMTU3IDI4Ni4yMjlMMzA0LjQzMSAzMTEuNzU4TDMwOS4yNiAzMTMuMDUyTDMxMC41NTQgMzA4LjIyMkwzMzYuMDgzIDIxMi45NDhMMzM3LjM3NyAyMDguMTE5TDMzMi41NDggMjA2LjgyNUwyMzcuMjc0IDE4MS4yOTZaTTI1OS40MzUgMjM2LjU5NUMyNjYuODM4IDIzNi41OTUgMjcyLjgzOSAyMzAuNTk0IDI3Mi44MzkgMjIzLjE5MUMyNzIuODM5IDIxNS43ODggMjY2LjgzOCAyMDkuNzg2IDI1OS40MzUgMjA5Ljc4NkMyNTIuMDMyIDIwOS43ODYgMjQ2LjAzIDIxNS43ODggMjQ2LjAzIDIyMy4xOTFDMjQ2LjAzIDIzMC41OTQgMjUyLjAzMiAyMzYuNTk1IDI1OS40MzUgMjM2LjU5NVoiIGZpbGw9IiM5Nzk4OTQiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIxNy42MDQgMjEyLjc2NEgyMTQuNTAyVjIxNC4wMTRWMjE1LjI2NEgyMTYuOTM0TDIxNy42MDQgMjEyLjc2NFpNMTYyLjYyMiAyMTguMTI1SDE2My44NzJIMTY1LjEyMlYyMTUuMjY0SDE2Ny4zMzhWMjE0LjAxNFYyMTIuNzY0SDE2NS4xMjJIMTYzLjg3MkgxNjIuNjIyVjIxNC4wMTRWMjE1LjI2NFYyMTguMTI1Wk0xNzYuNzcxIDIxMi43NjRIMTg2LjIwNFYyMTQuMDE0VjIxNS4yNjRIMTc2Ljc3MVYyMTQuMDE0VjIxMi43NjRaTTE5NS42MzcgMjE0LjAxNFYyMTIuNzY0SDIwNS4wNjlWMjE0LjAxNFYyMTUuMjY0SDE5NS42MzdWMjE0LjAxNFpNMjc0LjU2NSAzMTQuNjM3SDI3NS44MTVWMzE3LjQ5OVYzMTguNzQ5VjMxOS45OTlIMjc0LjU2NUgyNzMuMzE1SDI3MS4wOTlWMzE4Ljc0OVYzMTcuNDk5SDI3My4zMTVWMzE0LjYzN0gyNzQuNTY1Wk0yNjEuNjY2IDMxOC43NDlWMzE5Ljk5OUgyNTIuMjMzVjMxOC43NDlWMzE3LjQ5OUgyNjEuNjY2VjMxOC43NDlaTTI0Mi44IDMxOC43NDlWMzE5Ljk5OUgyMzMuMzY4VjMxOC43NDlWMzE3LjQ5OUgyNDIuOFYzMTguNzQ5Wk0yMjMuOTM1IDMxOC43NDlWMzE5Ljk5OUgyMTQuNTAyVjMxOC43NDlWMzE3LjQ5OUgyMjMuOTM1VjMxOC43NDlaTTIwNS4wNjkgMzE4Ljc0OVYzMTkuOTk5SDE5NS42MzdWMzE4Ljc0OVYzMTcuNDk5SDIwNS4wNjlWMzE4Ljc0OVpNMTg2LjIwNCAzMTguNzQ5VjMxOS45OTlIMTc2Ljc3MVYzMTguNzQ5VjMxNy40OTlIMTg2LjIwNFYzMTguNzQ5Wk0xNjcuMzM4IDMxOC43NDlWMzE5Ljk5OUgxNjUuMTIySDE2My44NzJIMTYyLjYyMlYzMTguNzQ5VjMxNy40OTlWMzE0LjYzN0gxNjMuODcySDE2NS4xMjJWMzE3LjQ5OUgxNjcuMzM4VjMxOC43NDlaTTE2My44NzIgMzAzLjkxNEgxNjIuNjIyVjI5My4xOUgxNjMuODcySDE2NS4xMjJWMzAzLjkxNEgxNjMuODcyWk0xNjMuODcyIDI4Mi40NjdIMTYyLjYyMlYyNzEuNzQzSDE2My44NzJIMTY1LjEyMlYyODIuNDY3SDE2My44NzJaTTE2My44NzIgMjYxLjAySDE2Mi42MjJWMjUwLjI5NkgxNjMuODcySDE2NS4xMjJWMjYxLjAySDE2My44NzJaTTE2My44NzIgMjM5LjU3M0gxNjIuNjIyVjIyOC44NDlIMTYzLjg3MkgxNjUuMTIyVjIzOS41NzNIMTYzLjg3MloiIGZpbGw9IiM5Nzk4OTQiLz4KPC9zdmc+Cg==",
                      "target": "_blank",
                      "width": "500px",
                      "height": "500px"
                    },
                    "mobileStyle": [],
                    "style": {
                      "padding-bottom": "5px",
                      "padding-left": "5px",
                      "padding-right": "5px",
                      "padding-top": "5px",
                      "width": "100%"
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-image",
                  "align": "left"
                },
                {
                  "uuid": "f3fd437e-0ecc-4585-81b0-db39d9b260f5",
                  "descriptor": {
                    "paragraph": {
                      "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product name 1\" data-bee-value=\"$product_reco[1].name$\"><q>no-content</q></code>",
                      "style": {
                        "color": "#555555",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "14px",
                        "font-weight": "500",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "link-color": "#E01253",
                        "text-align": "center"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px",
                      "text-align": "center",
                      "width": "100%"
                    },
                    "computedStyle": {
                      "rowColStackOnMobile": true,
                      "rowReverseColStackOnMobile": false,
                      "verticalAlign": "top",
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "align": "left"
                },
                {
                  "uuid": "125f536f-46b7-4cdf-8a59-25168357387e",
                  "descriptor": {
                    "paragraph": {
                      "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product description 1\" data-bee-value=\"$product_reco[1].description$\"><q>no-content</q></code>",
                      "style": {
                        "color": "#555555",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "12px",
                        "font-weight": "500",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "link-color": "#E01253",
                        "text-align": "center"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px",
                      "text-align": "center",
                      "width": "100%"
                    },
                    "computedStyle": {
                      "rowColStackOnMobile": true,
                      "rowReverseColStackOnMobile": false,
                      "verticalAlign": "top",
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "align": "left"
                },
                {
                  "uuid": "2d35f73e-20f2-4d20-a2af-55c3b3bd8186",
                  "descriptor": {
                    "paragraph": {
                      "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product price 1\" data-bee-value=\"$product_reco[1].price$\"><q>no-content</q></code> €",
                      "style": {
                        "color": "#555555",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "13px",
                        "font-weight": "500",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "link-color": "#E01253",
                        "text-align": "center"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px",
                      "text-align": "center",
                      "width": "100%"
                    },
                    "computedStyle": {
                      "rowColStackOnMobile": true,
                      "rowReverseColStackOnMobile": false,
                      "verticalAlign": "top",
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "align": "left"
                },
                {
                  "uuid": "810f6968-7aaf-4b20-b892-9407cacd73e0",
                  "descriptor": {
                    "button": {
                      "href": "$product_reco[1].extid$",
                      "label": "<div class=\"txtTinyMce-wrapper\" style=\"\" data-mce-style=\"\">product button 1</div>",
                      "style": {
                        "background-color": "#3AAEE0",
                        "border-bottom": "0px solid transparent",
                        "border-left": "0px solid transparent",
                        "border-radius": "4px",
                        "border-right": "0px solid transparent",
                        "border-top": "0px solid transparent",
                        "color": "#ffffff",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "14px",
                        "font-weight": "400",
                        "line-height": "200%",
                        "max-width": "100%",
                        "padding-bottom": "5px",
                        "padding-left": "15px",
                        "padding-right": "15px",
                        "padding-top": "5px",
                        "width": "auto"
                      },
                      "target": "_blank"
                    },
                    "computedStyle": {
                      "rowColStackOnMobile": true,
                      "rowReverseColStackOnMobile": false,
                      "verticalAlign": "top",
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false
                    },
                    "mobileStyle": [],
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px",
                      "text-align": "center"
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-button",
                  "align": "left"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              }
            },
            {
              "uuid": "8324c1fb-8485-4429-9ffe-8cd656bbaef2",
              "grid-columns": 4,
              "modules": [
                {
                  "uuid": "e866a16b-56ee-43c1-bfce-9a10a7f6a3fd",
                  "descriptor": {
                    "computedStyle": {
                      "class": "center autowidth",
                      "hideContentOnMobile": false,
                      "width": "156.66666666666666px"
                    },
                    "image": {
                      "alt": "",
                      "dynamicSrc": "$product_reco[2].image_url$",
                      "href": "",
                      "src": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCIgdmlld0JveD0iMCAwIDUwMCA1MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjUwMCIgaGVpZ2h0PSI1MDAiIGZpbGw9IiNGM0YzRjMiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMzMS4yNTMgMjExLjY1NEwyMzUuOTc5IDE4Ni4xMjZMMjE1LjA3OSAyNjQuMTI5TDI1MS45ODkgMjQ4LjUxM0wyNzEuMzUgMjYzLjQwN0wzMjMuMTcyIDI0MS44MTVMMzMxLjI1MyAyMTEuNjU0Wk0zMDUuNzI1IDMwNi45MjhMMjc5LjgxNCAyOTkuOTg1TDMwNS44OTEgMzA2LjMwN0wzMDUuNzI1IDMwNi45MjhaTTIzNy4yNzQgMTgxLjI5NkwyMzIuNDQ0IDE4MC4wMDJMMjMxLjE1IDE4NC44MzJMMjA1LjYyMSAyODAuMTA2TDIwNC4zMjcgMjg0LjkzNUwyMDkuMTU3IDI4Ni4yMjlMMzA0LjQzMSAzMTEuNzU4TDMwOS4yNiAzMTMuMDUyTDMxMC41NTQgMzA4LjIyMkwzMzYuMDgzIDIxMi45NDhMMzM3LjM3NyAyMDguMTE5TDMzMi41NDggMjA2LjgyNUwyMzcuMjc0IDE4MS4yOTZaTTI1OS40MzUgMjM2LjU5NUMyNjYuODM4IDIzNi41OTUgMjcyLjgzOSAyMzAuNTk0IDI3Mi44MzkgMjIzLjE5MUMyNzIuODM5IDIxNS43ODggMjY2LjgzOCAyMDkuNzg2IDI1OS40MzUgMjA5Ljc4NkMyNTIuMDMyIDIwOS43ODYgMjQ2LjAzIDIxNS43ODggMjQ2LjAzIDIyMy4xOTFDMjQ2LjAzIDIzMC41OTQgMjUyLjAzMiAyMzYuNTk1IDI1OS40MzUgMjM2LjU5NVoiIGZpbGw9IiM5Nzk4OTQiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIxNy42MDQgMjEyLjc2NEgyMTQuNTAyVjIxNC4wMTRWMjE1LjI2NEgyMTYuOTM0TDIxNy42MDQgMjEyLjc2NFpNMTYyLjYyMiAyMTguMTI1SDE2My44NzJIMTY1LjEyMlYyMTUuMjY0SDE2Ny4zMzhWMjE0LjAxNFYyMTIuNzY0SDE2NS4xMjJIMTYzLjg3MkgxNjIuNjIyVjIxNC4wMTRWMjE1LjI2NFYyMTguMTI1Wk0xNzYuNzcxIDIxMi43NjRIMTg2LjIwNFYyMTQuMDE0VjIxNS4yNjRIMTc2Ljc3MVYyMTQuMDE0VjIxMi43NjRaTTE5NS42MzcgMjE0LjAxNFYyMTIuNzY0SDIwNS4wNjlWMjE0LjAxNFYyMTUuMjY0SDE5NS42MzdWMjE0LjAxNFpNMjc0LjU2NSAzMTQuNjM3SDI3NS44MTVWMzE3LjQ5OVYzMTguNzQ5VjMxOS45OTlIMjc0LjU2NUgyNzMuMzE1SDI3MS4wOTlWMzE4Ljc0OVYzMTcuNDk5SDI3My4zMTVWMzE0LjYzN0gyNzQuNTY1Wk0yNjEuNjY2IDMxOC43NDlWMzE5Ljk5OUgyNTIuMjMzVjMxOC43NDlWMzE3LjQ5OUgyNjEuNjY2VjMxOC43NDlaTTI0Mi44IDMxOC43NDlWMzE5Ljk5OUgyMzMuMzY4VjMxOC43NDlWMzE3LjQ5OUgyNDIuOFYzMTguNzQ5Wk0yMjMuOTM1IDMxOC43NDlWMzE5Ljk5OUgyMTQuNTAyVjMxOC43NDlWMzE3LjQ5OUgyMjMuOTM1VjMxOC43NDlaTTIwNS4wNjkgMzE4Ljc0OVYzMTkuOTk5SDE5NS42MzdWMzE4Ljc0OVYzMTcuNDk5SDIwNS4wNjlWMzE4Ljc0OVpNMTg2LjIwNCAzMTguNzQ5VjMxOS45OTlIMTc2Ljc3MVYzMTguNzQ5VjMxNy40OTlIMTg2LjIwNFYzMTguNzQ5Wk0xNjcuMzM4IDMxOC43NDlWMzE5Ljk5OUgxNjUuMTIySDE2My44NzJIMTYyLjYyMlYzMTguNzQ5VjMxNy40OTlWMzE0LjYzN0gxNjMuODcySDE2NS4xMjJWMzE3LjQ5OUgxNjcuMzM4VjMxOC43NDlaTTE2My44NzIgMzAzLjkxNEgxNjIuNjIyVjI5My4xOUgxNjMuODcySDE2NS4xMjJWMzAzLjkxNEgxNjMuODcyWk0xNjMuODcyIDI4Mi40NjdIMTYyLjYyMlYyNzEuNzQzSDE2My44NzJIMTY1LjEyMlYyODIuNDY3SDE2My44NzJaTTE2My44NzIgMjYxLjAySDE2Mi42MjJWMjUwLjI5NkgxNjMuODcySDE2NS4xMjJWMjYxLjAySDE2My44NzJaTTE2My44NzIgMjM5LjU3M0gxNjIuNjIyVjIyOC44NDlIMTYzLjg3MkgxNjUuMTIyVjIzOS41NzNIMTYzLjg3MloiIGZpbGw9IiM5Nzk4OTQiLz4KPC9zdmc+Cg==",
                      "target": "_blank",
                      "width": "500px",
                      "height": "500px"
                    },
                    "mobileStyle": [],
                    "style": {
                      "padding-bottom": "5px",
                      "padding-left": "5px",
                      "padding-right": "5px",
                      "padding-top": "5px",
                      "width": "100%"
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-image",
                  "align": "left"
                },
                {
                  "uuid": "7b070eae-4b65-46e2-8b9b-4449b36edeaa",
                  "descriptor": {
                    "paragraph": {
                      "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product name 2\" data-bee-value=\"$product_reco[2].name$\"><q>no-content</q></code>",
                      "style": {
                        "color": "#555555",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "14px",
                        "font-weight": "500",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "link-color": "#E01253",
                        "text-align": "center"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px",
                      "text-align": "center",
                      "width": "100%"
                    },
                    "computedStyle": {
                      "rowColStackOnMobile": true,
                      "rowReverseColStackOnMobile": false,
                      "verticalAlign": "top",
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "align": "left"
                },
                {
                  "uuid": "f133b5f7-cc70-4ac2-aa43-6e504ac52bc2",
                  "descriptor": {
                    "paragraph": {
                      "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product description 2\" data-bee-value=\"$product_reco[2].description$\"><q>no-content</q></code>",
                      "style": {
                        "color": "#555555",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "12px",
                        "font-weight": "500",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "link-color": "#E01253",
                        "text-align": "center"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px",
                      "text-align": "center",
                      "width": "100%"
                    },
                    "computedStyle": {
                      "rowColStackOnMobile": true,
                      "rowReverseColStackOnMobile": false,
                      "verticalAlign": "top",
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "align": "left"
                },
                {
                  "uuid": "2cb7b14a-29f5-4f9c-8068-7b9dd4090ce4",
                  "descriptor": {
                    "paragraph": {
                      "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product price 2\" data-bee-value=\"$product_reco[2].price$\"><q>no-content</q></code> €",
                      "style": {
                        "color": "#555555",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "13px",
                        "font-weight": "500",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "link-color": "#E01253",
                        "text-align": "center"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px",
                      "text-align": "center",
                      "width": "100%"
                    },
                    "computedStyle": {
                      "rowColStackOnMobile": true,
                      "rowReverseColStackOnMobile": false,
                      "verticalAlign": "top",
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "align": "left"
                },
                {
                  "uuid": "12bc82a2-b6be-4be5-aa83-f4434eb11344",
                  "descriptor": {
                    "button": {
                      "href": "$product_reco[2].extid$",
                      "label": "<div class=\"txtTinyMce-wrapper\" style=\"\" data-mce-style=\"\">product button 2</div>",
                      "style": {
                        "background-color": "#3AAEE0",
                        "border-bottom": "0px solid transparent",
                        "border-left": "0px solid transparent",
                        "border-radius": "4px",
                        "border-right": "0px solid transparent",
                        "border-top": "0px solid transparent",
                        "color": "#ffffff",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "14px",
                        "font-weight": "400",
                        "line-height": "200%",
                        "max-width": "100%",
                        "padding-bottom": "5px",
                        "padding-left": "15px",
                        "padding-right": "15px",
                        "padding-top": "5px",
                        "width": "auto"
                      },
                      "target": "_blank"
                    },
                    "computedStyle": {
                      "rowColStackOnMobile": true,
                      "rowReverseColStackOnMobile": false,
                      "verticalAlign": "top",
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false
                    },
                    "mobileStyle": [],
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px",
                      "text-align": "center"
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-button",
                  "align": "left"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              }
            },
            {
              "uuid": "54be4f34-5d62-4779-adcb-4762d2e42161",
              "grid-columns": 4,
              "modules": [
                {
                  "uuid": "2b07c014-bd37-47e2-b3cf-594c1dc61969",
                  "descriptor": {
                    "computedStyle": {
                      "class": "center autowidth",
                      "hideContentOnMobile": false,
                      "width": "156.66666666666666px"
                    },
                    "image": {
                      "alt": "",
                      "dynamicSrc": "$product_reco[3].image_url$",
                      "href": "",
                      "src": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAwIiBoZWlnaHQ9IjUwMCIgdmlld0JveD0iMCAwIDUwMCA1MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPHJlY3Qgd2lkdGg9IjUwMCIgaGVpZ2h0PSI1MDAiIGZpbGw9IiNGM0YzRjMiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMzMS4yNTMgMjExLjY1NEwyMzUuOTc5IDE4Ni4xMjZMMjE1LjA3OSAyNjQuMTI5TDI1MS45ODkgMjQ4LjUxM0wyNzEuMzUgMjYzLjQwN0wzMjMuMTcyIDI0MS44MTVMMzMxLjI1MyAyMTEuNjU0Wk0zMDUuNzI1IDMwNi45MjhMMjc5LjgxNCAyOTkuOTg1TDMwNS44OTEgMzA2LjMwN0wzMDUuNzI1IDMwNi45MjhaTTIzNy4yNzQgMTgxLjI5NkwyMzIuNDQ0IDE4MC4wMDJMMjMxLjE1IDE4NC44MzJMMjA1LjYyMSAyODAuMTA2TDIwNC4zMjcgMjg0LjkzNUwyMDkuMTU3IDI4Ni4yMjlMMzA0LjQzMSAzMTEuNzU4TDMwOS4yNiAzMTMuMDUyTDMxMC41NTQgMzA4LjIyMkwzMzYuMDgzIDIxMi45NDhMMzM3LjM3NyAyMDguMTE5TDMzMi41NDggMjA2LjgyNUwyMzcuMjc0IDE4MS4yOTZaTTI1OS40MzUgMjM2LjU5NUMyNjYuODM4IDIzNi41OTUgMjcyLjgzOSAyMzAuNTk0IDI3Mi44MzkgMjIzLjE5MUMyNzIuODM5IDIxNS43ODggMjY2LjgzOCAyMDkuNzg2IDI1OS40MzUgMjA5Ljc4NkMyNTIuMDMyIDIwOS43ODYgMjQ2LjAzIDIxNS43ODggMjQ2LjAzIDIyMy4xOTFDMjQ2LjAzIDIzMC41OTQgMjUyLjAzMiAyMzYuNTk1IDI1OS40MzUgMjM2LjU5NVoiIGZpbGw9IiM5Nzk4OTQiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIxNy42MDQgMjEyLjc2NEgyMTQuNTAyVjIxNC4wMTRWMjE1LjI2NEgyMTYuOTM0TDIxNy42MDQgMjEyLjc2NFpNMTYyLjYyMiAyMTguMTI1SDE2My44NzJIMTY1LjEyMlYyMTUuMjY0SDE2Ny4zMzhWMjE0LjAxNFYyMTIuNzY0SDE2NS4xMjJIMTYzLjg3MkgxNjIuNjIyVjIxNC4wMTRWMjE1LjI2NFYyMTguMTI1Wk0xNzYuNzcxIDIxMi43NjRIMTg2LjIwNFYyMTQuMDE0VjIxNS4yNjRIMTc2Ljc3MVYyMTQuMDE0VjIxMi43NjRaTTE5NS42MzcgMjE0LjAxNFYyMTIuNzY0SDIwNS4wNjlWMjE0LjAxNFYyMTUuMjY0SDE5NS42MzdWMjE0LjAxNFpNMjc0LjU2NSAzMTQuNjM3SDI3NS44MTVWMzE3LjQ5OVYzMTguNzQ5VjMxOS45OTlIMjc0LjU2NUgyNzMuMzE1SDI3MS4wOTlWMzE4Ljc0OVYzMTcuNDk5SDI3My4zMTVWMzE0LjYzN0gyNzQuNTY1Wk0yNjEuNjY2IDMxOC43NDlWMzE5Ljk5OUgyNTIuMjMzVjMxOC43NDlWMzE3LjQ5OUgyNjEuNjY2VjMxOC43NDlaTTI0Mi44IDMxOC43NDlWMzE5Ljk5OUgyMzMuMzY4VjMxOC43NDlWMzE3LjQ5OUgyNDIuOFYzMTguNzQ5Wk0yMjMuOTM1IDMxOC43NDlWMzE5Ljk5OUgyMTQuNTAyVjMxOC43NDlWMzE3LjQ5OUgyMjMuOTM1VjMxOC43NDlaTTIwNS4wNjkgMzE4Ljc0OVYzMTkuOTk5SDE5NS42MzdWMzE4Ljc0OVYzMTcuNDk5SDIwNS4wNjlWMzE4Ljc0OVpNMTg2LjIwNCAzMTguNzQ5VjMxOS45OTlIMTc2Ljc3MVYzMTguNzQ5VjMxNy40OTlIMTg2LjIwNFYzMTguNzQ5Wk0xNjcuMzM4IDMxOC43NDlWMzE5Ljk5OUgxNjUuMTIySDE2My44NzJIMTYyLjYyMlYzMTguNzQ5VjMxNy40OTlWMzE0LjYzN0gxNjMuODcySDE2NS4xMjJWMzE3LjQ5OUgxNjcuMzM4VjMxOC43NDlaTTE2My44NzIgMzAzLjkxNEgxNjIuNjIyVjI5My4xOUgxNjMuODcySDE2NS4xMjJWMzAzLjkxNEgxNjMuODcyWk0xNjMuODcyIDI4Mi40NjdIMTYyLjYyMlYyNzEuNzQzSDE2My44NzJIMTY1LjEyMlYyODIuNDY3SDE2My44NzJaTTE2My44NzIgMjYxLjAySDE2Mi42MjJWMjUwLjI5NkgxNjMuODcySDE2NS4xMjJWMjYxLjAySDE2My44NzJaTTE2My44NzIgMjM5LjU3M0gxNjIuNjIyVjIyOC44NDlIMTYzLjg3MkgxNjUuMTIyVjIzOS41NzNIMTYzLjg3MloiIGZpbGw9IiM5Nzk4OTQiLz4KPC9zdmc+Cg==",
                      "target": "_blank",
                      "width": "500px",
                      "height": "500px"
                    },
                    "mobileStyle": [],
                    "style": {
                      "padding-bottom": "5px",
                      "padding-left": "5px",
                      "padding-right": "5px",
                      "padding-top": "5px",
                      "width": "100%"
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-image",
                  "align": "left"
                },
                {
                  "uuid": "5e458b01-7574-4c5c-84a4-a62901b3b400",
                  "descriptor": {
                    "paragraph": {
                      "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product name 3\" data-bee-value=\"$product_reco[3].name$\"><q>no-content</q></code>",
                      "style": {
                        "color": "#555555",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "14px",
                        "font-weight": "500",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "link-color": "#E01253",
                        "text-align": "center"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px",
                      "text-align": "center",
                      "width": "100%"
                    },
                    "computedStyle": {
                      "rowColStackOnMobile": true,
                      "rowReverseColStackOnMobile": false,
                      "verticalAlign": "top",
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "align": "left"
                },
                {
                  "uuid": "dd60bc41-f15a-447d-92bb-d3193d7ea625",
                  "descriptor": {
                    "paragraph": {
                      "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product description 3\" data-bee-value=\"$product_reco[3].description$\"><q>no-content</q></code>",
                      "style": {
                        "color": "#555555",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "12px",
                        "font-weight": "500",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "link-color": "#E01253",
                        "text-align": "center"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px",
                      "text-align": "center",
                      "width": "100%"
                    },
                    "computedStyle": {
                      "rowColStackOnMobile": true,
                      "rowReverseColStackOnMobile": false,
                      "verticalAlign": "top",
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "align": "left"
                },
                {
                  "uuid": "9d899e18-9f54-4f19-bfe4-2cea5bc5e9dd",
                  "descriptor": {
                    "paragraph": {
                      "html": "<code spellcheck=\"false\" data-bee-type=\"mergetag\" data-bee-code=\"\" data-bee-name=\"product price 3\" data-bee-value=\"$product_reco[3].price$\"><q>no-content</q></code> €",
                      "style": {
                        "color": "#555555",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "13px",
                        "font-weight": "500",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "link-color": "#E01253",
                        "text-align": "center"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px",
                      "text-align": "center",
                      "width": "100%"
                    },
                    "computedStyle": {
                      "rowColStackOnMobile": true,
                      "rowReverseColStackOnMobile": false,
                      "verticalAlign": "top",
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "align": "left"
                },
                {
                  "uuid": "cb56d5c0-1743-458a-b19c-c5a49ca3342d",
                  "descriptor": {
                    "button": {
                      "href": "$product_reco[3].extid$",
                      "label": "<div class=\"txtTinyMce-wrapper\" style=\"\" data-mce-style=\"\">product button 3</div>",
                      "style": {
                        "background-color": "#3AAEE0",
                        "border-bottom": "0px solid transparent",
                        "border-left": "0px solid transparent",
                        "border-radius": "4px",
                        "border-right": "0px solid transparent",
                        "border-top": "0px solid transparent",
                        "color": "#ffffff",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "14px",
                        "font-weight": "400",
                        "line-height": "200%",
                        "max-width": "100%",
                        "padding-bottom": "5px",
                        "padding-left": "15px",
                        "padding-right": "15px",
                        "padding-top": "5px",
                        "width": "auto"
                      },
                      "target": "_blank"
                    },
                    "computedStyle": {
                      "rowColStackOnMobile": true,
                      "rowReverseColStackOnMobile": false,
                      "verticalAlign": "top",
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false
                    },
                    "mobileStyle": [],
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px",
                      "text-align": "center"
                    }
                  },
                  "type": "mailup-bee-newsletter-modules-button",
                  "align": "left"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              }
            }
          ],
          "type": "",
          "name": "ProductRecoOne",
          "locked": false,
          "synced": true,
          "metadata": {
            "name": "ProductRecoOne",
            "uid": "508824c4-8d45-11ee-84be-aafd6b2aca16"
          },
          "container": {
            "displayCondition": {
              "after": "{ SPLIO ENDPRODUCT_RECO }",
              "before": "{ SPLIO PRODUCT_RECO 4 }",
              "description": "desc product reco 4",
              "label": "product reco 4",
              "type": "BEE_CUSTOM_DISPLAY_CONDITION"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "500px"
            }
          },
          "uuid": "cce7dcda-25e5-47b1-aa9e-16e251c6a184"
        }
      ],
      "saveRows": true,
      "template": {
        "name": "template-base",
        "type": "basic",
        "version": "2.0.0"
      },
      "title": ""
    },
    "comments": {}
  }
}
{
  "message": "Success"
}

Merge Rows

post

Integrate custom fonts and resized images into your designs. It saves custom fonts within the template's JSON, ensuring the correct font is displayed. It also handles image resizing, particularly when the image's initial template width is narrower than the saved row's destination template.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
rowIdentifierLabelstringOptional

A string field for rowIdentifierLabel

Responses
200

Successful response

application/json
Responseobject
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/merge-rows
POST /v1/{collection}/merge-rows HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 8386

{
  "rows": [
    {
      "columns": [
        {
          "grid-columns": 12,
          "modules": [
            {
              "descriptor": {
                "computedStyle": {
                  "hideContentOnAmp": false,
                  "hideContentOnDesktop": false,
                  "hideContentOnHtml": false,
                  "hideContentOnMobile": false
                },
                "paragraph": {
                  "computedStyle": {
                    "linkColor": "#7747FF",
                    "paragraphSpacing": "16px"
                  },
                  "html": "<p>Updated paragraph block.</p>",
                  "style": {
                    "color": "#101112",
                    "direction": "ltr",
                    "font-family": "'Alegreya', 'Trebuchet MS', Helvetica, sans-serif",
                    "font-size": "16px",
                    "font-weight": "400",
                    "letter-spacing": "0px",
                    "line-height": "120%",
                    "text-align": "left"
                  }
                },
                "style": {
                  "padding-bottom": "10px",
                  "padding-left": "10px",
                  "padding-right": "10px",
                  "padding-top": "10px"
                }
              },
              "locked": false,
              "type": "mailup-bee-newsletter-modules-paragraph",
              "uuid": "29cd2a3d-fd76-4537-a91b-b8cb9872d8a3"
            },
            {
              "descriptor": {
                "computedStyle": {
                  "hideContentOnAmp": false,
                  "hideContentOnDesktop": false,
                  "hideContentOnHtml": false,
                  "hideContentOnMobile": false
                },
                "paragraph": {
                  "computedStyle": {
                    "linkColor": "#7747FF",
                    "paragraphSpacing": "16px"
                  },
                  "html": "<p>I'm a new paragraph block.</p>",
                  "style": {
                    "color": "#101112",
                    "direction": "ltr",
                    "font-family": "'Arvo', 'Courier New', Courier, monospace",
                    "font-size": "16px",
                    "font-weight": "400",
                    "letter-spacing": "0px",
                    "line-height": "120%",
                    "text-align": "left"
                  }
                },
                "style": {
                  "padding-bottom": "10px",
                  "padding-left": "10px",
                  "padding-right": "10px",
                  "padding-top": "10px"
                }
              },
              "locked": false,
              "type": "mailup-bee-newsletter-modules-paragraph",
              "uuid": "e22bd20c-805e-439a-832c-f7a100dcaaf2"
            }
          ],
          "style": {
            "background-color": "transparent",
            "border-bottom": "0px solid transparent",
            "border-left": "0px solid transparent",
            "border-right": "0px solid transparent",
            "border-top": "0px solid transparent",
            "padding-bottom": "5px",
            "padding-left": "0px",
            "padding-right": "0px",
            "padding-top": "5px"
          },
          "uuid": "56119ad2-574d-4122-8dd1-c1152b5f4879"
        }
      ],
      "container": {
        "style": {
          "background-color": "transparent",
          "background-image": "none",
          "background-position": "top left",
          "background-repeat": "no-repeat"
        }
      },
      "content": {
        "computedStyle": {
          "hideContentOnDesktop": false,
          "hideContentOnMobile": false,
          "rowColStackOnMobile": true,
          "rowReverseColStackOnMobile": false,
          "verticalAlign": "top"
        },
        "style": {
          "background-color": "transparent",
          "background-image": "none",
          "background-position": "top left",
          "background-repeat": "no-repeat",
          "color": "#000000",
          "width": "600px"
        }
      },
      "empty": false,
      "locked": false,
      "metadata": {
        "message_type": "email",
        "name": "test",
        "guid": "0922fb70-f97e-4ae8-bcfe-0be9fd09a0d5"
      },
      "synced": true,
      "type": "one-column-empty",
      "uuid": "55bd90ef-1d57-450d-adab-d97727b1db4a"
    }
  ],
  "rowIdentifierLabel": "guid",
  "template": {
    "page": {
      "body": {
        "container": {
          "style": {
            "background-color": "#ffffff"
          }
        },
        "content": {
          "computedStyle": {
            "linkColor": "#7747FF",
            "messageBackgroundColor": "transparent",
            "messageWidth": "600px"
          },
          "style": {
            "color": "#000000",
            "font-family": "Arial, Helvetica, sans-serif"
          }
        },
        "type": "mailup-bee-page-properties",
        "webFonts": [
          {
            "fontFamily": "'Alegreya', 'Trebuchet MS', Helvetica, sans-serif",
            "name": "Alegreya",
            "url": "https://fonts.googleapis.com/css2?family=Alegreya:wght@100;200;300;400;500;600;700;800;900"
          }
        ]
      },
      "description": "",
      "rows": [
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnHtml": false,
                      "hideContentOnMobile": false
                    },
                    "paragraph": {
                      "computedStyle": {
                        "linkColor": "#7747FF",
                        "paragraphSpacing": "16px"
                      },
                      "html": "<p>I'm a new paragraph block.</p>",
                      "style": {
                        "color": "#101112",
                        "direction": "ltr",
                        "font-family": "'Alegreya', 'Trebuchet MS', Helvetica, sans-serif",
                        "font-size": "16px",
                        "font-weight": "400",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "text-align": "left"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "uuid": "29cd2a3d-fd76-4537-a91b-b8cb9872d8a3"
                },
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnHtml": false,
                      "hideContentOnMobile": false
                    },
                    "paragraph": {
                      "computedStyle": {
                        "linkColor": "#7747FF",
                        "paragraphSpacing": "16px"
                      },
                      "html": "<p>I'm a new paragraph block.</p>",
                      "style": {
                        "color": "#101112",
                        "direction": "ltr",
                        "font-family": "'Arvo', 'Courier New', Courier, monospace",
                        "font-size": "16px",
                        "font-weight": "400",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "text-align": "left"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "uuid": "e22bd20c-805e-439a-832c-f7a100dcaaf2"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "56119ad2-574d-4122-8dd1-c1152b5f4879"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "600px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "uuid": "0922fb70-f97e-4ae8-bcfe-0be9fd09a0d5"
          },
          "synced": true,
          "type": "one-column-empty",
          "uuid": "0922fb70-f97e-4ae8-bcfe-0be9fd09a0d5"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnHtml": false,
                      "hideContentOnMobile": false
                    },
                    "paragraph": {
                      "computedStyle": {
                        "linkColor": "#7747FF",
                        "paragraphSpacing": "16px"
                      },
                      "html": "<p>I'm a new paragraph block.</p>",
                      "style": {
                        "color": "#101112",
                        "direction": "ltr",
                        "font-family": "'Alegreya', 'Trebuchet MS', Helvetica, sans-serif",
                        "font-size": "16px",
                        "font-weight": "400",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "text-align": "left"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "uuid": "29cd2a3d-fd76-4537-a91b-b8cb9872d8a3"
                },
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnHtml": false,
                      "hideContentOnMobile": false
                    },
                    "paragraph": {
                      "computedStyle": {
                        "linkColor": "#7747FF",
                        "paragraphSpacing": "16px"
                      },
                      "html": "<p>I'm a new paragraph block.</p>",
                      "style": {
                        "color": "#101112",
                        "direction": "ltr",
                        "font-family": "'Arvo', 'Courier New', Courier, monospace",
                        "font-size": "16px",
                        "font-weight": "400",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "text-align": "left"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "uuid": "e22bd20c-805e-439a-832c-f7a100dcaaf2"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "56119ad2-574d-4122-8dd1-c1152b5f4879"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "600px"
            }
          },
          "empty": false,
          "locked": false,
          "synced": false,
          "type": "one-column-empty",
          "uuid": "0922fb70-f97e-4ae8-bcfe-0be9fd09a0d5"
        }
      ],
      "template": {
        "name": "template-base",
        "type": "basic",
        "version": "2.0.0"
      },
      "title": ""
    }
  },
  "webFonts": [
    {
      "fontFamily": "'Arvo', 'Courier New', Courier, monospace",
      "name": "Arvo",
      "url": "https://fonts.googleapis.com/css2?family=Arvo:wght@100;200;300;400;500;600;700;800;900"
    },
    {
      "fontFamily": "'Alegreya', 'Trebuchet MS', Helvetica, sans-serif",
      "name": "Alegreya",
      "url": "https://fonts.googleapis.com/css2?family=Alegreya:wght@100;200;300;400;500;600;700;800;900"
    },
    {
      "fontFamily": "'Chivo', Arial, Helvetica, sans-serif",
      "name": "Chivo",
      "url": "https://fonts.googleapis.com/css2?family=Chivo:wght@100;200;300;400;500;600;700;800;900"
    }
  ]
}
{
  "message": "Success"
}

Synced Rows

post

Retrieve a list of synced rows from a template.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
rowIdentifierLabelstringOptional

A string field for rowIdentifierLabel

Responses
200

Successful response

application/json
Responseobject
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/synced-rows
POST /v1/{collection}/synced-rows HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 5932

{
  "rowIdentifierLabel": "guid",
  "template": {
    "page": {
      "body": {
        "container": {
          "style": {
            "background-color": "#ffffff"
          }
        },
        "content": {
          "computedStyle": {
            "linkColor": "#7747FF",
            "messageBackgroundColor": "transparent",
            "messageWidth": "600px"
          },
          "style": {
            "color": "#000000",
            "font-family": "Arial, Helvetica, sans-serif"
          }
        },
        "type": "mailup-bee-page-properties",
        "webFonts": [
          {
            "fontFamily": "'Alegreya', 'Trebuchet MS', Helvetica, sans-serif",
            "name": "Alegreya",
            "url": "https://fonts.googleapis.com/css2?family=Alegreya:wght@100;200;300;400;500;600;700;800;900"
          }
        ]
      },
      "description": "",
      "rows": [
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnHtml": false,
                      "hideContentOnMobile": false
                    },
                    "paragraph": {
                      "computedStyle": {
                        "linkColor": "#7747FF",
                        "paragraphSpacing": "16px"
                      },
                      "html": "<p>I'm a new paragraph block.</p>",
                      "style": {
                        "color": "#101112",
                        "direction": "ltr",
                        "font-family": "'Alegreya', 'Trebuchet MS', Helvetica, sans-serif",
                        "font-size": "16px",
                        "font-weight": "400",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "text-align": "left"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "uuid": "29cd2a3d-fd76-4537-a91b-b8cb9872d8a3"
                },
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnHtml": false,
                      "hideContentOnMobile": false
                    },
                    "paragraph": {
                      "computedStyle": {
                        "linkColor": "#7747FF",
                        "paragraphSpacing": "16px"
                      },
                      "html": "<p>I'm a new paragraph block.</p>",
                      "style": {
                        "color": "#101112",
                        "direction": "ltr",
                        "font-family": "'Arvo', 'Courier New', Courier, monospace",
                        "font-size": "16px",
                        "font-weight": "400",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "text-align": "left"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "uuid": "e22bd20c-805e-439a-832c-f7a100dcaaf2"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "56119ad2-574d-4122-8dd1-c1152b5f4879"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "600px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "guid": "0922fb70-f97e-4ae8-bcfe-0be9fd09a0d5"
          },
          "synced": true,
          "type": "one-column-empty",
          "uuid": "0922fb70-f97e-4ae8-bcfe-0be9fd09a0d5"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnHtml": false,
                      "hideContentOnMobile": false
                    },
                    "paragraph": {
                      "computedStyle": {
                        "linkColor": "#7747FF",
                        "paragraphSpacing": "16px"
                      },
                      "html": "<p>I'm a new paragraph block.</p>",
                      "style": {
                        "color": "#101112",
                        "direction": "ltr",
                        "font-family": "'Alegreya', 'Trebuchet MS', Helvetica, sans-serif",
                        "font-size": "16px",
                        "font-weight": "400",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "text-align": "left"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "uuid": "29cd2a3d-fd76-4537-a91b-b8cb9872d8a3"
                },
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnHtml": false,
                      "hideContentOnMobile": false
                    },
                    "paragraph": {
                      "computedStyle": {
                        "linkColor": "#7747FF",
                        "paragraphSpacing": "16px"
                      },
                      "html": "<p>I'm a new paragraph block.</p>",
                      "style": {
                        "color": "#101112",
                        "direction": "ltr",
                        "font-family": "'Arvo', 'Courier New', Courier, monospace",
                        "font-size": "16px",
                        "font-weight": "400",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "text-align": "left"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "uuid": "e22bd20c-805e-439a-832c-f7a100dcaaf2"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "56119ad2-574d-4122-8dd1-c1152b5f4879"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "600px"
            }
          },
          "empty": false,
          "locked": false,
          "synced": false,
          "type": "one-column-empty",
          "uuid": "0922fb70-f97e-4ae8-bcfe-0be9fd09a0d5"
        }
      ],
      "template": {
        "name": "template-base",
        "type": "basic",
        "version": "2.0.0"
      },
      "title": ""
    }
  },
  "webFonts": [
    {
      "fontFamily": "'Arvo', 'Courier New', Courier, monospace",
      "name": "Arvo",
      "url": "https://fonts.googleapis.com/css2?family=Arvo:wght@100;200;300;400;500;600;700;800;900"
    },
    {
      "fontFamily": "'Alegreya', 'Trebuchet MS', Helvetica, sans-serif",
      "name": "Alegreya",
      "url": "https://fonts.googleapis.com/css2?family=Alegreya:wght@100;200;300;400;500;600;700;800;900"
    },
    {
      "fontFamily": "'Chivo', Arial, Helvetica, sans-serif",
      "name": "Chivo",
      "url": "https://fonts.googleapis.com/css2?family=Chivo:wght@100;200;300;400;500;600;700;800;900"
    }
  ]
}
{
  "message": "Success"
}

Index

post

Reference an array of metadata objects from a Beefree template in JSON format.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
Responses
200

Successful response

application/json
Responseobject
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/merge/index
POST /v1/{collection}/merge/index HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 4204

{
  "source": {
    "page": {
      "body": {
        "container": {
          "style": {
            "background-color": "#FFFFFF"
          }
        },
        "content": {
          "computedStyle": {
            "linkColor": "#FF819C",
            "messageBackgroundColor": "transparent",
            "messageWidth": "675px"
          },
          "style": {
            "color": "#000000",
            "font-family": "Arial, 'Helvetica Neue', Helvetica, sans-serif"
          }
        },
        "type": "mailup-bee-page-properties",
        "webFonts": [
          {
            "name": "Montserrat",
            "fontFamily": "'Montserrat', 'Trebuchet MS', 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, sans-serif",
            "url": "https://fonts.googleapis.com/css?family=Montserrat"
          }
        ]
      },
      "description": "BF-ecommerce-template",
      "rows": [
        {
          "metadata": {
            "name": "demo3",
            "guid": "test3"
          },
          "columns": [
            {
              "grid-columns": 6,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "class": "center fixedwidth",
                      "width": 338
                    },
                    "image": {
                      "alt": "Image",
                      "href": "https://beefree.io",
                      "src": "https://d1oco4z2z1fhwp.cloudfront.net/templates/default/113/logo_1.png"
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "15px",
                      "padding-right": "15px",
                      "padding-top": "5px",
                      "width": "100%"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-image"
                },
                {
                  "descriptor": {
                    "computedStyle": {
                      "align": "center",
                      "hideContentOnMobile": true
                    },
                    "divider": {
                      "style": {
                        "border-top": "0px solid transparent",
                        "height": "20px",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "0px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "30px"
              }
            },
            {
              "grid-columns": 6,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "align": "center",
                      "hideContentOnMobile": true
                    },
                    "divider": {
                      "style": {
                        "border-top": "0px solid transparent",
                        "height": "32px",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider"
                },
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnMobile": true
                    },
                    "style": {
                      "padding-bottom": "15px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "0px"
                    },
                    "text": {
                      "computedStyle": {
                        "linkColor": "#FF819C"
                      },
                      "html": "<div class=\"txtTinyMce-wrapper\" style=\"font-family: Montserrat, &quot;Trebuchet MS&quot;, &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, &quot;Lucida Sans&quot;, Tahoma, sans-serif; font-size: 12px; line-height: 18px;\" data-mce-style=\"font-family: Montserrat, &quot;Trebuchet MS&quot;, &quot;Lucida Grande&quot;, &quot;Lucida Sans Unicode&quot;, &quot;Lucida Sans&quot;, Tahoma, sans-serif; font-size: 12px; line-height: 18px;\">\n<div style=\"line-height: 18px; font-size: 12px; text-align: center;\" data-mce-style=\"line-height: 18px; font-size: 12px; text-align: center;\"><span style=\"font-size: 18px; line-height: 27px;\" data-mce-style=\"font-size: 18px; line-height: 27px;\"><strong><span style=\"line-height: 27px; font-size: 18px;\" data-mce-style=\"line-height: 27px; font-size: 18px;\">ANY DEVICE, ANYWHERE, FAST.</span></strong></span></div>\n</div>",
                      "style": {
                        "color": "#FFFFFF",
                        "font-family": "'Montserrat', 'Trebuchet MS', 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', Tahoma, sans-serif",
                        "line-height": "150%"
                      }
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-text"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "20px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "30px"
              }
            }
          ],
          "container": {
            "style": {
              "background-color": "#FF819C",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#333",
              "width": "675px"
            }
          },
          "locked": false,
          "type": "two-columns-empty"
        }
      ],
      "template": {
        "name": "template-base",
        "type": "basic",
        "version": "2.0.0"
      },
      "title": "BF-ecommerce-template"
    }
  }
}
{
  "message": "Success"
}

Generate Preheader and Subject Metadata with AI

post

Use AI and this endpoint to generate metadata, which includes preheaders and subject lines, automatically.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
Responses
200

Successful response

application/json
Responseobject
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/metadata
POST /v1/{collection}/metadata HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 19924

{
  "options": {
    "model": "gpt-3.5-turbo",
    "toneOfVoice": "",
    "instructions": "Try to use a pun.",
    "reportUsage": true,
    "language": ""
  },
  "template": {
    "page": {
      "body": {
        "container": {
          "style": {
            "background-color": "#fff",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "background-size": "auto"
          }
        },
        "content": {
          "computedStyle": {
            "linkColor": "#8a3b8f",
            "messageBackgroundColor": "transparent",
            "messageWidth": "650px"
          },
          "style": {
            "color": "#000000",
            "font-family": "Lato, Tahoma, Verdana, Segoe, sans-serif"
          }
        },
        "type": "mailup-bee-page-properties",
        "webFonts": [
          {
            "fontFamily": "'Lato', Tahoma, Verdana, Segoe, sans-serif",
            "name": "Lato",
            "url": "https://fonts.googleapis.com/css?family=Lato"
          }
        ]
      },
      "description": "",
      "rows": [
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "align": "center",
                      "hideContentOnMobile": false
                    },
                    "divider": {
                      "style": {
                        "border-top": "0px solid transparent",
                        "height": "10px",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider",
                  "uuid": "b89c3d25-dbec-439a-8ad1-4939a28678e9"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "0px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "0px"
              },
              "uuid": "3bd72010-5175-4326-b848-8beacea852d6"
            }
          ],
          "container": {
            "style": {
              "background-color": "#8a3b8f",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 625122,
            "dateCreated": "2022-01-20T09:49:32.875165Z",
            "dateModified": "2022-01-20T09:49:32.875165Z",
            "description": "",
            "idParent": null,
            "name": "Pre header purple row",
            "slug": "pre-header-purple-row",
            "thumb_large": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/8b99691b-8e39-47a7-8773-4540cd7ff113_large.jpg",
            "thumb_medium": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/8b99691b-8e39-47a7-8773-4540cd7ff113_medium.jpg",
            "thumb_small": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/8b99691b-8e39-47a7-8773-4540cd7ff113_small.jpg",
            "uuid": "8b99691b-8e39-47a7-8773-4540cd7ff113"
          },
          "synced": false,
          "type": "one-column-empty",
          "uuid": "7fa3e6c4-ac4f-421f-b9eb-db1b9f629fb3"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "class": "left fixedwidth",
                      "width": "162.5px"
                    },
                    "image": {
                      "alt": "BEE Pro Logo",
                      "height": "109px",
                      "href": "https://beefree.io/",
                      "percWidth": 25,
                      "prefix": "",
                      "src": "https://d15k2d11r6t6rl.cloudfront.net/public/users/Integrators/BeeProAgency/53601_655907/editor_images/BEEPro_logo_2.png",
                      "target": "_self",
                      "width": "291px"
                    },
                    "style": {
                      "padding-bottom": "40px",
                      "padding-left": "20px",
                      "padding-right": "20px",
                      "padding-top": "20px",
                      "width": "100%"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-image",
                  "uuid": "cc54124d-97bd-44e0-b15e-710a577840ec"
                },
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "align": "center"
                    },
                    "divider": {
                      "style": {
                        "border-top": "1px dotted #CCCCCC",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "20px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "15px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider",
                  "uuid": "2cd36842-fbe8-4f43-9688-ff6c964aaa89"
                },
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnHtml": false,
                      "hideContentOnMobile": false
                    },
                    "paragraph": {
                      "computedStyle": {
                        "linkColor": "#0068a5",
                        "paragraphSpacing": "16px"
                      },
                      "html": "<p>Hi 🙂</p>\n<p><strong>Would you be interested to participate in a user research project with us?</strong></p>\n<p>The research will consist of a video call. It usually takes 30 to 45 minutes maximum, but we schedule 1 hour in case we need more time. We'll be asking questions about you, your team, and your email/page creation workflow. The idea is for us to understand how BEE Pro fits in your work day.</p>\n<p><strong>Sounds good?</strong> Pick a time slot at your convenience using <a href=\"https://calendly.com/beepro-product-team/beepro-interview?month=2022-06\" target=\"_blank\" rel=\"noopener\" style=\"text-decoration: underline;\">this link ↗</a></p>\n<p>Look forward to hearing back from you.</p>\n<p>Best,</p>\n<p>Dalila from the Product Team 💜</p>\n<p>P.S. Probably your colleagues that use BEE Pro have received this email too. If you'd like you can add one guest to the booking link and participate together, or you can join us alone. We would love to talk to you in any case.&nbsp;</p>",
                      "style": {
                        "color": "#000000",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "14px",
                        "font-weight": "400",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "text-align": "left"
                      },
                      "translations": {
                        "de-DE": {
                          "html": "<p>Hallo 🙂<br /><br />Is het interessant om deel te nemen aan een onderzoek naar nieuwe gebruikersonderzoeken?<br /><br />Het onderzoek bestaat uit een videofilm. Wacht tussen 30 en 45 minuten als het maximum, maar het programma duurt 1 uur voordat u meer tijd nodig heeft. De haremos worden nu gebruikt, uw uitrusting en uw vloeiende creatie van pagina's/correos elektronische. Het idee is dat BEE Pro op zijn werk werkt.<br /><br />&iquest;Suena bien? Elija un horario de su conveniencia usando este enlace ↗<br />Esperamos tener noticias suyas.<br /><br />Groot,<br /><br />Dalila del equipo de producto 💜<br /><br /><br />PD Waarschijnlijk is uw partner die BEE Pro gebruikt, deze recibido is elektrisch correct. Als je dit hebt gedaan, kun je een uitnodiging voor het reserveren en de deelname aan de wedstrijd verzamelen, of je kunt een nieuwe solo spelen. Geen enkele gebeurtenis wordt in een ander geval verwisseld.</p>"
                        },
                        "es-ES": {
                          "html": "<p>Hola 🙂<br /><br />&iquest;Estar&iacute;a interesado en participar en un proyecto de investigaci&oacute;n de usuarios con nosotros?<br /><br />La investigaci&oacute;n consistir&aacute; en una videollamada. Suele tardar entre 30 y 45 minutos como m&aacute;ximo, pero programamos 1 hora por si necesitamos m&aacute;s tiempo. Le haremos preguntas sobre usted, su equipo y su flujo de trabajo de creaci&oacute;n de p&aacute;ginas/correos electr&oacute;nicos. La idea es que entendamos c&oacute;mo encaja BEE Pro en su jornada laboral.<br /><br /><br />&iquest;Suena bien? Elija un horario de su conveniencia usando este enlace ↗<br />Esperamos tener noticias suyas.<br /><br /><br />Mejor,<br /><br />Dalila del equipo de producto 💜<br /><br /><br /><br />PD Probablemente tus compa&ntilde;eros que utilizan BEE Pro tambi&eacute;n hayan recibido este correo electr&oacute;nico. Si lo desea, puede agregar un invitado al enlace de reserva y participar juntos, o puede unirse a nosotros solo. Nos encantar&iacute;a hablar con usted en cualquier caso.</p>"
                        }
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "uuid": "0456f2de-7125-475c-b016-41f77b3fda47"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "10px",
                "padding-right": "10px",
                "padding-top": "5px"
              },
              "uuid": "61614a04-eb36-4d98-b28e-c6c9e048877d"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 625122,
            "dateCreated": "2022-01-20T09:51:57.896884Z",
            "dateModified": "2022-01-20T09:51:57.896884Z",
            "description": "",
            "idParent": null,
            "name": "body with: logo + pre title + title + subtitle + body",
            "slug": "body-with-logo-pre-title-title-subtitle-body",
            "thumb_large": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/35d02430-32b2-41d6-a115-68d7bb476d64_large.jpg",
            "thumb_medium": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/35d02430-32b2-41d6-a115-68d7bb476d64_medium.jpg",
            "thumb_small": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/35d02430-32b2-41d6-a115-68d7bb476d64_small.jpg",
            "uuid": "35d02430-32b2-41d6-a115-68d7bb476d64"
          },
          "synced": false,
          "type": "two-columns-empty",
          "uuid": "f57920be-d9e4-41c0-a009-eb85fd2a8034"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "align": "center"
                    },
                    "divider": {
                      "style": {
                        "border-top": "1px dotted #CCCCCC",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "30px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "15px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider",
                  "uuid": "ab4460e6-1206-45c1-ba56-9f6d6409508e"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "6ac459ef-5e34-468a-b064-07ea57e1e37c"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 625122,
            "dateCreated": "2021-06-29T08:19:25.800829Z",
            "dateModified": "2021-06-29T08:19:27.572522Z",
            "description": "",
            "idParent": null,
            "name": "Footer Line",
            "slug": "footer-line",
            "uuid": "77127825-a508-4127-9155-b5161f9e1703"
          },
          "synced": false,
          "type": "row-1-columns-12",
          "uuid": "b759c29c-fb9e-4b1a-add9-a464eeb568f5"
        },
        {
          "columns": [
            {
              "grid-columns": 3,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "class": "left fixedwidth",
                      "width": "130px"
                    },
                    "image": {
                      "alt": "Elena Loatelli & Dalila Bonomi",
                      "height": "263px",
                      "href": "",
                      "percWidth": 80,
                      "prefix": "",
                      "src": "https://d15k2d11r6t6rl.cloudfront.net/public/users/Integrators/BeeProAgency/53601_655907/editor_images/dalila.png",
                      "target": "_self",
                      "width": "263px"
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "15px",
                      "padding-right": "0px",
                      "padding-top": "5px",
                      "width": "100%"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-image",
                  "uuid": "682c9273-3090-43fb-9acc-a2e2cda857b7"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "a434440b-92d8-4841-90cc-2ab49b1afc14"
            },
            {
              "grid-columns": 9,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnMobile": false
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "15px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    },
                    "text": {
                      "computedStyle": {
                        "linkColor": "#8a3b8f"
                      },
                      "html": "<div class=\"txtTinyMce-wrapper\" style=\"font-size:14px;line-height:16px;font-family:inherit;\" data-mce-style=\"font-size:14px;line-height:16px;font-family:inherit;\"><p style=\"font-size:14px;line-height:16px;word-break:break-word;\" data-mce-style=\"font-size:14px;line-height:16px;word-break:break-word;\"><strong><span style=\"font-size:16px;line-height:19px;\" data-mce-style=\"font-size:16px;line-height:19px;\">DALILA BONOMI</span></strong></p></div>",
                      "style": {
                        "color": "#8a3b8f",
                        "font-family": "inherit",
                        "line-height": "120%"
                      }
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-text",
                  "uuid": "b37a5a73-5f40-4e2d-8d7b-6a117aa686eb"
                },
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnDesktop": false,
                      "hideContentOnMobile": false
                    },
                    "style": {
                      "padding-bottom": "5px",
                      "padding-left": "15px",
                      "padding-right": "0px",
                      "padding-top": "10px"
                    },
                    "text": {
                      "computedStyle": {
                        "linkColor": "#8a3b8f"
                      },
                      "html": "<div class=\"txtTinyMce-wrapper\" style=\"font-size:12px;line-height:21px;font-family:inherit;\" data-mce-style=\"font-size:12px;line-height:21px;font-family:inherit;\"><p style=\"font-size:14px;line-height:25px;word-break:break-word;text-align:left;\" data-mce-style=\"font-size:14px;line-height:25px;word-break:break-word;text-align:left;\"><strong><span style=\"font-size:16px;line-height:28px;\" data-mce-style=\"font-size:16px;line-height:28px;\">BEE | The email &amp; page builder for everyone.</span></strong></p><p style=\"line-height:21px;word-break:break-word;\" data-mce-style=\"line-height:21px;word-break:break-word;\"><span style=\"font-size:16px;line-height:28px;\" data-mce-style=\"font-size:16px;line-height:28px;\">Design Researcher</span></p></div>",
                      "style": {
                        "color": "#454562",
                        "font-family": "inherit",
                        "line-height": "180%"
                      }
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-text",
                  "uuid": "a916773b-42f4-4efc-af64-3b2a9f801015"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "bc078241-a4ab-4a26-b28b-b7aba3180d3a"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 706433,
            "dateCreated": "2022-01-31T09:21:17.612857Z",
            "dateModified": "2022-01-31T09:21:20.633639Z",
            "description": "",
            "idParent": null,
            "name": "Dalila single sign",
            "slug": "dalila-single-sign",
            "uuid": "37bceb9d-b1c9-4724-b5ad-31645653d1c2"
          },
          "synced": false,
          "type": "two-columns-3-9-empty",
          "uuid": "3218627f-a68a-4f5d-b3e9-adfa19bb82ec"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "align": "center",
                      "hideContentOnMobile": false
                    },
                    "divider": {
                      "style": {
                        "border-top": "0px solid transparent",
                        "height": "50px",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider",
                  "uuid": "5a247632-900c-4a38-8bf1-2307938d9bb5"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "ecfdb53f-a7a0-40dd-9fd9-67d7e2677832"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "synced": false,
          "type": "one-column-empty",
          "uuid": "feb66cab-ac4a-4ec2-b5d6-657eeabd1039"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnDesktop": false,
                      "hideContentOnMobile": false,
                      "iconHeight": "16px",
                      "iconSpacing": {
                        "padding-bottom": "5px",
                        "padding-left": "5px",
                        "padding-right": "6px",
                        "padding-top": "5px"
                      },
                      "itemsSpacing": "0px"
                    },
                    "iconsList": {
                      "icons": [
                        {
                          "alt": "Designed with BEE",
                          "height": "325px",
                          "href": "https://beefree.io/",
                          "id": "1879a39d-9303-43e5-8458-990ac7b0a429",
                          "image": "https://d15k2d11r6t6rl.cloudfront.net/public/users/Integrators/BeeProAgency/53601_510656/Signature/bee_w.png",
                          "target": "_blank",
                          "text": "Designed with BEE",
                          "textPosition": "right",
                          "title": "Designed with BEE",
                          "width": "325px"
                        }
                      ]
                    },
                    "style": {
                      "color": "#ffffff",
                      "font-family": "inherit",
                      "font-size": "15px",
                      "padding-bottom": "5px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "5px",
                      "text-align": "center"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-icons",
                  "uuid": "35f3f7a2-37aa-4471-bd26-ce2b51e6e39b"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "8d6cbc30-0a36-4037-ae02-827d71033fee"
            }
          ],
          "container": {
            "style": {
              "background-color": "#8a3b8f",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 706433,
            "dateCreated": "2022-01-20T09:44:21.371097Z",
            "dateModified": "2022-01-20T11:01:58.708887Z",
            "description": "",
            "idParent": null,
            "name": "Designed with BEE",
            "slug": "designed-with-bee",
            "thumb_large": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/727e515b-7455-4661-8e85-22b9f7178d3f_large.jpg",
            "thumb_medium": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/727e515b-7455-4661-8e85-22b9f7178d3f_medium.jpg",
            "thumb_small": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/727e515b-7455-4661-8e85-22b9f7178d3f_small.jpg",
            "uuid": "727e515b-7455-4661-8e85-22b9f7178d3f"
          },
          "synced": false,
          "type": "one-column-empty",
          "uuid": "cc615b28-4773-45ef-b0bf-4ef7ef89b1bf"
        }
      ],
      "template": {
        "name": "template-base",
        "type": "basic",
        "version": "2.0.0"
      },
      "title": ""
    },
    "comments": {
      "31878122-0ce6-4ac0-930e-ccf6086c264c": {
        "author": {
          "userColor": "#85b2c3",
          "userHandle": "515751",
          "username": "Cinzia Caleffi"
        },
        "content": "<code contenteditable=\"false\" data-bee-mention-uid=\"274606\">@Dalila Bonomi</code> <code contenteditable=\"false\" data-bee-mention-uid=\"264431\">@Cinzia Caleffi</code> ei",
        "elementId": "9664b8a4-b3c0-401d-be92-6a0dc5022591",
        "mentions": [
          "274606",
          "264431"
        ],
        "parentCommentId": null,
        "responses": [],
        "timestamp": "2022-08-03T06:54:12.900Z",
        "isElementDeleted": true
      },
      "aa9ea85d-1cdd-49b4-90d0-a42fb87d0a44": {
        "author": {
          "userColor": "#85b2c3",
          "userHandle": "515751",
          "username": "Cinzia Caleffi"
        },
        "content": "<code contenteditable=\"false\" data-bee-mention-uid=\"274606\">@Dalila Bonomi</code> <code contenteditable=\"false\" data-bee-mention-uid=\"264431\">@Cinzia Caleffi</code> test",
        "elementId": null,
        "mentions": [
          "274606",
          "264431"
        ],
        "parentCommentId": null,
        "responses": [],
        "timestamp": "2022-08-03T06:55:03.335Z",
        "isElementDeleted": null
      }
    }
  }
}
{
  "message": "Success"
}

Generate SMS with AI

post

Submit your JSON template as the request body to generate a custom SMS using AI.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
Responses
200

Successful response

application/json
Responseobject
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/sms
POST /v1/{collection}/sms HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 19932

{
  "options": {
    "model": "gpt-3.5-turbo",
    "toneOfVoice": "",
    "length": "detailed",
    "instructions": "",
    "reportUsage": true,
    "language": "it-IT"
  },
  "template": {
    "page": {
      "body": {
        "container": {
          "style": {
            "background-color": "#fff",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "background-size": "auto"
          }
        },
        "content": {
          "computedStyle": {
            "linkColor": "#8a3b8f",
            "messageBackgroundColor": "transparent",
            "messageWidth": "650px"
          },
          "style": {
            "color": "#000000",
            "font-family": "Lato, Tahoma, Verdana, Segoe, sans-serif"
          }
        },
        "type": "mailup-bee-page-properties",
        "webFonts": [
          {
            "fontFamily": "'Lato', Tahoma, Verdana, Segoe, sans-serif",
            "name": "Lato",
            "url": "https://fonts.googleapis.com/css?family=Lato"
          }
        ]
      },
      "description": "",
      "rows": [
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "align": "center",
                      "hideContentOnMobile": false
                    },
                    "divider": {
                      "style": {
                        "border-top": "0px solid transparent",
                        "height": "10px",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider",
                  "uuid": "b89c3d25-dbec-439a-8ad1-4939a28678e9"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "0px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "0px"
              },
              "uuid": "3bd72010-5175-4326-b848-8beacea852d6"
            }
          ],
          "container": {
            "style": {
              "background-color": "#8a3b8f",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 625122,
            "dateCreated": "2022-01-20T09:49:32.875165Z",
            "dateModified": "2022-01-20T09:49:32.875165Z",
            "description": "",
            "idParent": null,
            "name": "Pre header purple row",
            "slug": "pre-header-purple-row",
            "thumb_large": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/8b99691b-8e39-47a7-8773-4540cd7ff113_large.jpg",
            "thumb_medium": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/8b99691b-8e39-47a7-8773-4540cd7ff113_medium.jpg",
            "thumb_small": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/8b99691b-8e39-47a7-8773-4540cd7ff113_small.jpg",
            "uuid": "8b99691b-8e39-47a7-8773-4540cd7ff113"
          },
          "synced": false,
          "type": "one-column-empty",
          "uuid": "7fa3e6c4-ac4f-421f-b9eb-db1b9f629fb3"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "class": "left fixedwidth",
                      "width": "162.5px"
                    },
                    "image": {
                      "alt": "BEE Pro Logo",
                      "height": "109px",
                      "href": "https://beefree.io/",
                      "percWidth": 25,
                      "prefix": "",
                      "src": "https://d15k2d11r6t6rl.cloudfront.net/public/users/Integrators/BeeProAgency/53601_655907/editor_images/BEEPro_logo_2.png",
                      "target": "_self",
                      "width": "291px"
                    },
                    "style": {
                      "padding-bottom": "40px",
                      "padding-left": "20px",
                      "padding-right": "20px",
                      "padding-top": "20px",
                      "width": "100%"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-image",
                  "uuid": "cc54124d-97bd-44e0-b15e-710a577840ec"
                },
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "align": "center"
                    },
                    "divider": {
                      "style": {
                        "border-top": "1px dotted #CCCCCC",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "20px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "15px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider",
                  "uuid": "2cd36842-fbe8-4f43-9688-ff6c964aaa89"
                },
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnHtml": false,
                      "hideContentOnMobile": false
                    },
                    "paragraph": {
                      "computedStyle": {
                        "linkColor": "#0068a5",
                        "paragraphSpacing": "16px"
                      },
                      "html": "<p>Hi 🙂</p>\n<p><strong>Would you be interested to participate in a user research project with us?</strong></p>\n<p>The research will consist of a video call. It usually takes 30 to 45 minutes maximum, but we schedule 1 hour in case we need more time. We'll be asking questions about you, your team, and your email/page creation workflow. The idea is for us to understand how BEE Pro fits in your work day.</p>\n<p><strong>Sounds good?</strong> Pick a time slot at your convenience using <a href=\"https://calendly.com/beepro-product-team/beepro-interview?month=2022-06\" target=\"_blank\" rel=\"noopener\" style=\"text-decoration: underline;\">this link ↗</a></p>\n<p>Look forward to hearing back from you.</p>\n<p>Best,</p>\n<p>Dalila from the Product Team 💜</p>\n<p>P.S. Probably your colleagues that use BEE Pro have received this email too. If you'd like you can add one guest to the booking link and participate together, or you can join us alone. We would love to talk to you in any case.&nbsp;</p>",
                      "style": {
                        "color": "#000000",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "14px",
                        "font-weight": "400",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "text-align": "left"
                      },
                      "translations": {
                        "de-DE": {
                          "html": "<p>Hallo 🙂<br /><br />Is het interessant om deel te nemen aan een onderzoek naar nieuwe gebruikersonderzoeken?<br /><br />Het onderzoek bestaat uit een videofilm. Wacht tussen 30 en 45 minuten als het maximum, maar het programma duurt 1 uur voordat u meer tijd nodig heeft. De haremos worden nu gebruikt, uw uitrusting en uw vloeiende creatie van pagina's/correos elektronische. Het idee is dat BEE Pro op zijn werk werkt.<br /><br />&iquest;Suena bien? Elija un horario de su conveniencia usando este enlace ↗<br />Esperamos tener noticias suyas.<br /><br />Groot,<br /><br />Dalila del equipo de producto 💜<br /><br /><br />PD Waarschijnlijk is uw partner die BEE Pro gebruikt, deze recibido is elektrisch correct. Als je dit hebt gedaan, kun je een uitnodiging voor het reserveren en de deelname aan de wedstrijd verzamelen, of je kunt een nieuwe solo spelen. Geen enkele gebeurtenis wordt in een ander geval verwisseld.</p>"
                        },
                        "es-ES": {
                          "html": "<p>Hola 🙂<br /><br />&iquest;Estar&iacute;a interesado en participar en un proyecto de investigaci&oacute;n de usuarios con nosotros?<br /><br />La investigaci&oacute;n consistir&aacute; en una videollamada. Suele tardar entre 30 y 45 minutos como m&aacute;ximo, pero programamos 1 hora por si necesitamos m&aacute;s tiempo. Le haremos preguntas sobre usted, su equipo y su flujo de trabajo de creaci&oacute;n de p&aacute;ginas/correos electr&oacute;nicos. La idea es que entendamos c&oacute;mo encaja BEE Pro en su jornada laboral.<br /><br /><br />&iquest;Suena bien? Elija un horario de su conveniencia usando este enlace ↗<br />Esperamos tener noticias suyas.<br /><br /><br />Mejor,<br /><br />Dalila del equipo de producto 💜<br /><br /><br /><br />PD Probablemente tus compa&ntilde;eros que utilizan BEE Pro tambi&eacute;n hayan recibido este correo electr&oacute;nico. Si lo desea, puede agregar un invitado al enlace de reserva y participar juntos, o puede unirse a nosotros solo. Nos encantar&iacute;a hablar con usted en cualquier caso.</p>"
                        }
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "uuid": "0456f2de-7125-475c-b016-41f77b3fda47"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "10px",
                "padding-right": "10px",
                "padding-top": "5px"
              },
              "uuid": "61614a04-eb36-4d98-b28e-c6c9e048877d"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 625122,
            "dateCreated": "2022-01-20T09:51:57.896884Z",
            "dateModified": "2022-01-20T09:51:57.896884Z",
            "description": "",
            "idParent": null,
            "name": "body with: logo + pre title + title + subtitle + body",
            "slug": "body-with-logo-pre-title-title-subtitle-body",
            "thumb_large": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/35d02430-32b2-41d6-a115-68d7bb476d64_large.jpg",
            "thumb_medium": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/35d02430-32b2-41d6-a115-68d7bb476d64_medium.jpg",
            "thumb_small": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/35d02430-32b2-41d6-a115-68d7bb476d64_small.jpg",
            "uuid": "35d02430-32b2-41d6-a115-68d7bb476d64"
          },
          "synced": false,
          "type": "two-columns-empty",
          "uuid": "f57920be-d9e4-41c0-a009-eb85fd2a8034"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "align": "center"
                    },
                    "divider": {
                      "style": {
                        "border-top": "1px dotted #CCCCCC",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "30px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "15px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider",
                  "uuid": "ab4460e6-1206-45c1-ba56-9f6d6409508e"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "6ac459ef-5e34-468a-b064-07ea57e1e37c"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 625122,
            "dateCreated": "2021-06-29T08:19:25.800829Z",
            "dateModified": "2021-06-29T08:19:27.572522Z",
            "description": "",
            "idParent": null,
            "name": "Footer Line",
            "slug": "footer-line",
            "uuid": "77127825-a508-4127-9155-b5161f9e1703"
          },
          "synced": false,
          "type": "row-1-columns-12",
          "uuid": "b759c29c-fb9e-4b1a-add9-a464eeb568f5"
        },
        {
          "columns": [
            {
              "grid-columns": 3,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "class": "left fixedwidth",
                      "width": "130px"
                    },
                    "image": {
                      "alt": "Elena Loatelli & Dalila Bonomi",
                      "height": "263px",
                      "href": "",
                      "percWidth": 80,
                      "prefix": "",
                      "src": "https://d15k2d11r6t6rl.cloudfront.net/public/users/Integrators/BeeProAgency/53601_655907/editor_images/dalila.png",
                      "target": "_self",
                      "width": "263px"
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "15px",
                      "padding-right": "0px",
                      "padding-top": "5px",
                      "width": "100%"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-image",
                  "uuid": "682c9273-3090-43fb-9acc-a2e2cda857b7"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "a434440b-92d8-4841-90cc-2ab49b1afc14"
            },
            {
              "grid-columns": 9,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnMobile": false
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "15px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    },
                    "text": {
                      "computedStyle": {
                        "linkColor": "#8a3b8f"
                      },
                      "html": "<div class=\"txtTinyMce-wrapper\" style=\"font-size:14px;line-height:16px;font-family:inherit;\" data-mce-style=\"font-size:14px;line-height:16px;font-family:inherit;\"><p style=\"font-size:14px;line-height:16px;word-break:break-word;\" data-mce-style=\"font-size:14px;line-height:16px;word-break:break-word;\"><strong><span style=\"font-size:16px;line-height:19px;\" data-mce-style=\"font-size:16px;line-height:19px;\">DALILA BONOMI</span></strong></p></div>",
                      "style": {
                        "color": "#8a3b8f",
                        "font-family": "inherit",
                        "line-height": "120%"
                      }
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-text",
                  "uuid": "b37a5a73-5f40-4e2d-8d7b-6a117aa686eb"
                },
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnDesktop": false,
                      "hideContentOnMobile": false
                    },
                    "style": {
                      "padding-bottom": "5px",
                      "padding-left": "15px",
                      "padding-right": "0px",
                      "padding-top": "10px"
                    },
                    "text": {
                      "computedStyle": {
                        "linkColor": "#8a3b8f"
                      },
                      "html": "<div class=\"txtTinyMce-wrapper\" style=\"font-size:12px;line-height:21px;font-family:inherit;\" data-mce-style=\"font-size:12px;line-height:21px;font-family:inherit;\"><p style=\"font-size:14px;line-height:25px;word-break:break-word;text-align:left;\" data-mce-style=\"font-size:14px;line-height:25px;word-break:break-word;text-align:left;\"><strong><span style=\"font-size:16px;line-height:28px;\" data-mce-style=\"font-size:16px;line-height:28px;\">BEE | The email &amp; page builder for everyone.</span></strong></p><p style=\"line-height:21px;word-break:break-word;\" data-mce-style=\"line-height:21px;word-break:break-word;\"><span style=\"font-size:16px;line-height:28px;\" data-mce-style=\"font-size:16px;line-height:28px;\">Design Researcher</span></p></div>",
                      "style": {
                        "color": "#454562",
                        "font-family": "inherit",
                        "line-height": "180%"
                      }
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-text",
                  "uuid": "a916773b-42f4-4efc-af64-3b2a9f801015"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "bc078241-a4ab-4a26-b28b-b7aba3180d3a"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 706433,
            "dateCreated": "2022-01-31T09:21:17.612857Z",
            "dateModified": "2022-01-31T09:21:20.633639Z",
            "description": "",
            "idParent": null,
            "name": "Dalila single sign",
            "slug": "dalila-single-sign",
            "uuid": "37bceb9d-b1c9-4724-b5ad-31645653d1c2"
          },
          "synced": false,
          "type": "two-columns-3-9-empty",
          "uuid": "3218627f-a68a-4f5d-b3e9-adfa19bb82ec"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "align": "center",
                      "hideContentOnMobile": false
                    },
                    "divider": {
                      "style": {
                        "border-top": "0px solid transparent",
                        "height": "50px",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider",
                  "uuid": "5a247632-900c-4a38-8bf1-2307938d9bb5"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "ecfdb53f-a7a0-40dd-9fd9-67d7e2677832"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "synced": false,
          "type": "one-column-empty",
          "uuid": "feb66cab-ac4a-4ec2-b5d6-657eeabd1039"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnDesktop": false,
                      "hideContentOnMobile": false,
                      "iconHeight": "16px",
                      "iconSpacing": {
                        "padding-bottom": "5px",
                        "padding-left": "5px",
                        "padding-right": "6px",
                        "padding-top": "5px"
                      },
                      "itemsSpacing": "0px"
                    },
                    "iconsList": {
                      "icons": [
                        {
                          "alt": "Designed with BEE",
                          "height": "325px",
                          "href": "https://beefree.io/",
                          "id": "1879a39d-9303-43e5-8458-990ac7b0a429",
                          "image": "https://d15k2d11r6t6rl.cloudfront.net/public/users/Integrators/BeeProAgency/53601_510656/Signature/bee_w.png",
                          "target": "_blank",
                          "text": "Designed with BEE",
                          "textPosition": "right",
                          "title": "Designed with BEE",
                          "width": "325px"
                        }
                      ]
                    },
                    "style": {
                      "color": "#ffffff",
                      "font-family": "inherit",
                      "font-size": "15px",
                      "padding-bottom": "5px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "5px",
                      "text-align": "center"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-icons",
                  "uuid": "35f3f7a2-37aa-4471-bd26-ce2b51e6e39b"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "8d6cbc30-0a36-4037-ae02-827d71033fee"
            }
          ],
          "container": {
            "style": {
              "background-color": "#8a3b8f",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 706433,
            "dateCreated": "2022-01-20T09:44:21.371097Z",
            "dateModified": "2022-01-20T11:01:58.708887Z",
            "description": "",
            "idParent": null,
            "name": "Designed with BEE",
            "slug": "designed-with-bee",
            "thumb_large": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/727e515b-7455-4661-8e85-22b9f7178d3f_large.jpg",
            "thumb_medium": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/727e515b-7455-4661-8e85-22b9f7178d3f_medium.jpg",
            "thumb_small": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/727e515b-7455-4661-8e85-22b9f7178d3f_small.jpg",
            "uuid": "727e515b-7455-4661-8e85-22b9f7178d3f"
          },
          "synced": false,
          "type": "one-column-empty",
          "uuid": "cc615b28-4773-45ef-b0bf-4ef7ef89b1bf"
        }
      ],
      "template": {
        "name": "template-base",
        "type": "basic",
        "version": "2.0.0"
      },
      "title": ""
    },
    "comments": {
      "31878122-0ce6-4ac0-930e-ccf6086c264c": {
        "author": {
          "userColor": "#85b2c3",
          "userHandle": "515751",
          "username": "Cinzia Caleffi"
        },
        "content": "<code contenteditable=\"false\" data-bee-mention-uid=\"274606\">@Dalila Bonomi</code> <code contenteditable=\"false\" data-bee-mention-uid=\"264431\">@Cinzia Caleffi</code> ei",
        "elementId": "9664b8a4-b3c0-401d-be92-6a0dc5022591",
        "mentions": [
          "274606",
          "264431"
        ],
        "parentCommentId": null,
        "responses": [],
        "timestamp": "2022-08-03T06:54:12.900Z",
        "isElementDeleted": true
      },
      "aa9ea85d-1cdd-49b4-90d0-a42fb87d0a44": {
        "author": {
          "userColor": "#85b2c3",
          "userHandle": "515751",
          "username": "Cinzia Caleffi"
        },
        "content": "<code contenteditable=\"false\" data-bee-mention-uid=\"274606\">@Dalila Bonomi</code> <code contenteditable=\"false\" data-bee-mention-uid=\"264431\">@Cinzia Caleffi</code> test",
        "elementId": null,
        "mentions": [
          "274606",
          "264431"
        ],
        "parentCommentId": null,
        "responses": [],
        "timestamp": "2022-08-03T06:55:03.335Z",
        "isElementDeleted": null
      }
    }
  }
}
{
  "message": "Success"
}

Generate a Summary with AI

post

Submit your JSON template as the request body to generate a custom and concise summary using AI.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
Responses
200

Successful response

application/json
Responseobject
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/summary
POST /v1/{collection}/summary HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 19931

{
  "options": {
    "model": "gpt-3.5-turbo",
    "toneOfVoice": "",
    "length": "concise",
    "instructions": "",
    "reportUsage": true,
    "language": "it-IT"
  },
  "template": {
    "page": {
      "body": {
        "container": {
          "style": {
            "background-color": "#fff",
            "background-image": "none",
            "background-position": "top left",
            "background-repeat": "no-repeat",
            "background-size": "auto"
          }
        },
        "content": {
          "computedStyle": {
            "linkColor": "#8a3b8f",
            "messageBackgroundColor": "transparent",
            "messageWidth": "650px"
          },
          "style": {
            "color": "#000000",
            "font-family": "Lato, Tahoma, Verdana, Segoe, sans-serif"
          }
        },
        "type": "mailup-bee-page-properties",
        "webFonts": [
          {
            "fontFamily": "'Lato', Tahoma, Verdana, Segoe, sans-serif",
            "name": "Lato",
            "url": "https://fonts.googleapis.com/css?family=Lato"
          }
        ]
      },
      "description": "",
      "rows": [
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "align": "center",
                      "hideContentOnMobile": false
                    },
                    "divider": {
                      "style": {
                        "border-top": "0px solid transparent",
                        "height": "10px",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider",
                  "uuid": "b89c3d25-dbec-439a-8ad1-4939a28678e9"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "0px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "0px"
              },
              "uuid": "3bd72010-5175-4326-b848-8beacea852d6"
            }
          ],
          "container": {
            "style": {
              "background-color": "#8a3b8f",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 625122,
            "dateCreated": "2022-01-20T09:49:32.875165Z",
            "dateModified": "2022-01-20T09:49:32.875165Z",
            "description": "",
            "idParent": null,
            "name": "Pre header purple row",
            "slug": "pre-header-purple-row",
            "thumb_large": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/8b99691b-8e39-47a7-8773-4540cd7ff113_large.jpg",
            "thumb_medium": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/8b99691b-8e39-47a7-8773-4540cd7ff113_medium.jpg",
            "thumb_small": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/8b99691b-8e39-47a7-8773-4540cd7ff113_small.jpg",
            "uuid": "8b99691b-8e39-47a7-8773-4540cd7ff113"
          },
          "synced": false,
          "type": "one-column-empty",
          "uuid": "7fa3e6c4-ac4f-421f-b9eb-db1b9f629fb3"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "class": "left fixedwidth",
                      "width": "162.5px"
                    },
                    "image": {
                      "alt": "BEE Pro Logo",
                      "height": "109px",
                      "href": "https://beefree.io/",
                      "percWidth": 25,
                      "prefix": "",
                      "src": "https://d15k2d11r6t6rl.cloudfront.net/public/users/Integrators/BeeProAgency/53601_655907/editor_images/BEEPro_logo_2.png",
                      "target": "_self",
                      "width": "291px"
                    },
                    "style": {
                      "padding-bottom": "40px",
                      "padding-left": "20px",
                      "padding-right": "20px",
                      "padding-top": "20px",
                      "width": "100%"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-image",
                  "uuid": "cc54124d-97bd-44e0-b15e-710a577840ec"
                },
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "align": "center"
                    },
                    "divider": {
                      "style": {
                        "border-top": "1px dotted #CCCCCC",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "20px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "15px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider",
                  "uuid": "2cd36842-fbe8-4f43-9688-ff6c964aaa89"
                },
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnHtml": false,
                      "hideContentOnMobile": false
                    },
                    "paragraph": {
                      "computedStyle": {
                        "linkColor": "#0068a5",
                        "paragraphSpacing": "16px"
                      },
                      "html": "<p>Hi 🙂</p>\n<p><strong>Would you be interested to participate in a user research project with us?</strong></p>\n<p>The research will consist of a video call. It usually takes 30 to 45 minutes maximum, but we schedule 1 hour in case we need more time. We'll be asking questions about you, your team, and your email/page creation workflow. The idea is for us to understand how BEE Pro fits in your work day.</p>\n<p><strong>Sounds good?</strong> Pick a time slot at your convenience using <a href=\"https://calendly.com/beepro-product-team/beepro-interview?month=2022-06\" target=\"_blank\" rel=\"noopener\" style=\"text-decoration: underline;\">this link ↗</a></p>\n<p>Look forward to hearing back from you.</p>\n<p>Best,</p>\n<p>Dalila from the Product Team 💜</p>\n<p>P.S. Probably your colleagues that use BEE Pro have received this email too. If you'd like you can add one guest to the booking link and participate together, or you can join us alone. We would love to talk to you in any case.&nbsp;</p>",
                      "style": {
                        "color": "#000000",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "14px",
                        "font-weight": "400",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "text-align": "left"
                      },
                      "translations": {
                        "de-DE": {
                          "html": "<p>Hallo 🙂<br /><br />Is het interessant om deel te nemen aan een onderzoek naar nieuwe gebruikersonderzoeken?<br /><br />Het onderzoek bestaat uit een videofilm. Wacht tussen 30 en 45 minuten als het maximum, maar het programma duurt 1 uur voordat u meer tijd nodig heeft. De haremos worden nu gebruikt, uw uitrusting en uw vloeiende creatie van pagina's/correos elektronische. Het idee is dat BEE Pro op zijn werk werkt.<br /><br />&iquest;Suena bien? Elija un horario de su conveniencia usando este enlace ↗<br />Esperamos tener noticias suyas.<br /><br />Groot,<br /><br />Dalila del equipo de producto 💜<br /><br /><br />PD Waarschijnlijk is uw partner die BEE Pro gebruikt, deze recibido is elektrisch correct. Als je dit hebt gedaan, kun je een uitnodiging voor het reserveren en de deelname aan de wedstrijd verzamelen, of je kunt een nieuwe solo spelen. Geen enkele gebeurtenis wordt in een ander geval verwisseld.</p>"
                        },
                        "es-ES": {
                          "html": "<p>Hola 🙂<br /><br />&iquest;Estar&iacute;a interesado en participar en un proyecto de investigaci&oacute;n de usuarios con nosotros?<br /><br />La investigaci&oacute;n consistir&aacute; en una videollamada. Suele tardar entre 30 y 45 minutos como m&aacute;ximo, pero programamos 1 hora por si necesitamos m&aacute;s tiempo. Le haremos preguntas sobre usted, su equipo y su flujo de trabajo de creaci&oacute;n de p&aacute;ginas/correos electr&oacute;nicos. La idea es que entendamos c&oacute;mo encaja BEE Pro en su jornada laboral.<br /><br /><br />&iquest;Suena bien? Elija un horario de su conveniencia usando este enlace ↗<br />Esperamos tener noticias suyas.<br /><br /><br />Mejor,<br /><br />Dalila del equipo de producto 💜<br /><br /><br /><br />PD Probablemente tus compa&ntilde;eros que utilizan BEE Pro tambi&eacute;n hayan recibido este correo electr&oacute;nico. Si lo desea, puede agregar un invitado al enlace de reserva y participar juntos, o puede unirse a nosotros solo. Nos encantar&iacute;a hablar con usted en cualquier caso.</p>"
                        }
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "uuid": "0456f2de-7125-475c-b016-41f77b3fda47"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "10px",
                "padding-right": "10px",
                "padding-top": "5px"
              },
              "uuid": "61614a04-eb36-4d98-b28e-c6c9e048877d"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 625122,
            "dateCreated": "2022-01-20T09:51:57.896884Z",
            "dateModified": "2022-01-20T09:51:57.896884Z",
            "description": "",
            "idParent": null,
            "name": "body with: logo + pre title + title + subtitle + body",
            "slug": "body-with-logo-pre-title-title-subtitle-body",
            "thumb_large": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/35d02430-32b2-41d6-a115-68d7bb476d64_large.jpg",
            "thumb_medium": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/35d02430-32b2-41d6-a115-68d7bb476d64_medium.jpg",
            "thumb_small": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/35d02430-32b2-41d6-a115-68d7bb476d64_small.jpg",
            "uuid": "35d02430-32b2-41d6-a115-68d7bb476d64"
          },
          "synced": false,
          "type": "two-columns-empty",
          "uuid": "f57920be-d9e4-41c0-a009-eb85fd2a8034"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "align": "center"
                    },
                    "divider": {
                      "style": {
                        "border-top": "1px dotted #CCCCCC",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "30px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "15px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider",
                  "uuid": "ab4460e6-1206-45c1-ba56-9f6d6409508e"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "6ac459ef-5e34-468a-b064-07ea57e1e37c"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 625122,
            "dateCreated": "2021-06-29T08:19:25.800829Z",
            "dateModified": "2021-06-29T08:19:27.572522Z",
            "description": "",
            "idParent": null,
            "name": "Footer Line",
            "slug": "footer-line",
            "uuid": "77127825-a508-4127-9155-b5161f9e1703"
          },
          "synced": false,
          "type": "row-1-columns-12",
          "uuid": "b759c29c-fb9e-4b1a-add9-a464eeb568f5"
        },
        {
          "columns": [
            {
              "grid-columns": 3,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "class": "left fixedwidth",
                      "width": "130px"
                    },
                    "image": {
                      "alt": "Elena Loatelli & Dalila Bonomi",
                      "height": "263px",
                      "href": "",
                      "percWidth": 80,
                      "prefix": "",
                      "src": "https://d15k2d11r6t6rl.cloudfront.net/public/users/Integrators/BeeProAgency/53601_655907/editor_images/dalila.png",
                      "target": "_self",
                      "width": "263px"
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "15px",
                      "padding-right": "0px",
                      "padding-top": "5px",
                      "width": "100%"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-image",
                  "uuid": "682c9273-3090-43fb-9acc-a2e2cda857b7"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "a434440b-92d8-4841-90cc-2ab49b1afc14"
            },
            {
              "grid-columns": 9,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnMobile": false
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "15px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    },
                    "text": {
                      "computedStyle": {
                        "linkColor": "#8a3b8f"
                      },
                      "html": "<div class=\"txtTinyMce-wrapper\" style=\"font-size:14px;line-height:16px;font-family:inherit;\" data-mce-style=\"font-size:14px;line-height:16px;font-family:inherit;\"><p style=\"font-size:14px;line-height:16px;word-break:break-word;\" data-mce-style=\"font-size:14px;line-height:16px;word-break:break-word;\"><strong><span style=\"font-size:16px;line-height:19px;\" data-mce-style=\"font-size:16px;line-height:19px;\">DALILA BONOMI</span></strong></p></div>",
                      "style": {
                        "color": "#8a3b8f",
                        "font-family": "inherit",
                        "line-height": "120%"
                      }
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-text",
                  "uuid": "b37a5a73-5f40-4e2d-8d7b-6a117aa686eb"
                },
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnDesktop": false,
                      "hideContentOnMobile": false
                    },
                    "style": {
                      "padding-bottom": "5px",
                      "padding-left": "15px",
                      "padding-right": "0px",
                      "padding-top": "10px"
                    },
                    "text": {
                      "computedStyle": {
                        "linkColor": "#8a3b8f"
                      },
                      "html": "<div class=\"txtTinyMce-wrapper\" style=\"font-size:12px;line-height:21px;font-family:inherit;\" data-mce-style=\"font-size:12px;line-height:21px;font-family:inherit;\"><p style=\"font-size:14px;line-height:25px;word-break:break-word;text-align:left;\" data-mce-style=\"font-size:14px;line-height:25px;word-break:break-word;text-align:left;\"><strong><span style=\"font-size:16px;line-height:28px;\" data-mce-style=\"font-size:16px;line-height:28px;\">BEE | The email &amp; page builder for everyone.</span></strong></p><p style=\"line-height:21px;word-break:break-word;\" data-mce-style=\"line-height:21px;word-break:break-word;\"><span style=\"font-size:16px;line-height:28px;\" data-mce-style=\"font-size:16px;line-height:28px;\">Design Researcher</span></p></div>",
                      "style": {
                        "color": "#454562",
                        "font-family": "inherit",
                        "line-height": "180%"
                      }
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-text",
                  "uuid": "a916773b-42f4-4efc-af64-3b2a9f801015"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "bc078241-a4ab-4a26-b28b-b7aba3180d3a"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 706433,
            "dateCreated": "2022-01-31T09:21:17.612857Z",
            "dateModified": "2022-01-31T09:21:20.633639Z",
            "description": "",
            "idParent": null,
            "name": "Dalila single sign",
            "slug": "dalila-single-sign",
            "uuid": "37bceb9d-b1c9-4724-b5ad-31645653d1c2"
          },
          "synced": false,
          "type": "two-columns-3-9-empty",
          "uuid": "3218627f-a68a-4f5d-b3e9-adfa19bb82ec"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "align": "center",
                      "hideContentOnMobile": false
                    },
                    "divider": {
                      "style": {
                        "border-top": "0px solid transparent",
                        "height": "50px",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-divider",
                  "uuid": "5a247632-900c-4a38-8bf1-2307938d9bb5"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "ecfdb53f-a7a0-40dd-9fd9-67d7e2677832"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "synced": false,
          "type": "one-column-empty",
          "uuid": "feb66cab-ac4a-4ec2-b5d6-657eeabd1039"
        },
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "align": "left",
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnDesktop": false,
                      "hideContentOnMobile": false,
                      "iconHeight": "16px",
                      "iconSpacing": {
                        "padding-bottom": "5px",
                        "padding-left": "5px",
                        "padding-right": "6px",
                        "padding-top": "5px"
                      },
                      "itemsSpacing": "0px"
                    },
                    "iconsList": {
                      "icons": [
                        {
                          "alt": "Designed with BEE",
                          "height": "325px",
                          "href": "https://beefree.io/",
                          "id": "1879a39d-9303-43e5-8458-990ac7b0a429",
                          "image": "https://d15k2d11r6t6rl.cloudfront.net/public/users/Integrators/BeeProAgency/53601_510656/Signature/bee_w.png",
                          "target": "_blank",
                          "text": "Designed with BEE",
                          "textPosition": "right",
                          "title": "Designed with BEE",
                          "width": "325px"
                        }
                      ]
                    },
                    "style": {
                      "color": "#ffffff",
                      "font-family": "inherit",
                      "font-size": "15px",
                      "padding-bottom": "5px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "5px",
                      "text-align": "center"
                    }
                  },
                  "locked": false,
                  "type": "mailup-bee-newsletter-modules-icons",
                  "uuid": "35f3f7a2-37aa-4471-bd26-ce2b51e6e39b"
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "8d6cbc30-0a36-4037-ae02-827d71033fee"
            }
          ],
          "container": {
            "style": {
              "background-color": "#8a3b8f",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "650px"
            }
          },
          "empty": false,
          "locked": false,
          "metadata": {
            "category": 706433,
            "dateCreated": "2022-01-20T09:44:21.371097Z",
            "dateModified": "2022-01-20T11:01:58.708887Z",
            "description": "",
            "idParent": null,
            "name": "Designed with BEE",
            "slug": "designed-with-bee",
            "thumb_large": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/727e515b-7455-4661-8e85-22b9f7178d3f_large.jpg",
            "thumb_medium": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/727e515b-7455-4661-8e85-22b9f7178d3f_medium.jpg",
            "thumb_small": "https://pro-bee-beepro-thumbnails.s3.amazonaws.com/templates/saved-rows/53601/655907/727e515b-7455-4661-8e85-22b9f7178d3f_small.jpg",
            "uuid": "727e515b-7455-4661-8e85-22b9f7178d3f"
          },
          "synced": false,
          "type": "one-column-empty",
          "uuid": "cc615b28-4773-45ef-b0bf-4ef7ef89b1bf"
        }
      ],
      "template": {
        "name": "template-base",
        "type": "basic",
        "version": "2.0.0"
      },
      "title": ""
    },
    "comments": {
      "31878122-0ce6-4ac0-930e-ccf6086c264c": {
        "author": {
          "userColor": "#85b2c3",
          "userHandle": "515751",
          "username": "Cinzia Caleffi"
        },
        "content": "<code contenteditable=\"false\" data-bee-mention-uid=\"274606\">@Dalila Bonomi</code> <code contenteditable=\"false\" data-bee-mention-uid=\"264431\">@Cinzia Caleffi</code> ei",
        "elementId": "9664b8a4-b3c0-401d-be92-6a0dc5022591",
        "mentions": [
          "274606",
          "264431"
        ],
        "parentCommentId": null,
        "responses": [],
        "timestamp": "2022-08-03T06:54:12.900Z",
        "isElementDeleted": true
      },
      "aa9ea85d-1cdd-49b4-90d0-a42fb87d0a44": {
        "author": {
          "userColor": "#85b2c3",
          "userHandle": "515751",
          "username": "Cinzia Caleffi"
        },
        "content": "<code contenteditable=\"false\" data-bee-mention-uid=\"274606\">@Dalila Bonomi</code> <code contenteditable=\"false\" data-bee-mention-uid=\"264431\">@Cinzia Caleffi</code> test",
        "elementId": null,
        "mentions": [
          "274606",
          "264431"
        ],
        "parentCommentId": null,
        "responses": [],
        "timestamp": "2022-08-03T06:55:03.335Z",
        "isElementDeleted": null
      }
    }
  }
}
{
  "message": "Success"
}

Convert Email JSON to Page JSON

post

Convert an email JSON template to a page JSON template, and ensure compatibility throughout the conversion process by removing or adjusting unsupported blocks.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
Responses
200

Successful response

application/json
Responseobject
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/email-to-page
POST /v1/{collection}/email-to-page HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 3810

{
  "template": {
    "page": {
      "body": {
        "container": {
          "style": {
            "background-color": "#FFFFFF"
          }
        },
        "content": {
          "computedStyle": {
            "linkColor": "#0068A5",
            "messageBackgroundColor": "transparent",
            "messageWidth": "500px"
          },
          "style": {
            "color": "#000000",
            "font-family": "Arial, Helvetica, sans-serif"
          }
        },
        "type": "mailup-bee-page-properties",
        "webFonts": []
      },
      "description": "Empty template for BEE",
      "rows": [
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "type": "mailup-bee-newsletter-modules-paragraph",
                  "descriptor": {
                    "paragraph": {
                      "html": "<p>I'm a new paragraph block.</p>",
                      "style": {
                        "color": "#000000",
                        "font-size": "14px",
                        "font-family": "inherit",
                        "font-weight": "400",
                        "line-height": "120%",
                        "text-align": "left",
                        "direction": "ltr",
                        "letter-spacing": "0px"
                      },
                      "computedStyle": {
                        "linkColor": "#0068A5",
                        "paragraphSpacing": "16px"
                      }
                    },
                    "style": {
                      "padding-top": "10px",
                      "padding-right": "10px",
                      "padding-bottom": "10px",
                      "padding-left": "10px"
                    },
                    "mobileStyle": {},
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnHtml": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnMobile": false
                    }
                  },
                  "uuid": "c8ecedba-4891-46fa-9aec-1f4ef3276914",
                  "locked": false
                },
                {
                  "type": "mailup-bee-newsletter-modules-image",
                  "descriptor": {
                    "image": {
                      "alt": "",
                      "src": "https://d153pg9b3vec03.cloudfront.net/public/users/Integrators/41032f14-a2c0-4389-842f-81e67db90a66/Marco/download.png",
                      "href": "",
                      "target": "_blank",
                      "width": "110px",
                      "height": "110px"
                    },
                    "style": {
                      "width": "100%",
                      "border-radius": "0px",
                      "padding-top": "0px",
                      "padding-right": "0px",
                      "padding-bottom": "0px",
                      "padding-left": "0px"
                    },
                    "computedStyle": {
                      "class": "center autowidth",
                      "width": "110px",
                      "hideContentOnMobile": false
                    },
                    "mobileStyle": {}
                  },
                  "uuid": "bf5b394e-e238-40cf-9c45-69866139490c",
                  "locked": false
                },
                {
                  "type": "mailup-bee-newsletter-modules-table",
                  "descriptor": {
                    "table": {
                      "content": {
                        "headers": [
                          {
                            "cells": [
                              {
                                "html": "a"
                              },
                              {
                                "html": "a"
                              },
                              {
                                "html": "a"
                              }
                            ]
                          }
                        ],
                        "rows": [
                          {
                            "cells": [
                              {
                                "html": "Add text"
                              },
                              {
                                "html": ""
                              },
                              {
                                "html": ""
                              }
                            ]
                          },
                          {
                            "cells": [
                              {
                                "html": ""
                              },
                              {
                                "html": ""
                              },
                              {
                                "html": ""
                              }
                            ]
                          },
                          {
                            "cells": [
                              {
                                "html": ""
                              },
                              {
                                "html": ""
                              },
                              {
                                "html": ""
                              }
                            ]
                          }
                        ]
                      },
                      "style": {
                        "color": "#000000",
                        "font-size": "14px",
                        "font-family": "inherit",
                        "font-weight": "400",
                        "line-height": "120%",
                        "text-align": "left",
                        "direction": "ltr",
                        "letter-spacing": "0px",
                        "background-color": "transparent",
                        "border-top": "1px solid #dddddd",
                        "border-right": "1px solid #dddddd",
                        "border-bottom": "1px solid #dddddd",
                        "border-left": "1px solid #dddddd"
                      },
                      "computedStyle": {
                        "linkColor": "#0068A5",
                        "headersFontSize": "14px",
                        "headersFontWeight": "400",
                        "headersTextAlign": "left",
                        "headersBackgroundColor": "#EAEAEA",
                        "headersColor": "#505659"
                      }
                    },
                    "style": {
                      "padding-top": "10px",
                      "padding-right": "10px",
                      "padding-bottom": "10px",
                      "padding-left": "10px"
                    },
                    "mobileStyle": {},
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnHtml": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnMobile": false
                    }
                  },
                  "uuid": "77957748-6069-40bd-9342-14f0b514f244",
                  "locked": false
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "9cb47b70-8e2f-4e12-b79b-511f3c7b0dae"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "500px"
            }
          },
          "empty": false,
          "locked": false,
          "synced": false,
          "type": "row-1-columns-12",
          "uuid": "ae43b807-1a9d-4f1f-888d-798f74ec54b3"
        }
      ],
      "template": {
        "name": "template-base",
        "type": "basic",
        "version": "2.0.0"
      },
      "title": "Empty Template"
    }
  }
}
{
  "message": "Success"
}

Convert Page JSON to Email JSON

post

Convert a page JSON template to an email JSON template, and ensure compatibility throughout the conversion process by removing or adjusting unsupported blocks.

Authorizations
Path parameters
collectionstringRequired

The collection ID or name

Body
disableHtmlSanitizerintegerOptional

An integer field for disableHtmlSanitizer

Responses
200

Successful response

application/json
Responseobject
400

Bad request

401

Unauthorized

403

Forbidden

500

Internal Server Error

post
/v1/{collection}/page-to-email
POST /v1/{collection}/page-to-email HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 2705

{
  "disableHtmlSanitizer": true,
  "template": {
    "page": {
      "body": {
        "container": {
          "style": {
            "background-color": "#FFFFFF"
          }
        },
        "content": {
          "computedStyle": {
            "linkColor": "#0068A5",
            "messageBackgroundColor": "transparent",
            "messageWidth": "500px"
          },
          "style": {
            "color": "#000000",
            "font-family": "Arial, Helvetica, sans-serif"
          }
        },
        "type": "mailup-bee-page-properties",
        "webFonts": []
      },
      "description": "Empty template for BEE",
      "rows": [
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "type": "mailup-bee-newsletter-modules-html",
                  "descriptor": {
                    "html": {
                      "html": "<div class=\"our-class\"><script>console.log(\"ok\");</script>test 1</div>"
                    },
                    "style": {
                      "padding-top": "0px",
                      "padding-right": "0px",
                      "padding-bottom": "0px",
                      "padding-left": "0px"
                    },
                    "computedStyle": {
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnAmp": false,
                      "hideContentOnHtml": false
                    }
                  },
                  "uuid": "f6c6a079-dd90-4589-8855-93dfdf74461d",
                  "locked": false
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "cbd74fa2-b853-449e-88b8-f34195441c05"
            },
            {
              "grid-columns": 12,
              "modules": [
                {
                  "type": "mailup-bee-newsletter-modules-html",
                  "descriptor": {
                    "html": {
                      "html": "<div class=\"our-class\"><script>console.log(\"ok\");</script>test 2</div>"
                    },
                    "style": {
                      "padding-top": "0px",
                      "padding-right": "0px",
                      "padding-bottom": "0px",
                      "padding-left": "0px"
                    },
                    "computedStyle": {
                      "hideContentOnMobile": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnAmp": false,
                      "hideContentOnHtml": false
                    }
                  },
                  "uuid": "f6c6a079-dd90-4589-8855-93dfdf74461d",
                  "locked": false
                }
              ],
              "style": {
                "background-color": "transparent",
                "border-bottom": "0px solid transparent",
                "border-left": "0px solid transparent",
                "border-right": "0px solid transparent",
                "border-top": "0px solid transparent",
                "padding-bottom": "5px",
                "padding-left": "0px",
                "padding-right": "0px",
                "padding-top": "5px"
              },
              "uuid": "cbd74fa2-b853-449e-88b8-f34195441c05"
            }
          ],
          "container": {
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat"
            }
          },
          "content": {
            "computedStyle": {
              "hideContentOnDesktop": false,
              "hideContentOnMobile": false,
              "rowColStackOnMobile": true,
              "rowReverseColStackOnMobile": false,
              "verticalAlign": "top"
            },
            "style": {
              "background-color": "transparent",
              "background-image": "none",
              "background-position": "top left",
              "background-repeat": "no-repeat",
              "color": "#000000",
              "width": "500px"
            }
          },
          "empty": false,
          "locked": false,
          "synced": false,
          "type": "row-1-columns-12",
          "uuid": "d0a914f7-7212-41c6-9372-c954886e6bd4"
        }
      ],
      "template": {
        "name": "template-base",
        "type": "basic",
        "version": "2.0.0"
      },
      "title": "Empty Template"
    }
  }
}
{
  "message": "Success"
}

Get a List of All Templates

get

Retrieve a list of all templates in the catalog.

Authorizations
Responses
200

Successful response

application/json
ResponsestringExample: {"count":1726,"next":"https://api.getbee.io/v1/catalog/templates/?page=2","previous":null,"results":[{"categories":["others"],"collections":"","context":"free","description":"","short_description":"","designer":"beefree-team","id":"empty","is_blank":true,"template_type":"email","order":"99999999","published_at":"2017-08-28","tags":["black","light","promote","serif","two-column","white"],"thumbnail_large":"https://d1oco4z2z1fhwp.cloudfront.net/templates/default/1_large.jpg","thumbnail":"https://d1oco4z2z1fhwp.cloudfront.net/templates/default/1.jpg","title":"Empty"},{"categories":["others"],"collections":"","context":"free","description":"","short_description":"","designer":"beefree-team","id":"empty-page","is_blank":true,"template_type":"page","order":"99999998","published_at":"2021-07-19","tags":[],"thumbnail_large":"https://d1oco4z2z1fhwp.cloudfront.net/templates/default/4246_large.jpg","thumbnail":"https://d1oco4z2z1fhwp.cloudfront.net/templates/default/4246.jpg","title":"Empty Page"}],"facets":{"categories":[{"id":"events","name":"Events","parent":"usage","count":353},{"id":"seasonal-promotion","name":"Seasonal Promotion","parent":"seasonal","count":345},{"id":"e-commerce","name":"E-commerce","parent":"industry","count":316}]}}
400

Bad request. The request could not be understood or was missing required parameters.

401

Unauthorized. Authentication is required and has failed or has not been provided.

403

Forbidden. The request was valid, but the server is refusing action.

500

Internal Server Error. An unexpected condition was encountered.

get
/v1/catalog/templates
GET /v1/catalog/templates HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "count": 1726,
  "next": "https://api.getbee.io/v1/catalog/templates/?page=2",
  "previous": null,
  "results": [
    {
      "categories": [
        "others"
      ],
      "collections": "",
      "context": "free",
      "description": "",
      "short_description": "",
      "designer": "beefree-team",
      "id": "empty",
      "is_blank": true,
      "template_type": "email",
      "order": "99999999",
      "published_at": "2017-08-28",
      "tags": [
        "black",
        "light",
        "promote",
        "serif",
        "two-column",
        "white"
      ],
      "thumbnail_large": "https://d1oco4z2z1fhwp.cloudfront.net/templates/default/1_large.jpg",
      "thumbnail": "https://d1oco4z2z1fhwp.cloudfront.net/templates/default/1.jpg",
      "title": "Empty"
    },
    {
      "categories": [
        "others"
      ],
      "collections": "",
      "context": "free",
      "description": "",
      "short_description": "",
      "designer": "beefree-team",
      "id": "empty-page",
      "is_blank": true,
      "template_type": "page",
      "order": "99999998",
      "published_at": "2021-07-19",
      "tags": [],
      "thumbnail_large": "https://d1oco4z2z1fhwp.cloudfront.net/templates/default/4246_large.jpg",
      "thumbnail": "https://d1oco4z2z1fhwp.cloudfront.net/templates/default/4246.jpg",
      "title": "Empty Page"
    }
  ],
  "facets": {
    "categories": [
      {
        "id": "events",
        "name": "Events",
        "parent": "usage",
        "count": 353
      },
      {
        "id": "seasonal-promotion",
        "name": "Seasonal Promotion",
        "parent": "seasonal",
        "count": 345
      },
      {
        "id": "e-commerce",
        "name": "E-commerce",
        "parent": "industry",
        "count": 316
      }
    ]
  }
}

Get a Template

get

Get a specific template from the catalog.

Authorizations
Responses
200

Successful response

application/json
ResponsestringExample: {"message":"Success"}
400

Bad request. The request could not be understood or was missing required parameters.

401

Unauthorized. Authentication is required and has failed or has not been provided.

403

Forbidden. The request was valid, but the server is refusing action.

500

Internal Server Error. An unexpected condition was encountered.

get
/v1/catalog/templates/:slug
GET /v1/catalog/templates/:slug HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "message": "Success"
}

Get a List of Categories

get

Get a list of categories from the catalog.

Authorizations
Responses
200

Successful response

application/json
ResponsestringExample: {"count":114,"next":null,"previous":null,"results":[{"bg_color":"#F8F8F8","fb_color":"#333A45","highlighted":false,"icon":null,"id":"leap-year","image":null,"name":"Leap Year","description":"Make every extra day count with our Leap Year email templates. Whether you're celebrating a special promotion, organizing an exclusive event, or simply seizing the opportunity for a unique marketing campaign, our templates are designed to make your Leap Year messages stand out.","short_description":"Engage your audience with visually appealing designs that capture the essence of this rare occurrence.","parent":"seasonal"}]}
400

Bad request. The request could not be understood or was missing required parameters.

401

Unauthorized. Authentication is required and has failed or has not been provided.

403

Forbidden. The request was valid, but the server is refusing action.

500

Internal Server Error. An unexpected condition was encountered.

get
/v1/catalog/categories
GET /v1/catalog/categories HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "count": 114,
  "next": null,
  "previous": null,
  "results": [
    {
      "bg_color": "#F8F8F8",
      "fb_color": "#333A45",
      "highlighted": false,
      "icon": null,
      "id": "leap-year",
      "image": null,
      "name": "Leap Year",
      "description": "Make every extra day count with our Leap Year email templates. Whether you're celebrating a special promotion, organizing an exclusive event, or simply seizing the opportunity for a unique marketing campaign, our templates are designed to make your Leap Year messages stand out.",
      "short_description": "Engage your audience with visually appealing designs that capture the essence of this rare occurrence.",
      "parent": "seasonal"
    }
  ]
}

Get a Category

get

Retrieve a specific category in the catalog.

Authorizations
Responses
200

Successful response

application/json
ResponsestringExample: {"bg_color":"#F8F8F8","fb_color":"#333A45","highlighted":false,"icon":null,"id":"fashion-week","image":null,"name":"Fashion Week","description":"Strut into the spotlight of style with our Fashion Week email templates. Whether you're unveiling a new collection or promoting exclusive runway-inspired deals, these templates offer a chic and visually captivating platform to make your mark during the most fashionable moments.","short_description":"Stand out this Fashion Week with our email and page templates","parent":"seasonal"}
400

Bad request. The request could not be understood or was missing required parameters.

401

Unauthorized. Authentication is required and has failed or has not been provided.

403

Forbidden. The request was valid, but the server is refusing action.

500

Internal Server Error. An unexpected condition was encountered.

get
/v1/catalog/categories/:slug
GET /v1/catalog/categories/:slug HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "bg_color": "#F8F8F8",
  "fb_color": "#333A45",
  "highlighted": false,
  "icon": null,
  "id": "fashion-week",
  "image": null,
  "name": "Fashion Week",
  "description": "Strut into the spotlight of style with our Fashion Week email templates. Whether you're unveiling a new collection or promoting exclusive runway-inspired deals, these templates offer a chic and visually captivating platform to make your mark during the most fashionable moments.",
  "short_description": "Stand out this Fashion Week with our email and page templates",
  "parent": "seasonal"
}

Get a List of Collections

get

Get a list of collections from the catalog.

Authorizations
Responses
200

Successful response

application/json
ResponsestringExample: {"count":19,"next":"https://api.getbee.io/v1/catalog/collections?page=2&pagesize=10","previous":null,"results":[{"bg_color":"#E8F8D4","description":"A Beefree collection is a set of templates focused on a specific communication need. Whether you need to create an automated email sequence to onboard new customers, launch a new product, or dress up transactional messages for your online store, Beefree collections will help you hit the ground running and achieve your goals faster.","short_description":"","fg_color":"#140244","highlighted":false,"icon_url":"https://d1oco4z2z1fhwp.cloudfront.net/collections/real-estate_icon.svg","id":"real-estate","image_url":"https://d1oco4z2z1fhwp.cloudfront.net/collections/Real-Estate-TC.png","name":"Real Estate","order":"0"}]}
400

Bad request. The request could not be understood or was missing required parameters.

401

Unauthorized. Authentication is required and has failed or has not been provided.

403

Forbidden. The request was valid, but the server is refusing action.

500

Internal Server Error. An unexpected condition was encountered.

get
/v1/catalog/collections
GET /v1/catalog/collections HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "count": 19,
  "next": "https://api.getbee.io/v1/catalog/collections?page=2&pagesize=10",
  "previous": null,
  "results": [
    {
      "bg_color": "#E8F8D4",
      "description": "A Beefree collection is a set of templates focused on a specific communication need. Whether you need to create an automated email sequence to onboard new customers, launch a new product, or dress up transactional messages for your online store, Beefree collections will help you hit the ground running and achieve your goals faster.",
      "short_description": "",
      "fg_color": "#140244",
      "highlighted": false,
      "icon_url": "https://d1oco4z2z1fhwp.cloudfront.net/collections/real-estate_icon.svg",
      "id": "real-estate",
      "image_url": "https://d1oco4z2z1fhwp.cloudfront.net/collections/Real-Estate-TC.png",
      "name": "Real Estate",
      "order": "0"
    }
  ]
}

Get a Collection

get

Retrieve a specific collection in the catalog.

Authorizations
Responses
200

Successful response

application/json
ResponsestringExample: {"bg_color":"#FBFBFB","description":"A Beefree collection is a set of templates focused on a specific communication need. Whether you need to create an automated email sequence to onboard new customers, launch a new product, or dress up transactional messages for your online store, Beefree collections will help you hit the ground running and achieve your goals faster.","short_description":"","fg_color":"#140242","highlighted":false,"icon_url":"https://d1oco4z2z1fhwp.cloudfront.net/collections/photo.svg","id":"photography","image_url":"https://d1oco4z2z1fhwp.cloudfront.net/collections/Photography-TC.png","name":"Photography","order":"0"}
400

Bad request. The request could not be understood or was missing required parameters.

401

Unauthorized. Authentication is required and has failed or has not been provided.

403

Forbidden. The request was valid, but the server is refusing action.

500

Internal Server Error. An unexpected condition was encountered.

get
/v1/catalog/collections/:slug
GET /v1/catalog/collections/:slug HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "bg_color": "#FBFBFB",
  "description": "A Beefree collection is a set of templates focused on a specific communication need. Whether you need to create an automated email sequence to onboard new customers, launch a new product, or dress up transactional messages for your online store, Beefree collections will help you hit the ground running and achieve your goals faster.",
  "short_description": "",
  "fg_color": "#140242",
  "highlighted": false,
  "icon_url": "https://d1oco4z2z1fhwp.cloudfront.net/collections/photo.svg",
  "id": "photography",
  "image_url": "https://d1oco4z2z1fhwp.cloudfront.net/collections/Photography-TC.png",
  "name": "Photography",
  "order": "0"
}

Get a List of Designers

get

Get a list of designers from the catalog.

Authorizations
Responses
200

Successful response

application/json
ResponsestringExample: {"count":34,"next":null,"previous":null,"results":[{"available":true,"avatar_url":"https://d1oco4z2z1fhwp.cloudfront.net/designers/LuanaLiguori.png","base":"Naples, Italy (GMT+2)","description":"Hello, I'm Luana, a graphic and web designer with 8+ years of experience, specializing in email and landing page design. My approach is marked by precision, proactive problem-solving, and strong collaboration. I create visually impactful designs that align with marketing strategies, including social media graphics, blog covers, and presentations. I also offer custom design services tailored to clients' unique needs.","short_description":"","display_name":"Luana Liguori","email":"[email protected]","first_name":"Luana","highlighted":false,"hobby":"","id":"luana-liguori","last_name":"Liguori","position":"Beefree In-House Designer","social_behance":"","social_dribbble":"","social_linkedin":"","website":"https://www.ilas.com/portfolio/20538400/luana-liguori"}]}
400

Bad request. The request could not be understood or was missing required parameters.

401

Unauthorized. Authentication is required and has failed or has not been provided.

403

Forbidden. The request was valid, but the server is refusing action.

500

Internal Server Error. An unexpected condition was encountered.

get
/v1/catalog/designers
GET /v1/catalog/designers HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "count": 34,
  "next": null,
  "previous": null,
  "results": [
    {
      "available": true,
      "avatar_url": "https://d1oco4z2z1fhwp.cloudfront.net/designers/LuanaLiguori.png",
      "base": "Naples, Italy (GMT+2)",
      "description": "Hello, I'm Luana, a graphic and web designer with 8+ years of experience, specializing in email and landing page design. My approach is marked by precision, proactive problem-solving, and strong collaboration. I create visually impactful designs that align with marketing strategies, including social media graphics, blog covers, and presentations. I also offer custom design services tailored to clients' unique needs.",
      "short_description": "",
      "display_name": "Luana Liguori",
      "email": "[email protected]",
      "first_name": "Luana",
      "highlighted": false,
      "hobby": "",
      "id": "luana-liguori",
      "last_name": "Liguori",
      "position": "Beefree In-House Designer",
      "social_behance": "",
      "social_dribbble": "",
      "social_linkedin": "",
      "website": "https://www.ilas.com/portfolio/20538400/luana-liguori"
    }
  ]
}

Get a List of Tags

get

Get a list of tags from the catalog.

Authorizations
Responses
200

Successful response

application/json
ResponsestringExample: {"message":"Success"}
400

Bad request. The request could not be understood or was missing required parameters.

401

Unauthorized. Authentication is required and has failed or has not been provided.

403

Forbidden. The request was valid, but the server is refusing action.

500

Internal Server Error. An unexpected condition was encountered.

get
/v1/catalog/tags
GET /v1/catalog/tags HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "message": "Success"
}

Get a Designer

get

Get a specific designer from the catalog.

Authorizations
Responses
200

Successful response

application/json
ResponsestringExample: {"available":true,"avatar_url":"https://d1oco4z2z1fhwp.cloudfront.net/designers/LuanaLiguori.png","base":"Naples, Italy (GMT+2)","description":"Hello, I'm Luana, a graphic and web designer with 8+ years of experience, specializing in email and landing page design. My approach is marked by precision, proactive problem-solving, and strong collaboration. I create visually impactful designs that align with marketing strategies, including social media graphics, blog covers, and presentations. I also offer custom design services tailored to clients' unique needs.","short_description":"","display_name":"Luana Liguori","email":"[email protected]","first_name":"Luana","highlighted":false,"hobby":"","id":"luana-liguori","last_name":"Liguori","position":"Beefree In-House Designer","social_behance":"","social_dribbble":"","social_linkedin":"","website":"https://www.ilas.com/portfolio/20538400/luana-liguori"}
400

Bad request. The request could not be understood or was missing required parameters.

401

Unauthorized. Authentication is required and has failed or has not been provided.

403

Forbidden. The request was valid, but the server is refusing action.

500

Internal Server Error. An unexpected condition was encountered.

get
/v1/designers/:slug
GET /v1/designers/:slug HTTP/1.1
Host: api.getbee.io
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "available": true,
  "avatar_url": "https://d1oco4z2z1fhwp.cloudfront.net/designers/LuanaLiguori.png",
  "base": "Naples, Italy (GMT+2)",
  "description": "Hello, I'm Luana, a graphic and web designer with 8+ years of experience, specializing in email and landing page design. My approach is marked by precision, proactive problem-solving, and strong collaboration. I create visually impactful designs that align with marketing strategies, including social media graphics, blog covers, and presentations. I also offer custom design services tailored to clients' unique needs.",
  "short_description": "",
  "display_name": "Luana Liguori",
  "email": "[email protected]",
  "first_name": "Luana",
  "highlighted": false,
  "hobby": "",
  "id": "luana-liguori",
  "last_name": "Liguori",
  "position": "Beefree In-House Designer",
  "social_behance": "",
  "social_dribbble": "",
  "social_linkedin": "",
  "website": "https://www.ilas.com/portfolio/20538400/luana-liguori"
}

Configure your AWS S3 bucket

This feature is only available on Beefree SDK paid plans.

Custom S3 Bucket is a Beefree application configuration feature that allows you to easily connect your own Amazon Web Services S3 bucket to your Beefree application.

By leveraging this feature, you will be able to store and manage your customers’ assets without having to build a new File System Provider, but rather by providing a compliant folder structure and filling out a simple form.

How are images stored?

Our default file system provider uses two first level folders to manage assets:

  • Images folder – It defines where the user’s images will be stored.

  • Thumbnails folder – Is used by our API to store the thumbnails of the uploaded images.

These folders can be root folders or can be part of a more complex directory structure.

A few notes and recommendations:

  • These folders should not be parents/children between themselves.

  • Their name is restricted by AWS standard naming restrictions.

  • For performance reasons, you should use a dedicated bucket and place these folders in the root.

Shared Assets

As an additional configuration option, you can provide shared files to your users, something that we do in the free version of the Beefree editor at beefree.io. These images are shown to all your customers as read-only assets.

The most common use case is providing sample images for the user’s first experience with the editor. Other use cases include providing application-specific images or documents that must not be deleted by the user.

To use this option you need to set-up two additional folders:

  • Shared images folder – This is the folder that your users will browse through the file manager.

  • Shared thumbnails folder – While the user images thumbnails are created when the images are uploaded, there is no automatic thumbnail creation for shared images. You must provide your own thumbnails using these settings:

    • 200px as max. width/height (this guarantee a correct preview in the file manager)

    • Name: original_image_name.ext_thumb.png (so the thumbnail for cat.jpg must be cat.jpg_thumb.png)

    • PNG: use only PNG as image format

S3 configuration

This section discusses how you can configure your own custom S3 bucket within the Developer Console, and also provides an example JSON of the Permission policy.

Configure Access keys in the Developer Console

Prior to configuring your custom S3 bucket, ensure you configure Access keys in the Developer Console.

Take the following steps to configure Access keys in the Developer Console:

  1. Log in to the Developer Console.

  2. Navigate to the application you'd like to configure a custom S3 bucket for.

  3. Click the Details button for that application.

  4. Navigate to Application configuration and click View more.

    You will be redirected to Storage options.

  5. Toggle on Configure your own S3 storage system to enable the option.

  6. Complete the required fields.*

  7. Click the Test S3 settings button.

*The following image shows an example of the required fields within the Developer Console for configuring your own S3 bucket:

Image of required fields to configure your own S3 bucket within the Developer Console.

Configure Access keys policy in AWS

The following JSON is of the Permissions policy assigned to the AWS user.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CustomBucket01",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::the-bucket-name"
        },
        {
            "Sid": "CustomBucket02",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::the-bucket-name/content-path/*"
        }
    ]
}

Note: Images path and Thumbs path must be valid directories in the bucket.

Configure bucket permissions

File URL Generation Based on "Custom URL" Parameter

The URLs for accessing files in your S3 bucket vary depending on whether the "Custom URL" field is set in the Developer Console:

  • If "Custom URL" is empty: URLs will follow this format:

    https://<bucket-name>.s3.<region>.amazonaws.com/path/to/file.png
  • If "Custom URL" is set (e.g., https://my-cdn/): URLs will be generated like this:

    <custom-url>/path/to/file.png

Important Configuration Notes

  1. Public Access:

    • For the generated URLs to work, the bucket’s permissions should allow public access to the files.

  2. Using a CDN as "Custom URL":

    • If you’re using a CDN (e.g., CloudFront) in the "Custom URL" field, you can restrict the bucket's access to only the CDN. In this case, the bucket itself doesn't need to be publicly accessible, as access is controlled through the CDN.

Ensure that bucket permissions are configured appropriately based on the type of URL being generated.

Enabling the Move File Feature for Your File Manager

You can enable the move icon for files within the File manager. This move icon allows your end users to move their files between folders, locations, and so on within the File manger. They can access the move icon directly on the file within the File manager. The move icon is a folder with an arrow pointing right inside it. End users click this icon to initiate the process of relocating the corresponding file to a new destination.

If you are using a Custom AWS S3 Bucket, take the following steps to enable this feature for your File manager.

How to Enable the Move File Feature

Take the following steps to enable the Move icon for your end users:

  1. Log in to the Developer Console.

  2. Navigate to the application you'd like to activate it for.

  3. Click on the Details button.

  4. Select the View more option located under Application configuration.

  5. Navigate to the Services section.

  6. Toggle on the Enable moving files between folders in file manager option.

The Move file option will automatically become available for your end users.

How File Name Conflicts Are Handled

If a file an end user trying to move or copy has the same name as an existing file, the File Manager will show a pop-up asking how to handle the conflict.

The end user will have the following options:

  1. Cancel: For this option, nothing will happen, and the operation will be stopped.

  2. Keep Both: This option lets them keep both files. The new file will be saved with a slightly different name, adding a number at the end. For example, if the original file is called "pizza.jpg," the new one will be named "pizza_1.jpg."

  3. Replace: Selecting this will replace the old file with the new one, meaning the existing file will be overwritten.

These options help them decide what to do when file names clash, ensuring they have control over how their files are managed.

Using a Custom AWS S3 Bucket

To implement the new Move File feature in your application, follow these steps to change your file path from the old format to the new format. This change is important because it allows the host application to enable the Move File feature within the File Manager without breaking old URLs. Here's how to make the transition:

  1. Understand the Changes: The file paths will change from /your-path/UID/user-path/filename.jpg to /your-path/new-internal-id/random-path/filename.jpg. This new structure decouples the logical path you see in the File Manager from the physical path in the storage, supporting the "move file" feature. For example, you can move the file in the File Manager, and the URL will remain the same.

  2. Activate Move Feature: Once you are onboarded, activate the Move Feature inside your SDK Console to utilize the new file paths. Follow the steps outlined in the previous section to complete this process.

Why This Change is Important

  • Decoupling Logical and Physical Paths: The new path structure separates the logical path (what you see in the File Manager) from the physical path (where the file is stored). This allows for more flexibility and new opportunities for future features.

  • Enable the Move File Feature: By adopting the new path structure, you can use the Move File feature in the File Manager, which allows you to move files without changing their URLs.

Impact on Existing Data

  • Existing Paths: Existing paths are not affected. The task done was to collect paths in the new database and keep files where they are.

  • Newly Uploaded Files: New uploaded files will be stored using the new path structure.

About the New Path

  • Logical and Physical Path Separation: The new path structure decouples the logical path you see in the File Manager from the physical path in the storage. This supports the "move file" feature, allowing you to move files in the File Manager without changing their URLs.

  • Changes: The key difference between the two paths is that the new path uses a random part to enhance security and reduce predictability, making it harder for unauthorized users to guess the URLs of stored files.

By following these steps, you can ensure a smooth transition to the new file paths and take full advantage of the Move File feature in your application.

Filling out the form to connect your AWS S3 bucket

Once you have set up a compliant folder structure, you can use the form in the Beefree SDK Console to connect your application. It’s one of the available server-side configurations for your Beefree application (Application details > Open configuration > Storage options).

This is a description of the form fields and what information you will need to provide in each of them:

Parameter
Description
Required

Custom url

The hostname – typically a CDN – that will be prefixed to resources URLs referenced in the JSONs created with BEE.

No

Bucket name

The name you assigned to the bucket when you created it.

Yes

Access key & Access secret key

You can provide AWS Root Account Credentials or IAM User Credentials (we recommend the second option for security reasons). The provided account must have read and write access to the given bucket. .

Yes

Select Region

AWS region where you created the bucket. Uses EU as the default setting.

Yes

Images Path

The relative path (from the bucket root) to the images folder described above (use “/” symbol as path delimiter).

Yes

Thumbnails Path

The relative path (from the bucket root) to the thumbnails folder described above (use “/” symbol as path delimiter).

Yes

Shared images path

The relative path (from the bucket root) to the shared images folder described above. Cannot be the bucket root (use “/” symbol as path delimiter).

No

Shared thumbnails Path

The relative path (from the bucket root) to the shared thumbnails folder described above. Cannot be the bucket root (use “/” symbol as path delimiter).

No

Important: If you change the custom URL, the new URL is immediately used for all images.

Steps to Configure Storage Paths for Single Folders in the Bucket Root

To store images and thumbnails in separate folders at the root of your S3 bucket in the Beefree SDK Developer Console, follow these steps:

  1. Configure the Images Path

    • Field Name: Images path

    • Example Value: your-images-folder

    • Format: Type the folder name where images should be stored.

    • Example: userlist

  2. Configure the Thumbnail Path

    • Field Name: Thumbnail path

    • Example Value: your-thumbnails-folder

    • Format: Type the folder name where thumbnails should be stored.

    • Example: usrlistthump

  3. Configure the Shared Images Path

    • Field Name: Shared images path

    • Example Value: your-shared-images-folder

    • Format: Type the folder name for shared images.

    • Example: usersShared

  4. Configure the Shared Thumbnails Path

    • Field Name: Shared thumbnails path

    • Example Value: your-shared-thumbnails-folder

    • Format: Type the folder name for shared thumbnails.

    • Example: usersSharedThumb

  5. Test the Configuration

    • Click Test S3 settings to validate the setup.

    • If successful, your files will be stored in the specified root-level folders in your S3 bucket.

The following image shows an example of how to configure single folders in the bucket root inside of the Beefree SDK Developer Console.

Steps to Configure Storage Paths for Single Nested Folders in the Bucket Root

To store images and thumbnails inside a single nested folder within your S3 bucket in the Beefree SDK Developer Console, complete the following fields using your preferred nested folder names in the correct format:

1. Images Path

  • Field Name: Images path

  • Example Value: inner/your-folder-name

  • Format: Use a parent folder (for example, inner/) followed by the subfolder name where images should be stored.

  • Example: inner/userlist

2. Thumbnail Path

  • Field Name: Thumbnail path

  • Example Value: inner/your-thumbnail-folder-name

  • Format: Use a parent folder (for example, inner/) followed by the subfolder name for thumbnails.

  • Example: inner/usrlistthump

3. Shared Images Path

  • Field Name: Shared images path

  • Example Value: inner/your-shared-images-folder-name

  • Format: Use a parent folder (for example, inner/) followed by the subfolder name for shared images.

  • Example: inner/usersShared

4. Shared Thumbnails Path

  • Field Name: Shared thumbnails path

  • Example Value: inner/your-shared-thumbnails-folder-name

  • Format: Use a parent folder (for example, inner/) followed by the subfolder name for shared thumbnails.

  • Example: inner/usersSharedThumb

The following image shows an example of how to configure a single nested folder in the bucket root inside of the Beefree SDK Developer Console.

Testing your settings

The button will become active once all required fields have been correctly filled out. It allows you to test your settings before saving the updated configuration. We recommend that you do so before saving any changes.

Remember to save your changes with the SAVE button at the top.

Preparing thumbnails

If you’ve just linked your custom bucket, you may find that you need to create your own thumbnails. Thankfully, this is an easy process.

For starters, the thumbnails in the File Manager are PNG files that are resized to 200×200 px.

Here is an example of thumbnail generation with image magick:

# convert one file
convert image1.jpg -resize 200x200 image1.jpg_thumb.png
# resize many files (WARNING this command overwrite files)
mogrify -resize 200x200  myimages/*jpg

# convert many files
mogrify -format png      myimages/*jpg

As a quick example, we’ll be using this custom bucket configuration:

  • bucket_name : my-custom-bucket

  • path_images : /path/to/images/

  • path_thumbnails : /path/to/thumbnails/

…And starting the editor with this UID:

  • uid : my-uid

When uploading image1.jpg in root dir, this key will be created in the custom bucket: s3://my-custom-bucket/path/to/images/my-uid/image1.jpg. Following that, a thumbnail will be generated with name image1.jpg_thumb.png with key: s3://my-custom-bucket/path/to/thumbnails/my-uid/image1.jpg_thumb.png.

And one more example:

When uploading image2.jpg in mydir inside the root dir, this key is created in the custom bucket: s3://my-custom-bucket/path/to/images/my-uid/mydir/image2.jpg. Similarly to above, a thumbnail will be generated with name image2.jpg_thumb.png with key: s3://my-custom-bucket/path/to/thumbnails/my-uid/mydir/image2.jpg_thumb.png.

Moving from the default S3 bucket

If your Beefree application is currently using the default S3 bucket, you wish to switch to your own bucket, and you have files that you want to transfer between the two, please please log into the Beefree SDK Console and submit a support ticket.

DeepL

Automatically translate content for different language templates using the DeepL addOn.

The DeepL AddOn is only available for Superpowers and Enterprise plans. Superpowers customers can add up to 6 translations per template. If you're on an Enterprise plan, you can add up to 20 translations.

MLT Automatic Bulk Translation with DeepL

The new DeepL addOn available in the Developer Console empowers your end users to translate all the translatable content within their designs using the new translate button. This feature requires that you have Multi-language templates configured for your application, and that you have a DeepL API key. Once you configure both within your host application, your end users will be able to automatically translate the translatable content within the additional language versions of their designs. If you are on the Superpowers plan, your end users can add up to 6 additional translations, and for Enterprise, your end users can add up to 20 additional translations. Visit the Automatic Translations white label end user documentation to learn more about how this feature works for your application's end users.

The following content types qualify as translatable content:

Modules and translatable properties
Header Meta information
  • Button: label - The text displayed on the button.

  • Paragraph: html - The HTML content of the paragraph.

  • Heading/Title: text - The textual content of the heading or title.

  • List: html - The HTML content of the list.

  • Image: alt - The alternative text for the image.

  • Video: thumbAlt - The alternative text for the video's thumbnail.

  • Icon: text, alt, title - The textual content, alternative text, and title of the icon.

  • Menu: text, title - The textual content and title of the menu.

  • Title

  • Description

  • Subject

  • Preheader

The HTML translatable property refers to the text within the HTML tags of the element itself. For the "Button" module, the translatable property is "label," which specifies the text displayed on the button. In the "Paragraph" module, the translatable property is "html," indicating the HTML content within the paragraph tags. For "Heading/Title," the property is "text," representing the textual content of the heading or title. The "List" module also uses "html," referring to the HTML content within the list tags. The "Image" module has the "alt" property, which provides alternative text for the image. In the "Video" module, "thumbAlt" denotes the alternative text for the video's thumbnail. The "Icon" module includes "text," "alt," and "title," covering the textual content, alternative text, and title of the icon, respectively. Lastly, the "Menu" module uses "text" and "title" for its textual content and title.

The following video shows a template with Heading, Paragraph, and List modules. When the Translate button is clicked, the text within the translatable properties for those modules are translated. The following section displays a JSON example with a translation in Spanish.

Example JSON Translation

Example JSON with Spanish Translation

In the following JSON, English is the primary language and Spanish is set as the translation language.

{
  "page": {
    "body": {
      "container": {
        "style": {
          "background-color": "#FFFFFF"
        }
      },
      "content": {
        "computedStyle": {
          "linkColor": "#0068A5",
          "messageBackgroundColor": "transparent",
          "messageWidth": "500px"
        },
        "style": {
          "color": "#000000",
          "font-family": "Arial, Helvetica, sans-serif"
        },
        "type": "page-properties",
        "webFonts": []
      },
      "description": "Empty template for BEE",
      "head": {
        "meta": {
          "description": "Enjoy a heartwarming moment with your furry friends while savoring your morning coffee. Learn about life's lessons and the importance of hard work together.",
          "subject": "Morning Coffee Conversations with Pets",
          "title": "Morning Coffee Conversations with Pets",
          "translations": {
            "es-ES": {
              "title": "Café matinal Conversaciones con mascotas",
              "description": "Disfrute de un momento entrañable con sus amigos peludos mientras saborea su café matutino. Aprendan juntos las lecciones de la vida y la importancia del trabajo duro.",
              "subject": "Café matinal Conversaciones con mascotas"
            }
          }
        }
      },
      "language": {
        "label": "English",
        "value": "en-US"
      },
      "rows": [
        {
          "columns": [
            {
              "grid-columns": 12,
              "modules": [
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnDesktop": false,
                      "hideContentOnMobile": false
                    },
                    "heading": {
                      "prompt": "00000000-0000-0000-0000-000000000000",
                      "style": {
                        "color": "#555555",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "23px",
                        "font-weight": "700",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "link-color": "#E01253",
                        "text-align": "center"
                      },
                      "text": "Morning Coffee Conversations with Pets",
                      "title": "h1",
                      "translations": {
                        "es-ES": {
                          "text": "Café matinal Conversaciones con mascotas"
                        }
                      }
                    },
                    "style": {
                      "padding-bottom": "0px",
                      "padding-left": "0px",
                      "padding-right": "0px",
                      "padding-top": "0px",
                      "text-align": "center",
                      "width": "100%"
                    }
                  },
                  "locked": false,
                  "type": "newsletter-modules-heading",
                  "uuid": "11111111-1111-1111-1111-111111111111"
                },
                {
                  "descriptor": {
                    "computedStyle": {
                      "align": "center",
                      "hideContentOnMobile": false
                    },
                    "divider": {
                      "style": {
                        "border-top": "1px solid #BBBBBB",
                        "width": "100%"
                      }
                    },
                    "style": {
                      "padding-bottom": "10px",
                      "padding-left": "10px",
                      "padding-right": "10px",
                      "padding-top": "10px"
                    }
                  },
                  "locked": false,
                  "type": "newsletter-modules-divider",
                  "uuid": "22222222-2222-2222-2222-222222222222"
                },
                {
                  "descriptor": {
                    "computedStyle": {
                      "hideContentOnAmp": false,
                      "hideContentOnDesktop": false,
                      "hideContentOnHtml": false,
                      "hideContentOnMobile": false
                    },
                    "paragraph": {
                      "computedStyle": {
                        "linkColor": "#0068a5",
                        "paragraphSpacing": "16px"
                      },
                      "html": "<p>Once upon a time, a man sat at his kitchen table, enjoying his morning coffee as his two dogs and one cat gathered around him. With a warm cup in hand, he began to share with his furry companions the harsh reality of life after school. \"You see,\" he explained, \"we have to work every day to earn money so we can afford simple pleasures like pizza.\"</p>\n<p>The man's pets listened intently, their eyes filled with curiosity as he continued to elaborate on the importance of hard work and dedication. \"It may seem daunting at first,\" he reassured them, \"but with perseverance and a positive attitude, we can achieve our goals.\" The dogs wagged their tails in agreement, while the cat purred softly in approval.</p>\n<p>As the morning sun streamed through the windows, casting a warm glow over the kitchen, the man smiled at his beloved pets. \"Remember,\" he said affectionately, \"life is full of challenges, but as long as we stick together and work hard, we can enjoy the simple pleasures that make it all worthwhile.\" And with that heartwarming sentiment, they continued their morning ritual of coffee and conversation, grateful for each other's company.</p>",
                      "prompt": "33333333-3333-3333-3333-333333333333",
                      "style": {
                        "color": "#000000",
                        "direction": "ltr",
                        "font-family": "inherit",
                        "font-size": "14px",
                        "font-weight": "400",
                        "letter-spacing": "0px",
                        "line-height": "120%",
                        "text-align": "left"
                      },
                      "translations": {
                        "es-ES": {
                          "html": "<p>Érase una vez un hombre sentado a la mesa de su cocina, disfrutando de su café matutino mientras sus dos perros y un gato se reunían a su alrededor. Con una taza caliente en la mano, empezó a compartir con sus peludos compañeros la dura realidad de la vida después de la escuela. \"Veréis\", explicó, \"tenemos que trabajar todos los días para ganar dinero y poder permitirnos placeres sencillos como la pizza\"</p>\n<p>Las mascotas del hombre escuchaban atentamente, con los ojos llenos de curiosidad, mientras él seguía explicando la importancia del trabajo duro y la dedicación. \"Al principio puede parecer desalentador\", les tranquilizó, \"pero con perseverancia y una actitud positiva, podemos conseguir nuestros objetivos\" Los perros movieron la cola en señal de acuerdo, mientras el gato ronroneaba suavemente en señal de aprobación.</p>\n<p>Mientras el sol de la mañana se colaba por las ventanas, arrojando un cálido resplandor sobre la cocina, el hombre sonrió a sus queridas mascotas. \"Recordad\", les dijo cariñosamente, \"la vida está llena de retos, pero mientras permanezcamos unidos y trabajemos duro, podremos disfrutar de los placeres sencillos que hacen que todo merezca la pena\" Y con ese sentimiento reconfortante, continuaron su ritual matutino de café y conversación, agradecidos por la compañía mutua.</p>"
                        }
                      }
                    }
                  }
                }
              ]
            }
          ]
        }
      ]
    }
  }
}

How to activate

This section discusses the prerequisites and steps you need to take to get started with this feature.

Prerequisites

  • Ensure the Multi-language templates feature is toggled on inside of the Developer Console.

  • DeepL API key

    Note: DeepL offers a free tier for their plans. You can obtain an API key from DeepL for free to get started with this feature.

Activate the addOn in the Developer Console

Take the following steps to activate this feature:

  1. Log in to the Beefree SDK Developer Console.

  2. Navigate to the application you'd like install the addOn in.

  3. Install the DeepL addOn.

  4. Provide the requested details.

  5. Save your changes.

Auto Translation Configuration Parameter

Activate this feature by adding the new configuration parameter templateLanguageAutoTranslation and setting it to true.

The following code sample displays an example of the templateLanguageAutoTranslation, templateLanguage, and templateLanguages parameters.

// Configuration for the bee plugin
// Configuration for the bee plugin
var beeConfig = {
  uid: 'fakeUid123',
  container: 'bee-plugin-container',
  templateLanguageAutoTranslation: true,
  templateLanguage: {
    value: 'en-US',
    label: 'English'
  },
  templateLanguages: [
    { value: 'it-IT', label: 'Italian' },
    { value: 'fr-FR', label: 'French' },
    { value: 'es-ES', label: 'Spanish' },
    { value: 'ru-RU', label: 'Russian' },
    { value: 'el-GR', label: 'Greek' },
    { value: 'hy-AM', label: 'Armenian' }
  ]
};

If you have a custom top bar in your application, take the following additional steps:

  1. Describe how to translate a template:

    1. translateTemplate → bee.translateTemplate({ language: 'it-IT' })

  2. Describe how to reset a translation:

    1. resetTemplateTranslation → bee.resetTemplateTranslation({ language: 'it-IT' })

Translate a Template

A function to translate the template to a specified language using the Beefree SDK.

React Translate a Template example

import React from 'react'; // Importing React
import { bee } from 'bee-plugin'; // Importing the bee plugin

// Define a functional component
const TranslateTemplateButton = () => {
  // Function to translate the template to Italian
  const translateTemplate = () => {
    bee.translateTemplate({ language: 'it-IT' }); // Calling the translateTemplate function with Italian language code
  };

  // Returning a button that triggers the translateTemplate function when clicked
  return (
    <button onClick={translateTemplate}>
      Translate Template to Italian
    </button>
  );
};

export default TranslateTemplateButton; // Exporting the component

JavaScript Translate a Template example

// Function to translate the template to Italian
function translateTemplate() {
  bee.translateTemplate({ language: 'it-IT' }); // Calling the translateTemplate function with Italian language code
}

// Adding an event listener to the button with id 'translateButton'
// When the button is clicked, the translateTemplate function is triggered
document.getElementById('translateButton').addEventListener('click', translateTemplate);

HTML example

<!-- Button that will translate the template to Italian when clicked -->
<button id="translateButton">Translate Template to Italian</button>

Reset a Translation

A function to reset the translation of the template to its original state using Beefree SDK.

React Reset a Translation example

import React from 'react'; // Importing React
import { bee } from 'bee-plugin'; // Importing the bee plugin

// Define a functional component
const ResetTemplateTranslationButton = () => {
  // Function to reset the template translation to the original state
  const resetTemplateTranslation = () => {
    bee.resetTemplateTranslation({ language: 'it-IT' }); // Calling the resetTemplateTranslation function with Italian language code
  };

  // Returning a button that triggers the resetTemplateTranslation function when clicked
  return (
    <button onClick={resetTemplateTranslation}>
      Reset Template Translation
    </button>
  );
};

export default ResetTemplateTranslationButton; // Exporting the component

Reset a Translation JavaScript example

// Function to reset the template translation to the original state
function resetTemplateTranslation() {
  bee.resetTemplateTranslation({ language: 'it-IT' }); // Calling the resetTemplateTranslation function with Italian language code
}

// Adding an event listener to the button with id 'resetButton'
// When the button is clicked, the resetTemplateTranslation function is triggered
document.getElementById('resetButton').addEventListener('click', resetTemplateTranslation);

HTML example

<!-- Button that will reset the template translation when clicked -->
<button id="resetButton">Reset Template Translation</button>

Error handling

If errors occur, onWarning or onError will be triggered. If the request completes successfully there’s no direct feedback.

The following errors are returned by the backend service when something goes wrong during the translation.

Code
Message
HTTP Status
Details

6001

Unauthorized

401

6050

Generic Error

500

6100

Bad Request

400

E.g. 'sourceLanguage' and 'targetLanguage' must be defined

6150

Validation Error

400

E.g. language X is not supported

6200

Bump service error

[error returned by the Bumper]

E.g. Error while computing the fields to translate

6250

Bump service error

500

E.g. Error while applying the translation

6350

Provider service error

500

[error returned by DeepL]

Popup Builder - Getting Started

Overview

This section provides the information you need to get started integrating in your SaaS applications. For more advanced settings, see .

Integration

Out-of-the-box, the setup and configuration are the same as Email and Page Builder. This section will cover the settings specific to Popup Builder. Check out our if you’re new to Beefree SDK or unfamiliar with the configuration basics (as seen in the example below).

Loading Popup Builder with no additional settings will give the end-user a beautifully designed popup and workspace to design their content. However, Popup Builder comes with an additional, robust set of configuration options to customize the workspace. This allows the host application to build a workspace that matches their popup’s look and feel and that of the destination page.

For example, the host app can customize…

  • The popup workspace background to view how the popup will look “in context” on the destination page.

  • The theme and position of the popup for both desktop and mobile design modes.

The following sections will look at how to customize the workspace, starting with the common settings and working up to a full custom layout.

The Basics

Let’s start by looking at some of the differences between Page Builder and Popup Builder.

  • Content Width

  • HTML output

Content Width

In Email and Page Builder, the content area width is saved in the template. For example, if you start with an empty template, a default width that works for most scenarios is chosen, but the designer can adjust the message width slider. If you start with an existing template, the content width was chosen by the template’s designer using the message width slider in the the builder’s Settings tab.

With Popup Builder, the same template may have multiple contexts, and each context will likely have specific size requirements. For example, an exit-intent popup may have a max-width of 600px on a desktop with a classical layout centered on the screen. On the other hand, the host app may display the same template on mobile in the bar style docked at the bottom of the screen with a restricted width of 300px.

Since the content area’s width is tightly coupled to the context and layout, no one size fits all width is saved in the template. Instead, the host app will specify the width settings when the builder loads, based on the context of using the template. You’ll find an example in the common settings section below.

Popup Builder does not support fluid 100% width content.

HTML Output (HTML Partials)

In Email and Page Builder, the Beefree SDK HTML parser service converts your template into an HTML document customized for email or pages, respectively. However, the Popup Builder will not return a full HTML page because the host application is the final destination. In addition, Beefree SDKPopup Builder doesn’t provide the scripts to control the popup’s behavior, such as opening and closing. Rather, Popup Builder provides the HTML “partials” to embed within your popup’s content area or body.

The HTML partial will come with all the CSS required to look as it did in the preview mode. The parser service will wrap the content with a special container to clear all the host application styles and prevent style conflicts. The HTML output is designed to be embedded into any popup framework or application and still render the way it appears in the builder.

Popup workspace

Now that we covered the basic differences between Popup Builder and our other applications let’s discuss what you should expect when the builder starts.

As mentioned above in the Getting Started section, you will receive a ready-to-go design experience if no settings are provided. The default layout is a classic centered modal with a fixed width.

If the default popup style and layout suit your needs, then you are all set to start designing! You can load the builder without additional configuration and use the same standard controls and callbacks to access the HTML and JSON template.

What if you like most of the defaults but want to make some minor adjustments? We have you covered!

Common settings

Easily change the background to make the workspace look like the destination page where you’ll embed the popup.

If this option is not set, then we will provide a default skeleton layout. It’s worth noting at this point that you can apply every setting for both desktop and mobile design modes. That means you can have a different background when editing in Mobile Design Mode. We’ll show you how later!

Popup default layouts

One of the most common needs is changing the popup’s default-centered position to better match the end-user’s use case. Out-of-the-box, the Popup Builder comes with many of the most common popup layouts preconfigured. You can use any available presets “as is” or use them as starting points that you can fine-tune to your satisfaction.

Here is a complete list of preset layouts:

Name
Value
Description

Popup default themes

Another useful preset available is changing the popup’s styles from the default to better match the end-user’s use case. For example, if you’re using the popular Bootstrap CSS framework, you can select the “Bootstrap Theme” as your default. As with the default layouts, you can use any of the available preset themes “as is” or use them as starting points that you can fine-tune to your satisfaction.

Here is a complete list of preset themes:

Name
Value
Description

Content area width

As mentioned above, the content area’s width is tightly coupled to the layout, no one size fits all width is saved in the template. All Popup Builder preset layouts come with a default width, which you can override with the following configuration settings.

Continue to if you’d like to customize more than the position, background, and content area width.


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  ...
}

beeConfig: {
  ...
  workspace: {
    popup: {
      backgroundImage: 'https://.../background.png',
      backgroundImageMobile: 'https://.../background.png',
      ...
    }
  }
}

beeConfig: {
  ...
  workspace: {
    popup: {
      layout: 'bar-top'
    }
  }
}

Classic Popup

classic-center

classic-top-right

classic-top-left

classic-bottom-right

classic-bottom-left

This is our default layout and works great for alerts and exit intents.

Drawer or Slide-in panel

drawer-left

drawer-right

Side panels, or drawers, can be used to design menus or display ads.

Bar or Docker

bar-bottom

bar-top

This is great for cookie approval dialogs.


beeConfig: {
  ...
  workspace: {
    popup: {
      theme: 'bootstrap'
    }
  }
}

Custom

custom

This is our default layout and works great for alerts and exit intents.

Bootstrap

bootstrap

This will a popup that looks like the popular Bootstrap CSS modal.

jQuery

jQuery

This will be a popup that looks like the popular jQuery modal. Many of the latest CSS systems use a style similar to the original jQuery.

Material

material

This will be a popup that looks like the popular Material CSS modal.


workspace: {
  popup: {
    contentWidth: 600,
    contentWidthMobile: 300
  }
}
PopUp Builder
Popup Builder – Advanced Settings
Getting Started guide
Popup Builder- Advanced Settings
More about AWS credentials

Multi-Language Templates

Multi-language Templates are only available for Superpower and Enterprise plans.

Superpowers customers can add up to 6 translations per template. If you're on an Enterprise plan, you can add up to 20 translations.

Overview

Multi-language Templates (MLT) empower your end users to design customized experiences for their international audiences. Through the use of this feature, your end users will be able to select one default language, and up to 20 translations reflected in the top bar of their builder. Keep in mind that Multi-language Templates provide you with a means to translate template content, but does not automatically translate the content for you.

MLT provides a translation infrastructure, but does not perform the translation for each language version of your template. You can integrate translations into your application for each language version using one of the following two methods:

  • Enable the DeepL AddOn, which gives your end users access to a Translate button within the builder. When your end users click this button, all the translatable fields will automatically translate to the language corresponding with the template's language version. Note: MLT is a prerequisite for enabling the DeepL AddOn.

  • Enable the AI Writing Assistant AddOn to allow your end users to translate their template language version's content with the AI Writing Assistant.

  • End users can type the translations manually for each template language version.

Note: The style of your templates stays the same across the language version while MLT is in use. The only change that will occur is the language of the text for the relevant components.

This Configuration Guide will help you get started with configuring the MLT feature. We recommend you start with the Prerequisites section to ensure you have everything you need for a successful configuration.

If you are uncertain if your host application is a good candidate for this functionality, continue to the Is MLT for Your Application? section to learn more about this feature.

Is MLT for Your Application?

The Multi-language Templates (MLT) feature is an enhancement for companies working with end users who build emails that engage with international audiences.

MLT adds the following extended functionality to your host application:

  • Add a new language for the content inside Beefree SDK

  • Activate the language configuration in the Beefree SDK configuration file

  • Customize a list of languages the user can choose from

  • Allow changes to the default language

  • Enable preview for templates in different language versions

To use Multi-language Templates, your host application only needs to store one JSON file with the languages. For more information on this, visit the Configuration Steps section.

For more information on the end user experience for Multi-language Templates, visit our Multi-language Templates white label end user documentation.

End User Functionality

Multi-language Templates (MLT) offers the following in-app features for an application end user:

  • Switching the editor and template languages

  • Translate contents

    • View a list of eligible content in the Translate Contents section of the Multi-language Knowledge Base Article.

  • Multi-language Template preview

  • Export HTML for multiple languages as single files

  • Alternative text descriptions

  • Changing an image path

    • This lets users switch email images for different translations. For instance, they can replace an image containing English text with the corresponding image containing Spanish text for the Spanish translation.

For more detailed information on the MLT feature offering, visit our Multi-language Knowledge Base article.

Prerequisites

Before proceeding with the configuration, ensure you have:

  • Superpower or Enterprise plans

  • The multi-language support toggle set to on in the Beefree SDK Console

  • Application Client ID

  • Application Client secret

Configuration Steps

To use Multi-language Templates, your host application only needs to store one JSON file with the different languages you’d like to offer. Take the following steps to configure Multi-language Templates (MLT) in your application.

Enable multi-language templates

  1. Log in to the Beefree SDK Console.

  2. Click “Details” on the application you’d like to enable multi-language template for.

  3. Select “Application configuration”.

  4. Navigate to the multi-language template toggle.

  5. Toggle the feature to on.

Initialize multi-language templates

  1. Add the templateLanguage property to the config object. This property defines the default language for the template.

  2. Add the templateLanguages property to the config object. This property defines the list of language options for the template translations.

  3. Confirm you added both properties with the correct language options and save your changes.

The following example shows the properties within the config object. In this example, the languages are read and written from left to right.

Note: You can only choose languages that are written and read from left to right, or right to left. You cannot mix languages with different directions of reading and writing within the same JSON.


templateLanguage: { value: 'en-US', label: 'English' },
templateLanguages: [
  { value: 'es-ES', label: 'Español' },
  { value: 'de-DE', label: 'Deutsch' },
  { value: 'pt-BR', label: 'Português' },
  { value: 'fr-FR', label: 'Français' },
  { value: 'it-IT', label: 'Italiano' },
  { value: 'nl-NL', label: 'Nederlands' },
],

The following sample shows an example of a default language and three translation languages that are written and read from right to left.


templateLanguage: { value: 'fa-IR', label: 'فارسی' },
templateLanguages: [
  { value: 'ja-JP', label: '日本語' },
  { value: 'ar-SA', label: 'العربية' },
  { value: 'tr-TR', label: 'Türkçe' },
  { value: 'dv-MV', label: 'ދިވެހި' }, 
  { value: 'ur-PK', label: 'اردو' },  
  { value: 'ku-IQ', label: 'کوردی' }, 
],

Note: If you're on a Superpowers plan, you can have up to six additional language versions of the design using one template. If you're on an Enterprise plan, you can add up to 20 translation languages.

Languages are defined with a value and a label. The label is what will be shown in the language drop-down inside the top bar. The value is a key that stores the translations in the JSON. It is used to set the corresponding language meta attribute for each translation.

Lang Attribute

The lang attribute on the content modules helps with hyphenation and screen readability.

Test the Configuration

Once you have initialized multi-language templates, you can confirm that the configuration was successful by following these instructions:

  1. Go to your builder.

  2. Navigate to the top bar.

  3. Confirm whether or not you see a language drop-down menu.

If you see a drop-down, the configuration was successful. If you do not see a drop-down, reference the following table for troubleshooting steps you can take.

Issue
Description
Resolution

Improper JSON File Storage

Make sure the JSON file with the desired languages is correctly stored in your application.

Review the file location and ensure it’s accessible.

Disabled Multi-Language Templates

Double-check if the Multi-Language Templates feature is enabled in the Beefree SDK Console and set to “on.”

Enable the feature in the configuration settings.

Incorrect Configuration Properties

Verify the correctness of the `templateLanguage` and `templateLanguages` properties in the config object.

Correct any syntax errors or misconfigurations in the properties.

Language Direction Mismatch

Make certain that chosen languages follow the correct reading direction (left to right or right to left) and are defined with both value and label.

Ensure the languages are compatible with the chosen direction and follow the defined format.

Missing Language Drop-Down

If the language drop-down is not visible, review the setup steps in the Configuration section.

Revisit the configuration steps and check for any missing or incorrect settings.

HTML Saving Errors

If encountering issues with saving or exporting HTML, check the `bee.save` method for language parameters and the `onSave` event listener in the configuration.

Ensure proper usage of the `bee.save` method and validate the `onSave` event listener for any errors.

Incorrect `onSave` Handling

Ensure that the `onSave` callback correctly handles the HTML saving process for each language.

Review and update the `onSave` callback to address language-specific HTML saving properly.

Translation Export Issues

For exporting translations, validate that the defined languages are correctly represented in the array.

Double-check the array of languages for accuracy and completeness.

Missing `onSave` Callbacks

Implement `onSave` callbacks for each language to handle specific language-related data during export.

Create `onSave` callbacks for each language export to manage language-specific data appropriately.

Language Change Problems

When changing the template language, verify the existence of the specified language, and have an `onTemplateLanguageChange` callback to respond to language switches.

Confirm the language’s availability and define an `onTemplateLanguageChange` callback to handle language switches.

Translation HTML

Multi-language Templates (MLT) offer the option to save and export translation HTML. This section outlines the steps you need to take to save or export a translation’s HTML.

Save HTML

To save the HTML output for a specific language take the following steps:

  1. Use the bee.save method and provide the desired language as a parameter. In this example, we’ll save it for the Italian language (‘it-IT’).


bee.save({ language: 'it-IT' })
  1. Set up an onSave event listener to handle the HTML saving process. This listener will be triggered when the HTML generation is complete. You can add it to the configuration object.


bee.configure({
  onSave: (pageJson, pageHtml, ampHtml, templateVersion, language) => {
    myApi.saveHtml(pageHtml, language);
  }
});

In the code above:

  • onSave is an event handler function that takes several parameters related to the generated HTML.

  • pageHtml contains the generated HTML.

  • language contains the requested language value, which was previously set in the bee.save method.

If you want to use the default main language for generating HTML when the bee.save method is called without parameters, you don’t need to specify a language in the bee.save method. The default language will be used automatically.

Export Translations

Take the steps outlined in this section to export the translation HTML.

  1. Define an array of languages that you want to export translations for. Each language should be represented as a string.

The following example shows an array of multiple export languages.


const languages = ['en-US', 'es-ES', 'it-IT'];
  1. Create a function, let’s call it exportAllTranslations as an example, which will iterate over the array of languages and call the bee.save method for each language.

View the following example function.


function exportAllTranslations() {
  languages.forEach(language => bee.save({ language }));
}

  1. Implement the onSave callbacks for each language. These callbacks will be triggered when the bee.save method completes for each language. Make sure to handle the specific language-related data within each callback.


// onSave callback for en-US
1. onSave: (
  pageJson, pageHtml, ampHtml, templateVersion, language // en-US
) => {
  // Handle the export for en-US here
  // You can access pageHtml, ampHtml, and other data
  // related to the en-US language export
}

// onSave callback for es-ES
2. onSave: (
  pageJson, pageHtml, ampHtml, templateVersion, language // es-ES
) => {
  // Handle the export for es-ES here
  // You can access pageHtml, ampHtml, and other data
  // related to the es-ES language export
}

// onSave callback for it-IT
3. onSave: (
  pageJson, pageHtml, ampHtml, templateVersion, language // it-IT
) => {
  // Handle the export for it-IT here
  // You can access pageHtml, ampHtml, and other data
  // related to the it-IT language export
}

// Repeat the above pattern for each language in the array

To get HTML in a specific language by our CSAPI, ensure you include a “language” key/value pair to the body of your request. Ensure you reference the instructions for using the /html endpoint section of the Content Services API Reference to learn more about exporting template HTML.

The following sample code displays this:


{
  beautifyHtmlEnabled: false,
  page: {...},
  language: "it-IT"
}

Changing the Language

Follow the steps outlined in this section to create a specified functionality that allows the end user to change their template language when a custom top bar is enabled.

  1. Ensure you have a custom top bar.

  2. Create a function to handle the language change. You can use the instance method bee.switchTemplateLanguage for this purpose.


bee.switchTemplateLanguage({ language: 'es-ES' })
  1. Verify if the specified language exists in the available languages. If it does, the language switch will happen automatically.

    Note: If the specified language does not exist among the available languages, an event will be fired to the onError callback.

  2. Once the language is successfully changed, a callback named onTemplateLanguageChange will be triggered.

You need to define this callback function to respond to the language change.


onTemplateLanguageChange: (lang) => {
  console.log(lang) // Example output: { label: 'Spanish', value: 'es-ES', isMain: false }
}

The onTemplateLanguageChange callback will receive an object (lang) containing information about the language the user switched to. This object will have three properties:

  • label: The label or name of the language.

  • value: The value representing the language (e.g., ‘es-ES’ for Spanish).

  • isMain: A boolean property indicating whether the selected language is the default one, as defined with templateLanguage in the configuration object.

  1. Test the language switching functionality by calling bee.switchTemplateLanguage with different language values, and make sure that the onTemplateLanguageChange callback responds correctly.

Triggering the Translation Preview

If you have a custom Preview, you can handle switching languages on the Preview.

To open the Preview, you can call either of two methods:

  • bee.togglePreview

  • bee.switchPreview

The methods perform the following tasks:

  • togglePreview: a toggle that opens and closes the Preview.

  • switchPreview: accepts a parameter to specify the language and get the HTML preview. It also opens the Preview if it’s closed.

The following code shows an example of the methods applied for the default language.


// Open the preview in the default language
bee.togglePreview() or bee.switchPreview()

// Switch to Italian
bee.switchPreview({ language: 'it-IT' })

// Close the preview
bee.togglePreview()

The following code shows an example of the methods applied for a preview in French.


// Open the preview in French
bee.switchPreview({ language: 'fr-FR' })

// Switch to Russian
bee.switchPreview({ language: 'ru-RU' })

// Close the preview
bee.togglePreview()

Note: The language parameter is optional in switchPreview. Calling it without parameters will open the Preview with the default language selected. If the Preview is open, nothing will happen. The same behavior is applied when the language passed is not valid or doesn’t exist.

Automating Translations

If you would like to provide your end users with the option to automatically translate all of the translatable content within their design, you can use the DeepL addOn.

Commenting

The Commenting feature is available for Core plan or higher.

Overview

With Commenting, teams using your application can collaborate asynchronously on the same email, page or popup, in order to get their work done more quickly and reach approval for going live more efficiently.

When Commenting is enabled, your end-users (or contributors, as we’ll call them in this context) can:

  • Add a new comment in any content block or row, so that the context of the discussion is always visible;

  • Reply to an existing comment and start a thread;

  • Mark existing threads as resolved, and reopen solved threads if necessary.

  • Copy the text of a comment, and paste it back to the content area

  • Preview comments by hovering over the comment icon

  • Automatically highlight the row where a thread is posted

  • Receive a notification straight in the builder when a new comment is added during a co-editing session (Superpowers users only).

Use cases

With Commenting, you enable asynchronous, visual collaboration when multiple collaborators are creating, editing, and reviewing content in the Beefree builders. This collaborative feature can prove extremely beneficial in different contexts, regardless if contributors are in the same team, in separate teams, or even in different companies (e.g. digital marketing agencies collaborating with their clients):

  • have a single source of truth for feedback and requests on the content created with the builders;

  • cut time-to-publish, reducing back and forth conversations, both online and offline;

  • get sign-off for going live for email and web campaigns more efficiently.

How to activate it

Commenting – like most other features – is made available to Beefree SDK customers in an OFF state by default, and must be activated in the Beefree SDK Console.

To do so:

  • Login into the Beefree SDK Console

  • Click Details next to the application you want to configure

    • We recommend you first familiarize with Commenting in a Development or QA application

    • Learn more about Production vs. Development application here

  • Click view more under Application configuration.

  • Toggle Enable commenting ON and click the Save button to activate Commenting for the application.

To activate Commenting when launching your Beefree application, you will need to pass a username, userHandle, and a userColor in the configuration parameters. See this example:

const beeConfig = {
    uid: 'dev-user',
    language: 'en-US',
    ...
    username: 'Test User',
    userColor: '#cae5f1'
    userHandle: 'd09b0f5d-e08b-4dca-b7ae-6010b5da04d3' // unique id
    ...
}

How it works

Adding comments and starting threads

When opening an email, a landing page or a popup, a contributor can add a new comment to a content block or a row by clicking the “Balloon” icon, available in two spots:

  • in the row or block outline, inside the editing stage

  • in the header of the Row properties or Content properties

Clicking one of these two icons will activate the commenting panel, which takes over the editor sidebar. From there, the user can insert a new comment. After the first comment, another contributor can start a thread by adding a second comment.

Mentioning someone in a comment

If you have implemented mentions, users can type @ to bring up a list of contributors and tag them in the comment. If the user starts typing, the list will be filtered If you’ve built a notification system around Commenting, you can use this piece of information to trigger a notification towards the mentioned person.

If you added a Content dialog for mentions, the action will be triggered by the button at the end of the list. You will define the CTA for this button as part of the Content dialog configuration (in this case, “Send an invite”).

Interacting with threads

If there has already been some activity, the editing stage shows whether a content block or row has any comments by displaying a small comment icon. The sidebar instead indicates the number of existing comments for the selected row or content block, three in this case.

Activating the Commenting panel will bring up the thread. In this case, it will show the three comments.

Existing comments can be edited or deleted by the contributor that added them. Contributors may also resolve comments when they have reached a consensus and completed any pending task.

Improved accessibility to in-line threads. Hover the mouse over the comment icon to see a preview of the last comment added.

Browsing threads and closing the commenting panel

Clicking on < All comments in the top section will bring up a list of all comment threads, indicating which ones have been resolved and which ones are still open. Contributors can search inside comments and filter out solved threads, or threads that were part of deleted content. Deleted and hidden comments will be filtered automatically.

To go back to the editor sidebar, contributors can close the Commenting panel by clicking the X icon in the upper right, or they can just click on another row or content block in the stage.

Quickly reopen resolved threads by adding a new comment, expand threads with a click, and show a comment thread preview straight from the content area.

Copy comment text and paste it to content area

Suggest edits in seconds, and save time with the copy/paste feature. Copy text from the comment body and paste it directly into the content area.

Real-time notifications when a new comment is added

If you subscribed to a Superpowers plan, and have co-editing enabled, your users will never lose a new comment again with the new notification system. Users will receive real-time notifications whenever a new comment is added to the document straight in the builder.

By clicking on the notification, they will be able to quickly open the comment, and highlight the element where the conversation is taking place. The toast notification can be styled with custom CSS to match your application look-and-feel.

If you want to learn how to implement co-editing in your application, check the related documentation article here.

The Reviewer Role

With the Reviewer role, you can now allow users to collaborate on your projects without changing the design. This role helps provide peace of mind by allowing inexperienced users to work with the team on their designs, without fear of accidentally changing it.

In short, this new role has the following characteristics:

  • Can’t apply changes to the message

  • Can add comments and start threads

  • Can edit their own comments

  • Can view other comments

This new role can be easily enabled by passing the following parameter in your configuration:

beeConfig: {
  role: 'reviewer',
  ...
}

Once you turn on the feature in the Beefree SDK Console, you may want to disable Commenting for some customers. You can do so via the client-side configuration document that you feed to your Beefree application when initializing the editor.

Why? Because you may decide to make the feature available to customers of your application:

  • depending on the subscription plan that they are on (i.e. you could push users to a higher plan based on the ability to use Commenting);

  • depending on the purchase of an optional feature (same);

  • only if they are “beta” customers, so they see it while keeping it hidden from the rest of your users.

Here’s how to do so:

  • Enable Commenting in the Beefree SDK console, as mentioned above.

  • Add the configuration parameter commenting to the beeConfig document

  • Set it to false for all users that cannot comment.

Here is a simple example:


const beeConfig = {
    uid: 'dev-user',
    language: 'en-US',
    ...
    commenting: false // boolean
    ...
}

 var beeConfig = {
  ...
  contentDialog: {
    ...
    getMention: {
      label: 'Send an invite',
      handler: userInput('Who do you want to mention?', {
        username: 'Jerry Doe',
        value: 'Jerry Doe',
        uid: "f6287c33-6e77-40cb-8a5d-66d62b4f38bb",
      })
    },

Managing notifications

You can build a notification system around commenting by triggering a callback for events in the Commenting layer. When these events happen, the Beefree system triggers the onComment callback.

You can react to that callback by taking the information provided in it (e.g. the user that created the comment, the text of the comment, any mentioned user, date & time of the comment, etc.) and send notifications.

You are free to define:

  • which events will trigger a notification

  • how it is sent (e.g. Email, In-app, Slack, etc.)

  • what exactly it says

Again, remember that the Beefree platform only triggers the callback, and it’s up to you to react, if you want. Below you can find the technical details on the comments schema and the onComment callback.

Sample code for email notifications

We’ve put together a sample code that illustrates how to send email notifications, triggered by a mention in a comment. This code shows how to:

  • Define an array to hold the list of mentioned users in the comment payload.

  • Loop through the comment payload and add any strings matching a regex to the array

  • Compare each value in the array with the ‘handle’ property of each user (as defined by the host application), to grab the active users

  • Loop through your array and pull the respective email address for the handle matches (for use in notifications)

  • Send the notification through email (via ajax), slack, etc… (you decide and implement how to send the notification)

The following JSON is saved as part of the template:


"comments": {
    "aab0227f-766d-439d-b3d9-8bf7d04d551f": {
      "content": "Here is a comment",
      "parentCommentId": null,
      "elementId": "ab35241d-dd69-4980-9385-862fedd094e4",
      "responses": [
        "84f11738-a5a2-49db-956a-ae95b4d1db67"
      ],
      "timestamp": "2020-09-07T13:58:43.147Z",
      "author": {
        "userHandle": "abfb7e82-3b9a-45fc-a40d-b22221f6a7f5",
        "username": "Test User",
        "userColor": "#dddddd"
      },
      "isElementDeleted": false
    },
    "84f11738-a5a2-49db-956a-ae95b4d1db67": {
      "content": "Here is a second comment",
      "parentCommentId": "aab0227f-766d-439d-b3d9-8bf7d04d551f",
      "elementId": "ab35241d-dd69-4980-9385-862fedd094e4",
      "responses": [],
      "timestamp": "2020-09-07T13:59:51.954Z",
      "author": {
        "userHandle": "d09b0f5d-e08b-4dca-b7ae-6010b5da04d3",
        "username": "Test User B",
        "userColor": "#cae5f1"
      },
      "isElementDeleted": false
    }
  }

You may want to save multiple copies of a template, e.g. to create a history/revision or a draft feature.

In such cases, you may decide to store the comments in a database, and add the schema back to the template when it’s loaded. Alternatively, you can keep the comments inside the template, and it will become a static part of the history.

Comments can also be added dynamically, but it’s an advanced task, which requires matching the comment schema to the target content by its “elementId”.

Commenting Callback

When a thread or comment changes, the Beefree system triggers the onComment callback. The callback returns the following details:

change

  • JSON contains all the details on the change

comments

  • JSON array of the entire comments schema, as described in the previous section.

threadUsers

  • JSON contains the contributors array with all users in a thread.

Change Schema

type

  • NEW_COMMENT

  • COMMENT_THREAD_RESOLVED

  • COMMENT_THREAD_REOPENED

  • COMMENT_EDITED

  • COMMENT_DELETED

payload

JSON contains all the details of the change

Example of new comment payload


{
    "change": {
        "type": "NEW_COMMENT",
        "payload": {
            "commentId": "a2c555e4-72f7-4e7f-96cd-537e5eb2069c",
            "comment": {
                "content": "add new Text block and logo here!",
                "parentCommentId": null,
                "elementId": "73dcc71b-1ba7-458d-81b8-59ec54e534a5",
                "mentions": [],
                "responses": [],
                "timestamp": "2022-04-05T13:53:28.089Z",
                "author": {
                    "userHandle": "0.6379069806343958",
                    "username": "John Doe",
                    "userColor": "#ff4400"
                }
            }
        }
    },
    "comments": {
        "a2c555e4-72f7-4e7f-96cd-537e5eb2069c": {
            "content": "add new Text block and logo here!",
            "parentCommentId": null,
            "elementId": "73dcc71b-1ba7-458d-81b8-59ec54e534a5",
            "mentions": [],
            "responses": [],
            "timestamp": "2022-04-05T13:53:28.089Z",
            "author": {
                "userHandle": "0.6379069806343958",
                "username": "John Doe",
                "userColor": "#ff4400"
            }
        }
    },
    "threadUsers": {
        "contributors": [
            {
                "userHandle": "0.6379069806343958",
                "username": "John Doe",
                "userColor": "#ff4400"
            }
        ]
    }
}

Adding mentions

You can activate a mention dialog for comments by adding a data source to the Beefree application configuration. You can use the “Hooks” data source method to fetch data from your application and pass it to the Beefree system in real-time.

To configure a hook data source, define the hooks section in your bee config and implement the getMentions method.


var beeConfig = {
  ...
  hooks: {
    getMentions: {
      handler: async (resolve, reject, args) => {
        const mentionedPeople = [{
          "userColor": "#FF5733",
          "username": "John Doe", // Displayed in dialog
          "value": "John Doe", // Inserted mention value
          "uid": "11c8482f-c05d-4480-9861-6d5c64ffbc4a"
        }, {
          "userColor": "#74FF33",
          "username": "userdef5678",
          "value": "Jane Doe",
          "uid": "ed43043f-1c15-4133-bedb-e78efb69e0ba"
        }]
        let filtered = mentionedPeople
        if (typeof args === "string") {
          filtered = mentionedPeople.filter(item => item.username.toLowerCase().includes(args.toLowerCase()))
        }
        resolve(filtered)
    }
  },
  ...

You can also extend the default mention dialog via Content Dialog. For example, you can enable end-users to to invite an external user not available in the data source.

To configure a hook content dialog, define the contentDialog section in your Beefree application configuration and implement the getMention method.


var beeConfig = {
  ...
  contentDialog: {
    ...
    getMention: {
      label: 'Send an invite',
      handler: userInput('Who do you want to mention?', {
        username: 'Jerry Doe',
        value: 'Jerry Doe',
        uid: "f6287c33-6e77-40cb-8a5d-66d62b4f38bb",
      })
    },

You can generate a link to a specific comment, which can be used to notify the user. Common use cases include sending a link via email, Slack, API, or via in-app messaging. To implement this action use the onComment callback combined with a new instance method called showComment.

Here’s how it works:

The onComment callback contains the comment’s id and a new section called “mentions” containing an array of mentioned users’ uid values.


  "mentions": [
    "45b9cdd1-60af-4235-ac9f-ddcb7b07a9e0",
    "04b3a1a3-ab04-46f7-b03b-e651357b54ab"
  ],

With the uid, your application can look-up the user’s contact details. The Beefree platform does not track any sensitive information, such as user emails!

Similarly, since mentions can trigger events and the uid can generate notifications, you can match uid to userHandle.

Next, using the comment’s id, your app can generate a link back to the email containing the comment. The new showComment instance method can be invoked from Beefree’s onLoad callback to send the user directly to the comment as soon as the editor is fully loaded and ready.

Note: In the sample below, getParameterByName is a function that takes the commentId from the browser’s URL query string.


onLoad: function () {
  bee.showComment(getParameterByName('commentId'))
},
https://drive.google.com/file/d/1Z0FnlCE0DwvWUZMXnVeg66LFF4ow4YmU/view?usp=sharingdrive.google.com

Connect your file storage system

As you may have noticed, when you create a new Beefree application, it comes with a default cloud storage option for files (images or files that the message uses or links to). This approach may fit well for applications that offer content creation for the first time, especially if they don’t need to share these files with other areas of the host application.

If you do want users to be able to access the same image and file directories that they use elsewhere in your application, we have a solution.

We created a way to connect to a custom file system provider, allowing you to use your own file storage, no matter which technology you use. A custom file system provider is an API that will allow a Beefree SDK application to perform actions with files outside of the Beefree SDK system, connecting your file system to the Beefree SDK File Manager.

It can be built with your preferred technology: just be sure to follow our instructions to ensure successful communication between the two systems.

Once successfully connected, when a user uploads a file or creates a new folder in the Beefree File Manager, this API will perform these actions in your storage, instead of our default cloud storage. Directories permissions, root directory to use, how thumbnails for images are generated, etc.: you decide.

Getting Started: Data Formats

In order to let your Beefree application consume your FSP (File system provider) API, you will need to provide a Base URL to reach the API.

Base URL: https://myfsp.com/path/to/your/base/endpoint

Note that:

  • the Base URL must not end with a trailing slash (/)

  • it must be hosted on the HTTPS protocol

The API uses JSON as the input and output data format: Responses are JSEND standard compliant.

In the event of a successful response, the API returns a “success” status code (ex. 200 OK) and a JSON object such as the following:


{
  "status": "success",
  "data": { /* ... */ }
}

In the event an unexpected error occurred during request processing (i.e. missing mandatory request data), the API returns an “error” status code and a JSON object such as the following:


{"status":"error","message":"something went wrong accessing backend filesystem"}

In the event a request fails, the API returns the error codes described in the Error codes section.

Authentication

Authentication is managed using Basic Authentication type. The Beefree SDK system’s resource server works as a proxy for FSP (File system provider) and consumes FSP API endpoints adding the following fields to HTTP Request Headers. Please note that the API must use HTTPS to grant secure connections and safe data transfer.

User information is segmented by UID parameter.


Authorization: Basic base64(username:password)
X-BEE-ClientId: ClientId
X-BEE-Uid: uid
Field
Description

Authorization

Authentication used is Basic. A string formatted as username:password and encoded in base64 is passed

X-BEE-ClientId

The ClientId (to identify the integrator)

X-BEE-Uid

The uid (ex. useful to identify the user of an integrator)

Ensure you save the username, password, and base URL in the Configuration section of the Beefree SDK Console.

Move Files in the File Manager

You can enable the move icon for files within the File manager. This move icon allows your end users to move their files between folders, locations, and so on within the File manger. They can access the move icon directly on the file within the File manager. The move icon is a folder with an arrow pointing right inside it. End users click this icon to initiate the process of relocating the corresponding file to a new destination.

Complete the following tasks to enable the move files feature for your custom FSP:

  • Add a can-move field in the extra object in the listing directory content response. Reference the Listing Directory Content section for steps on how to complete this.

  • Modify the listing response to limit its content when the request includes the x-bee-fsp-flags: move header. Reference the Listing for Move Dialog section for steps on how to complete this.

  • Implement a PATCH method for file URLs with conflict_strategy management. Reference the Implement PATCH Method section for steps on how to complete this.

File System operations

This section will show samples of successful requests to FSP (File system provider) API. A response contains metadata about directory and files.

Metadata

In this section, we define the following types of metadata:

  • Common meta

  • File-specific meta

  • Directory-specific meta

Common Meta

The following table lists the fields, descriptions, types and examples for the FSP API response common meta.

Field
Description
Type
Example

mime-type

application/directory for directories and specific mime-type for files

string

“application/directory”, “images/png”, …

name

resource name

string

“my file.jpg”

path

absolute path to resource in FSP

string

“/absolute/path/to/my file.jpg”, “/absolute/path/to/my directory/”, …

last-modified

UNIX time with (milliseconds) of last modification of this resource

int

1445401740000 (stands for: Wed, 21 Oct 2015 04:29:00 GMT)

size

size (in byte) of the resource, this is zero (0) for directories

int

2048

permissions

defines the access grants to the resource, can be ro for read-only access or rw for read-write access

string

ro or rw

extra

generic extra data (for future extensions)

object

File-specific Meta

The following table lists the fields, descriptions, notes and examples for the FSP API response file-specific meta.

Field
Description
Notes
Type

public-url

Public url of this file

This field must be url-encoded

string

thumbnail

Public url of the thumbnail of this file

This field is optional and must be url-encoded

string

Directory specific Meta

The following table lists the fields, descriptions, notes and examples for the FSP API response directory-specific meta.

Field
Description
Notes
Type

item-count

number of contained items (directories + files)

This parameter is optional, if you don’t have this data, feel free to pass zero 0

int

Listing Directories

Description: Use this to list the directories within the File manager.

Request

The following code shows an example request for listing directories.


GET /
Authorization: Basic 5AMPL3
X-BEE-ClientId: BeeFree
X-BEE-Uid: 1111-2222-333-444

Response

The following code shows an example response for listing directories.

{
    "status": "success",
    "data": {
        "meta": {
            "mime-type": "application/directory",
            "name": "root",
            "path": "/",
            "last-modified": 1432982102000,
            "size": 0,
            "permissions": "ro",
            "item-count": 2,
            "extra": {}, // if null, please use empty object
        },
        "items": [
            {
                "mime-type": "application/directory",
                "name": "shared",
                "path": "/shared/",
                "last-modified": 1432984102000,
                "size": 0,
                "permissions": "ro",
                "item-count": 13,
                "extra": {}, // if null, please use empty object
            },
            {
                "mime-type": "application/directory",
                "name": "mydir",
                "path": "/mydir/",
                "last-modified": 1432982102000,
                "size": 0,
                "permissions": "rw",
                "item-count": 3,
                "extra": {}, // if null, please use empty object
            }
        ]
    }
}

Each resource returned by the API has a meta field with metadata. Directory content is returned into items field as array of metadata of contained resources.

Resource access notes

Some notes about resources access management in the previous example:

  • /shared/ cannot be renamed, because it is contained in a ro directory

  • /mydir/ cannot be renamed, because it is contained in a ro directory

  • user cannot “CRUD” resources in /shared/, because it is ro

  • user can “CRUD” resources in /mydir/, because it is rw

Listing Directory Content

Description: This response tells the user interface (UI) whether or not to show the move icon for files within the File manager.

Display the Move Icon

The can-move property controls whether or not the move button is visible within the user interface (UI).

Take the following steps to display the move icon for file within the File manager:

  1. In the response of the listing endpoint, add a new field named can-move within the extra object for each file item.

  2. The can-move field has a boolean value indicating whether the file can be moved. You can set this value to true or false.

Request

The following code shows an example request for listing directory content.


GET /mydir/
Authorization: Basic 5AMPL3
X-BEE-ClientId: BeeFree
X-BEE-Uid: 1111-2222-333-444

Response

The following code snippet shows an example of the can-move property set to true.

{
    "name": "image1.jpg",
    "path": "/image1.jpg",
    "last-modified": 1703065836532,
    "permissions": "rw",
    "mime-type": "image/jpeg",
    "size": 184149,
    "public-url": "https://myfsp.com/path/to/image1.jpg",
    "thumbnail": "https://myfsp.com/path/to/image1.jpg_thumb.png",
    "extra": {
        "can-move": true
    }
}

Response Metadata

The following table shows the response metadata and its corresponding type and description.

Metadata
Type
Description

name

string

File name.

path

string

File path.

last-modified

number

The date that the file was last modified.

permissions

string

The permissions for the file.

mime-type

string

The file mime type.

size

number

The size of the file.

public-url

string

The public-url to access the file.

thumbnail

string

The thumbnail URL.

extra

object

The object that contains the can-move property to true or false.

can-move

boolean

A boolean key within the extra object that displays the move button on a file in the File manager when set to true.

Listing for Move Dialog

Description: When the move button is pressed, the "move dialog" appears and the usual listing URL is called.

The following image shows an example of the move dialog. This dialog appears after the end user clicks on the move icon for a file. In the image, you can see that the move dialog includes a list of directories for the end user to select from in order to relocate the file.

The following code shows an example of the GET request that occurs when the move icon is pressed within the File manager and the "move dialog" appears. This GET request includes the x-bee-fsp-flags: move header, which is responsible for this behavior.

GET /mydir/
Authorization: Basic 5AMPL3
X-BEE-ClientId: BeeFree
X-BEE-Uid: 1111-2222-333-444
X-BEE-fsp-flags: move

The move dialog only shows folders. The GET request will return the full response, including the folders and the files. However, the response will only show items with "mime-type": "application/directory" . The File System Provider recognizes this call by the x-bee-fsp-flags: move header.

For the move dialog to work effectively, it is important that you limit the size of the response. Ensure that the response to this request only contains folders and not any files.

Create a new directory

Description: Use this when creating a new directory within the File manager.

Request

The following code shows an example request for creating a new directory.


POST /mydir/new%20dir/
Authorization: Basic 5AMPL3
X-BEE-ClientId: BeeFree
X-BEE-Uid: 1111-2222-333-444

Response

The following code shows an example response for creating a new directory.

{
    "status": "success",
    "data": {
        "meta": {
            "mime-type": "application/directory",
            "name": "new dir",
            "path": "/mydir/new dir",
            "last-modified": 1432982102000,
            "size": 0,
            "permissions": "rw",
            "item-count": 0,
            "extra": {}, // if null, please use empty object
        }
    }
}

Create operation notes:

  • in order for the create directory operation to succeed, the containing directory must exist, and the contained (new) directory must not exist

  • directory names will match the following regular expression: [ a-zA-Z0-9._- \(\)]+

Deleting a directory

Description: You can only delete empty directories. Use this to delete a directory when it is empty.

Request

The following code shows an example request for deleting a directory.


DELETE /my%20dir/docs/
Authorization: Basic 5AMPL3
X-BEE-ClientId: BeeFree
X-BEE-Uid: 1111-2222-333-444

Response

The following code shows an example response for deleting a directory.

{
    "status": "success",
    "data": null
}

Uploading a file

Description: Use this method when uploading a file to the File manager.

Request

The following code shows an example request for uploading a file.


POST /mydir/my%20pic3.png
Authorization: Basic 5AMPL3
X-BEE-ClientId: BeeFree
X-BEE-Uid: 1111-2222-333-444
Content-Type: application/json
 
{
  "source": "http://www.remotehost.com/remotepic.png",
  "conflict_strategy": "keep"
}

Response

The following code shows an example response for uploading a file.

{
    "status": "success",
    "data": {
        "meta": {
            "mime-type": "image/png",
            "name": "my pic3.png",
            "path": "/mydir/my pic3.png",
            "last-modified": 1432982102000,
            "size": 400000,
            "permissions": "rw",
            "public-url": "https://resources-bucket.s3.amazonaws.com/1111-2222-333-444/my%20pic3.png",
            "thumbnail": "https://my-thumbnail-service.com/my%20pic3.png",
            "extra": {}, // if null, please use empty object
        }
    }
}

Managing a File Name Conflict

Handling Upload Conflicts

If an upload has a name conflict with an existing file in the target folder, the FSP must decide how to manage this conflict:

  1. Return an Error: Notify the user about the conflict and do not proceed with the upload.

  2. Ask the User: Prompt the user for instructions on how to handle the conflict.

  3. Overwrite File: Replace the existing file with the new upload.

  4. Rename and Complete: Complete the upload using a different name, usually by appending a suffix. Ensure the metadata is consistent with the newly created file.

Ask the user what to do: The FSP can prompt the user for action only if the conflict_strategy field is set to ask. In this scenario, the FSP must return a 3400 error code, instructing the Builder to display a dialog to the user.

Example response:

{
  "code": 3400,
  "message": "Resource Already Present"
}

When the user clicks the keep or replace buttons, a new upload request is sent to the FSP with the conflict_strategy field set to either keep or replace.

If there's a filename conflict, the FSP should return a 3401 error code. This instructs the Builder to show a toast notification to the user and prompt them with a dialog.

Note: When you replace an image, the thumbnail updates immediately to show the new version. However, the main image URL, which is used in the stage and in any previously sent emails, may still display the old version until the cache clears. This cache expiration typically happens within 2 hours but can vary.

Upload Operation Notes

Uploads are proxied by Beefree’s resource APIs, which enforce the maximum file size configured by the Console. Uploads from various sources are handled as follows:

  • Image Editor: POST to /editor_images/{filename}. Filename is a UUID.

  • Page Builder Favicons: POST to /favicon_images/{filename}.

  • Stage: POST to /editor_images/{filename}.

Deleting a file

Description: Use this to delete a file within the File manager.

Request

The following code shows an example request for deleting a file.


DELETE /mydir/my%20pic2.png
Authorization: Basic 5AMPL3
X-BEE-ClientId: BeeFree
X-BEE-Uid: 1111-2222-333-444

Response

The following code shows an example response for deleting a file.

{
    "status": "success",
    "data": null
}

Implement PATCH Method

Description: When the move icon is clicked in the File manager, the File System Provider (FSP) will receive this call. It is a PATCH on the URL of the file to move.

The final step in activating the move feature within your File manager is to configure a conflict resolution strategy. This strategy is triggered when there is a file conflict within the File manager.

An example of a conflict is when you are moving a file from one folder to another, but the destination folder has an existing file with the same name as the file being moved to that folder. For example, you want to move a pizza.jpg file to a folder that already contains a pizza.jpg file. In this scenario, there is a conflict because both files cannot have the same name.

The PATCH Method enables you set a conflict_strategy that resolves scenarios like these when they occur.

The following code shows an example of this method.

PATCH /mydir/file-to-move.jpg
Authorization: Basic 5AMPL3
X-BEE-ClientId: BeeFree
X-BEE-Uid: 1111-2222-333-444
Content-Type: application/json

{
 "new_path": "/my/other/dir/",
 "conflict_strategy": ""
}

Move Response in Case of Success

The following response is the same as the upload method. This is the response you will see in the event that a file was successfully moved to a new location.

{
 "status": "success",
 "data": {
 "meta": {
 ...
 }
 }
}

Move Response in Case of Name Conflict

This is the response you will see in the event that a file was not successfully moved to a new location, and an error occurred.

{
 "code": 3400,
 "message": "Resource Already Present"
}

In the event a name conflict occurs, the File manager displays a dialog to the user. You have three options to select from to resolve this conflict using the conflict_strategy which is passed to the FSP.

These three conflict resolution options are the following:

  • cancel ( "conflict_strategy": "" ): nothing happens

  • keep both ( "conflict_strategy": "keep" ): move the file, in order to keep both files our implementation appends a suffix to the new one. For example, the pizza.jpg file will become pizza_1.jpg ( _2 , _3 , ...)

  • replace ( "conflict_strategy": "replace" ): move the file, it overwrites the old file with the new one

The trailing slash (/) on the request matters! The FSP API uses the trailing slash (/) on the resource path to understand if the required resource is a file (no trailing slash) or a directory (with trailing slash). For example, if the FSP API receives a GET request for /sample.jpg it will return sample.jpg file metadata, whereas if it receives a GET request for /sample.jpg/ it will return a list of the content located in the sample.jpg directory.

Status codes and Error codes

In case of errors, the API returns a JSON object structured like this:

{
    "code": 3200,
    "message": "Resource Not Found",
    "details": "http://myfsp.com/docs/errorcodes/404"
}

To read the full list of possible errors, please refer to this page.

Displaying thumbnails

Thumbnail generation is up to the developer of the file system provider.

In case you don’t want to develop your own thumbnail generation procedure, you can use a service like rethumb by Rapid to create a thumbnail URL.

The thumbnail field is optional, so if you don’t want a thumbnail for your file, do not pass the field and the Beefree system will show you a generic icon based on the mime type you passed.

The thumbnail image must be contained in a 200px by 200px virtual square (see pictures below).

Screenshot of an image within the File Manager. There are three icons next to the image and the middle icon displays the move button, which allows the end user to move the file to a new location within the File manager.
Example image of the move dialog that shows a list of directories for the end user to select from to relocate their file

Change Log

A classnames change log where you can reference current and past changes to CSS classes.

Release Scheduled for March 2025

This section includes a reference of the new classnames scheduled for release in March 2025. The new classnames will be related to Mobile Badge and Confirmation Dialogs. For more details, click the > symbol to expand the expandable content sections containing additional information.

Mobile Badge | Scheduled for March 2025

This section includes a reference for new classnames related to Mobile Badge.

Content

Reference the classname changes related to Content for Mobile Badge in the following expandable section.

Mobile Badge Content

This section shows the classname updates for the Mobile Badge Content. The following Markup variations apply to each of the Content types outlined in this section.

  • Converted the badge into a button

  • Removed a <span>

  • Moved it out of the widget's label tag

Button

Affected Sub-element: Width Slider

Classnames Removed: Not applicable

Classnames Added

  • widget-mobile-badge-enabled--cs

Carousel, Text, Video

Affected Sub-element: Block options - Padding

Classnames Removed: Not applicable

Classnames Added

  • widget-mobile-badge-enabled--cs

Divider, Image, Social

Affected Sub-element: Align, Block options - Padding

Classnames Removed: Not applicable

Classnames Adde

  • widget-mobile-badge-enabled--cs

Form

Affected Sub-element: Font size, Block options - Padding

CClassnames Removed: Not applicable

Classnames Added

  • widget-mobile-badge-enabled--cs

Button, Title, Icons, Image, List, Menu, Paragraph

Affected Sub-element: Font size, Align, Block options - Padding

Classnames Removed: Not applicable

Classnames Added

  • widget-mobile-badge-enabled--cs

Spacer

Affected Sub-element: Height

Classnames Removed: Not applicable

Classnames Added

  • widget-mobile-badge-enabled--cs

Rows

Reference the classname changes related to Rows for Mobile Badge in the following expandable section.

Mobile Badge Row

The following sections show the classname updates for the Mobile Badge Row.

Affected Sub-element: Columns Structure - Padding

Markup Variations

The following Markup variations apply for Mobile badge row.

  • Converted the badge into a button

  • Removed a <span>

Classnames Removed: Not applicable

Classnames Added

  • widget-mobile-badge-enabled--cs

Confirmation Dialogs | Scheduled for March 2025

This section includes a reference for new classnames related to Confirmation Dialogs.

Rows

Reference the classname changes related to Rows for Confirmation Dialogs in the following expandable section.

Delete Row Confirmation Dialog

Affected Sub-element: Delete Row Confirmation Dialog

Markup Variations:

  • Removed SVG icon

Classnames Added

  • confirmation-title--cs

Reference the corresponding Custom Translations for Delete Row.

Column

Reference the classname changes related to Columns for Confirmation Dialogs in the following expandable section.

Delete Column Confirmation Dialog

Affected Sub-element: Delete Column Confirmation Dialog

Markup Variations:

  • Removed SVG icon

Classnames Added

  • confirmation-title--cs

Reference the corresponding Custom Translations for Delete Column.

Module

Reference the classname changes related to Modules for Confirmation Dialogs in the following expandable section.

Delete Module Confirmation Dialog

Affected Sub-element: Delete Module Confirmation Dialog

Markup Variations:

  • Removed SVG icon

Classnames Added

  • confirmation-title--cs

Reference the corresponding Custom Translations for Delete Module.

Rows

Reference the classname changes related to Rows for Confirmation Dialogs in the following expandable section.

Hide Row on Mobile with Module Already Hidden on Desktop

Affected Sub-element: Hide Row Confirmation Dialog

Markup Variations:

  • Removed SVG icon

Classnames Added

  • confirmation-title--cs

Reference the corresponding Custom Translations for Hide Row on Mobile with Module Already Hidden on Desktop.

Rows

Reference the classname changes related to Rows for Confirmation Dialogs in the following expandable section.

Remove Custom Display Condition

Affected Sub-element: Remove Custom Display Condition Confirmation Dialog

Classnames Added

  • confirmation-title--cs

Reference the corresponding Custom Translations for Remove Custom Display Condition.

File manager

Reference the classname changes related to File Manager for Confirmation Dialogs in the following expandable section.

Confirm Delete Single File

Affected Sub-element: File Manager - Confirm Delete Single File

Classnames Added

  • confirmation-title--cs

Reference the corresponding Custom Translations for Confirm Delete Single File.

File manager

Reference the classnames added in the following expandable section.

Confirm Delete Multiple Files

Affected Sub-element: File Manager - Confirm Delete Multiple Files

Classnames Addded

  • confirmation-title--cs

Reference the corresponding Custom Translations for Confirm Delete Multiple Files.

File manager

Reference the classnames added in the following expandable section.

Confirm Upload Existing File

Affected Sub-element: File Manager - Confirm Upload Existing File (Custom FSP and ConfirmOverwriteModalEnabled)

Classnames Added

  • confirmation-title--cs

Reference the corresponding Custom Translations for Confirm Upload Existing File.

January 30, 2025 Releases

Display Conditions Widget and Modal | Release on January 30, 2025

Display Conditions Widget

New Classnames Display Conditions Widget

Display Condition Widget

  • Display Conditions Widget Affected Sub-element: Display Conditions Widgets

    Changes:

    • Markup Variations:

      • contentDialog button is now "secondary", not "primary".

    Classnames Comparison:

    Classnames Removed
    Classnames Added

    item_1-2

    display-condition-card--cs

    panel__actions

    display-condition-card_custom--cs

    display-condition-label--cs

    display-condition-description--cs

    display-condition-label_before--cs

    display-condition-before--cs

    display-condition-label_after--cs

    display-condition-after--cs

    display-condition-buttons--cs

    row-display-condition-edit-button--cs

Select Display Condition Modal

New Classnames Select Display Condition Modal

Select Display Condition Modal

  • Select Display Condition Modal Affected Sub-element: Select Display Condition Modal

    Classnames Comparison:

    Classnames Removed
    Classnames Added

    category-selected

    selectable-modal-search--cs

    back-action

    selectable-modal-breadcrumb--cs

    selectable-modal-items-list--cs

December 5, 2024 Releases

Add New Social and Form | Released on December 5th

Form

New Classnames Form

Form

  • Form Affected Sub-element: Manage fields - Add new field

    Changes:

    • Markup Variations:

      • Removed some wrapper divs

      • Replaced all the list HTML

    Classnames Comparison:

    Classnames Removed
    Classnames Added

    toggle-menu-button--cs

    button-small--cs

    button-large--cs

    button-solid--cs

    widget__textbox

    button-primary--cs

    widget__searchbox

    button--cs

    scrollable__panel--cs

    add-form-field--cs

    dropdown-menu--cs

    dropdown-menu-button--cs

    dropdown-menu-search--cs

    input-search--cs

    dropdown-menu-scrollable--cs

    dropdown-menu-item--cs

Social

New Classnames Social

Social

  • Social Affected Sub-element: Configure icon collection - Add social icon

    Changes:

    • Markup Variations:

      • Removed some wrapper divs

      • Replaced all the popover HTML

    Classnames Comparison:

    Classnames Removed
    Classnames Added

    icons-manager__pop--cs

    button-small--cs

    icons-manager__popcontent

    button-solid--cs

    popver__tab

    button-primary--cs

    social-add-icon--cs

    button--cs

    add-social-icon--cs

    dropdown-menu--cs

    dropdown-menu-button--cs

    dropdown-menu-search--cs

    input-search--cs

    dropdown-menu-scrollable--cs

    dropdown-menu-item--cs

Add New Attributes and Title Bar | Release on December 5th

1. Button, Image, Video

New Classnames Button, Image, Video
  • Button, Image, Video Affected Sub-element: Configure attributes - Add new attribute

    Changes:

    • Markup Variations:

      • Removed some wrapper divs

      • Replaced all the list HTML

    Classnames Comparison:

    Classnames Removed
    Classnames Added

    toggle-menu-button--cs

    button-small--cs

    button-large--cs

    button-solid--cs

    scrollable__panel--cs

    button-primary--cs

    button--cs

    add-attribute--cs

    dropdown-menu--cs

    dropdown-menu-button--cs

    dropdown-menu-search--cs

    input-search--cs

    dropdown-menu-scrollable--cs

    dropdown-menu-item--cs

2. Sidebar Title

New Classnames All

Sidebar Title

  • Sidebar Title Affected Sub-element: Sidebar Title

    Changes:

    • Markup Variations:

      • Added <div role="toolbar">

      • <a> elements are now <button>

    Classnames Comparison:

    Classnames Removed
    Classnames Added

    widgets-section__heading

    widgets-section__heading--cs

    icon

    sidebar-panel-title-icon--cs

    icon-*

    sidebar-panel-title-icon-comment--cs

    sidebar-panel-title-icon-delete--cs

    sidebar-panel-title-icon-duplicate--cs

    sidebar-panel-title-icon-closepanel--cs

    sidebar-panel-title-icon-save--cs

    sidebar-panel-title-icon-editSyncedRow--cs

3. Rows

New Classnames Rows

Rows Affected Sub-element: Sidebar Title

Changes:

Markup Variations:

  • Added <div role="toolbar">

  • <a> elements are now <button>

Classnames Comparison:

  • Classnames Removed:

    • widgets-section__heading

    • icon

    • icon-*

  • Classnames Added:

    • widgets-section__heading--cs

    • sidebar-panel-title-icon--cs

    • sidebar-panel-title-icon-comment--cs

    • sidebar-panel-title-icon-delete--cs

    • sidebar-panel-title-icon-duplicate--cs

    • sidebar-panel-title-icon-closepanel--cs

    • sidebar-panel-title-icon-save--cs

    • sidebar-panel-title-icon-editSyncedRow--cs

November 7, 2024 Releases

Mobile Stage Mode, History, and Empty States | Released on November 7th

Mobile Stage Mode, History, and Empty States

Mobile Stage Mode, History, and Empty States

  • Mobile Stage Mode Affected Sub-element: Wrapper

    Classnames Added:

    • stagemode__buttonswrapper--cs

    Mobile Stage Mode Buttons:

    • Desktop button: stagemode__button__desktop--cs

    • Mobile button: stagemode__button__mobile--cs

    • Display toggle button: stagemode__button__display--cs

  • Undo/Redo Affected Sub-elements: Undo/Redo Buttons and History Panel

    Classnames Added:

    • Toggle button: undo-redo__toggleButton--cs

    • Undo button: undo-redo__undoButton--cs

    • Redo button: undo-redo__redoButton--cs

    • History panel: undo-redo__history--cs

    • History panel item: history__step--cs

  • Empty States (Various Modules) Affected Modules: Image, Icons, Video, Menu, Social, Form, AddOn, Dynamic Content

    Classnames Added:

    • Image module: stage-module_image_placeholder--cs

    • Icons module: stage-module_icons_placeholder--cs

    • Video module: stage-module_video_placeholder--cs

    • Menu module: stage-module_menu_placeholder--cs

    • Social module: stage-module_social_placeholder--cs

    • Form module: stage-module_form_placeholder--cs

    • AddOn module: stage-module_addon_placeholder--cs

    • DynamicContent module: stage-module_merge-content_placeholder--cs

Changes Font Stye and Drag-and-Drop Widgets | Released on November 7th

1. Form Components

New Classnames for Form Components

Form Components

  • Affected Widgets: Font style

  • Changes:

    • Markup Variations: Removed some wrapper div and span elements.

    • Classnames Comparison:

    Classnames Removed
    Classnames Added

    tgl-container

    multi-toggle--cs

    tgl-container--cs

    multi-toggle-btns--cs

    item_1-2

    toggle-btn-pressed--cs

    widget__label

    btn-group

    number-selector

    number-selector--cs

    tgl_bgd

    multiToggle_option_descriptor_form_style_labels_font-weight_0

    multiToggle_option_descriptor_form_style_labels_font-weight_1

    button-default--cs

    button-medium--cs

    button--cs

    active

2. Social Widget

New Classnames for Social Widget

Social Widget

  • Affected Widget: Configure Icon Collection

  • Changes:

    • Markup Variations:

      • Removed wrapper div.

      • Replaced the drag handle div with a button.

    • Classnames Comparison:

    Classnames Removed
    Classnames Added

    item_1-2

    social-collection-list--cs

    widget__label

    panel__title--cs

    icons-manager__pop

    title_icon

    icon-organizer__panel

    panel__icon-preview-wrapper

    panel__title

    comp-tree-placeholder

3. Icons Widget

New Classnames for Icons Widget

Icons Widget

  • Affected Widget: Configure Icon Collection

  • Changes:

    • Markup Variations:

      • Removed wrapper div.

      • Replaced the drag handle div with a button.

    • Classnames Comparison:

    Classnames Removed
    Classnames Added

    item_1-2

    icons-collection-list--cs

    widget__label

    panel__title--cs

    icon-organizer__panel

    panel__icon-preview-wrapper

    panel__title

    comp-tree-placeholder

4. Menu Widget

New Classnames for Menu Widget

Menu Widget

  • Affected Widget: Configure Menu Items

  • Changes:

    • Markup Variations:

      • Removed wrapper div.

      • Replaced the drag handle div with a button.

    • Classnames Comparison:

    Classnames Removed
    Classnames Added

    item_1-2

    items-collection-list--cs

    widget__label

    item-organizer__panel--cs

    icon-organizer__panel

    panel__title--cs

    icon-organizer__panel--cs

    panel__icon-preview-wrapper

    panel__title

    title__icon

    comp-tree-placeholder

5. Form Widget

New Classnames for Form Widget

Form Widget

  • Affected Widget: Manage Fields

  • Changes:

    • Markup Variations:

      • Removed wrapper div and span elements.

      • Replaced the drag handle div with a button.

    • Classnames Comparison:

    Classnames Removed
    Classnames Added

    item_1-2

    form-items-list--cs

    widget__label

    form-item__panel--cs

    icon-organizer__panel

    form-field-item-id--cs

    icon-organizer__panel--cs

    panel__icon-preview-wrapper

    panel__title

    title__icon

    comp-tree-placeholder

6. Carousel Widget

New Classnames for Carousel Widget

Carousel Widget

  • Affected Widget: Configure Carousel

  • Changes:

    • Markup Variations:

      • Removed wrapper div and span elements.

      • Added a label tag.

      • Replaced div elements with ul and li for better semantic structure.

      • Replaced the drag handle div with a button.

    • Classnames Comparison:

    Classnames Removed
    Classnames Added

    icon-manager__add-icon--cs

    widget__label--cs

    icon-organizer__panel--cs

    carousel-slides-list--cs

    comp-tree-placeholder

    carousel-add-slide-btn--cs

    slide-organizer__panel--cs

October 10, 2024 Releases

Form Edit Modal | Released on October 10th

1. Form Edit Modal - Text Inputs

List of New Classnames for the Form Edit Modal Text Inputs

Form Edit Modal - Text Inputs

  • Affected Sub-element: All text inputs

  • Changes:

    • Markup Variations:

      • Updated to the new input text component.

      • The label is now positioned on top instead of to the left.

    • Classnames Comparison:

    Classnames Removed
    Classnames Added

    number-selector--cs

    input-text--cs

    item_1-2

    input-text-boxed--cs

    widget__textbox

    widget__label

    widget__label--textbox

    btn

2. Form Edit Modal - Required and Read Only Toggles

List of New Classnames for the Form Edit Modal Required and Read Only Toggles

Form Edit Modal - Required and Read Only Toggles

  • Affected Sub-element: Required and Read Only Toggles

  • Changes:

    • Markup Variations:

      • Changed from toggles to checkboxes for Required and Read Only fields.

    • Classnames Comparison:

    Classnames Removed
    Classnames Added

    toggle-wrapper--cs

    checkbox-wrapper--cs

    toggle-input--cs

    widget__label--cs

    toggle-slider--cs

Content Dialog

This feature is available on Beefree SDK paid plans only.

The problem

When designing a message or a landing page with Beefree’s editors, there might be cases in which users of your application insert a merge tag, add a link to an image, or apply a conditional statement.

It’s all good until things scale up. For example…

  • What if you have 400 merge tags? You can feed an array of merge tags to the editor, but that’s not going to cut it.

  • What if it’s a 6,000 product database? How will they locate the right one? Special Links is not the right fit.

  • And what if a display condition needs to be built on-the-fly?

A flexible solution

Since the Beefree builders are used in hundreds of applications, and since each of them is facing different user experience challenges like the examples mentioned above, we decided that this was really a case where one size does not fit all.

So we engineered a solution that puts you in control and provides a large amount of flexibility.

If your users want to insert a merge tag or a display condition, you control how that will happen. You can overlay a window on top of the editor, for example, and display a simple search box, a list of categories to browse, or a complex configurator to build an advanced conditional statement.

We call this feature Content Dialog.

An interactive UI layer

Content Dialog allows you to build user interfaces for your users to locate & insert merge tags, links, conditional statements, and more. It lets you establish an interaction layer between the editor and your application (e.g. you show a pop-up window) that allows your users to locate/build/insert specific content (merge tags, links, conditional statements, etc.). And you’re in full control of the UI.

For example, imagine you want your customers to be able to quickly locate a link to a product page and assign that link to a button, image, or text. Content Dialog will let you build the right user experience.

Here is a visual example of what you could accomplish in that find a product link scenario.

The user experience in this interaction layer is entirely up to you. In the example above, the user clicked on “Find a product” (or alike) in the editor, and a modal window was shown, with a search box in it. Since you decide what the user experience will be like, you are fully in control of how users will select and insert:

  • a text placeholder (merge tag)

  • a dynamic link or a link to specific content (special link)

  • a markup placeholder (merge content)

  • a conditional statement (display conditions).

For each type of content, you can define the action that will be triggered in your application (e.g. display a modal window), and the text that will be displayed in the Beefree SDK editor’s UI to trigger that action (e.g. “Locate a merge tag”), keeping a consistent UX with other areas of your application.

What it does

Content Dialog introduces new call-to-actions in the editor UI.

Depending on the type of content, the call-to-action will be rendered as a button, a link, or a drop-down choice (see below a detailed list of UI changes).

The text for the action is defined by the host application, so you can use your own wording to provide a better experience.

An example of a possible workflow when the user clicks on a content dialog action:

  1. The editor will start waiting mode (same as when the save action is triggered)

    • This mode prevents users from further editing and keeps the focus on the user selection

    • The waiting mode is interrupted if the host application cancels the action

  2. The host application will display to the user a UI element to select or define a content item

  3. When the selection is done, the host application closes the UI and passes it to the editor

  4. The editor receives from the host application the selected content and exits waiting mode

  5. The content is applied to the selected item

The same example applied to special links (link to a product) in a text selection:

  1. The editor starts waiting mode

  2. The host application displays an overlay that hides the editor and lists the categories of products to link. The user browses them to find the desired product and selects it.

  3. The editor receives the link and exits waiting mode

  4. The link is applied to the selected text

How it works

To set up content dialogs you will need to add the contentDialog object to beeConfig:



contentDialog: {
	specialLinks: {
		label: 'Custom text for links',
		handler: function(resolve, reject) {
			// Your function
		}
	},
	mergeTags: {
		label: 'Custom text for merge tags',
		handler: function(resolve, reject) {
			// Your function
		}
	},
	mergeContents: {
		label: 'Custom text for merge contents',
		handler: function(resolve, reject) {
			// Your function
		}
	},
	rowDisplayConditions: {
		label: 'Custom text for display conditions',
		handler: function(resolve, reject, currentCondition) {
			// Your function
		}
	},
	externalContentURLs: {
            label: 'Custom text for custom rows',
            handler: function(resolve, reject) {
                // Your function
        }
    },
	saveRow: {
    	handler: function (resolve, reject, args) {
        	// Your function
    	}
	},
    editSyncedRow: {
	    label: 'Custom text for synced rows',
        description: 'Custom description for synced rows',
	    notPermittedDescription: 'Custom description for synced rows when not permitted',
        handler: function (resolve, reject, args) => {
        	// Your function
    	}
    }

}

For rowDisplayConditions, there is a third parameter called currentCondition. Use this parameter to return a row's current display condition. This parameter returns an object with the following format:

{
    label: '',
    description: '',
    before: '',
    after: '',
    type: 'BEE_CUSTOM_DISPLAY_CONDITION'
}

Note: You do not have to name the parameter currentCondition. You can use any name that works best for your application and workflow.

You can add all the dialogs, some of them or only one. Is up to your application to create them for all the users or a segment, as there are no related server-side settings, you can customize them for each editor start.

All the dialogs use the same pattern, but the returned object must match the element pattern (described in the following section).

label

Defines the text displayed in the editor UI.

handler

Is a function with a Promise-like signature. This function lets you use your own logic to retrieve the desired value. Once the value is available, you must call the resolve(value) function to pass it to the editor. In case you want to cancel the operation, call the reject() function.

A resolve or reject call is mandatory. If you miss this step, the editor will remain in waiting mode. Error management on the host application must call the reject function to unblock the editor.

Examples

The following code snippet displays and example of applying a link action.



contentDialog: {
  specialLinks: {
    label: 'Add an Example Link',
    handler: function(resolve, reject) {
      resolve({
        type: 'custom',
        label: 'external special link',
        link: 'http://www.example.com'
      })
    }
  },
}

The above code snippet is an example of how to apply a Special link.

When the user clicks on Add an Example Link, the URL http://www.example.com is applied to the selection (a button, an image or a text).

The waiting mode will not be perceived, and there is no cancel action.

Apply a link with a delay

The following code snippet displays and example of applying a link with a delay.



contentDialog: {
  specialLinks: {
    label: 'Add an Example Link after 2 seconds',
    handler: function(resolve, reject) {
      setTimeout(function() {
        resolve({
          type: 'custom',
          label: 'external special link',
          link: 'http://www.example.com'
        })
      }, 2000)
    }
  },
}

The setTimeout function in the above code sample is used to delay the execution of the enclosed code. It delays the call to the resolve function by 2000 milliseconds, or 2 seconds. This means that after initiating the special link dialog process, the application will wait for 2 seconds before adding and displaying the specified special link with the label 'external special link' and the URL 'http://www.example.com'.

Opening a dialog UI element

The following code snippet displays and example of opening a dialog UI element.


contentDialog: {
  specialLinks: {
    label: 'Custom text for links',
    handler: function(resolve, reject) {
      openMySpecialLinkDialog() // Replace this with your application function
        .then(specialLink => resolve(specialLink))
        .catch(() => reject())
    }
  },
},

In this example the openMySpecialLinkDialog() should be replaced with a function that opens a modal window (or other element) of the host application, where the user can select or build a link.

The selection is then returned as the value of specialLink to the resolve() function.

A cancel action will trigger the reject() function instead.

Returned value syntax

Values must use the same pattern used in the beeConfig object.

The returned object is validated against the expected format.

If the validation fails, an error will be returned in the browser console:

E.g., Error getting content rowDisplayConditions, the item is malformed.

These errors will not trigger any visible notification in the UI.

Merge Tags

Merge tags allow you to dynamically insert values into your content, such as user information or other variables. This section will guide you on how to configure merge tags in your host application. See the following section for sample code on setting up merge tags in your content dialog configuration.

Merge Tags Configuration

Take the following steps to configure merge tags in your application:

  1. Open your content dialog configuration file:

    Locate the file where you configure your application's content dialog.

  2. Add the contentDialog object:

    If it doesn't already exist, add the contentDialog object into your configuration file.

  3. Configure the mergeTags property:

    Inside the contentDialog object, insert the mergeTags property as shown below:

    contentDialog: {
        mergeTags: {
            label: 'Apply dynamic syntax',
            handler: function(resolve, reject) {
                //your function goes here
            }
        },
    },
  4. Define the handler function:

    Within the handler function, write your logic to dynamically insert values into the content.

  5. Add a corresponding action in the text toolbar:

    Ensure that the text toolbar includes an action for the merge tag element, allowing users to apply dynamic syntax easily.

  6. Test your implementation:

    Validate that the merge tags are working correctly within the UI, ensuring that the dynamic values are properly inserted.


contentDialog: {
	mergeTags: {
		label: 'Apply dynamic syntax',
		handler: function(resolve, reject) {
			//your function goes here
		}
	},
},

You can add a new action, available in the text toolbar, and associated with the merge tag element:

Most common use cases

A few of the most common use case for merge tags are the following:

  • Your application has a high number of placeholders and needs to provide a categorization or search form

  • Placeholder availability depends on options that the user can select while building the message

  • You want to display the same UI your users already know and use in your application

  • You need to separate merge tags from other text placeholders

Value

The following code snippet defines an object with name and value parameters meant for handling placeholders in an application. The name parameter, although not immediately displayed, is useful for later reference if the user selection is saved and reloaded. The value parameter contains a text string with specific syntax. This is for inserting dynamic content. This setup is important for applications to manage many placeholders or custom text fields efficiently.

{
	name: 'Placeholder name', // Will not be shown
	value: '{{ syntax }}' // Text string that will be added
}

Important: The name parameter may be later displayed if the user selection is saved and loaded in beeConfig on subsequent requests.

Special Links

Special links are dynamic URLs embedded within emails to execute predefined actions, such as:

  • Unsubscribing a recipient: Allowing users to easily opt-out from mailing lists.

  • Loading a Web version of an email: Enabling recipients to view the email content in a browser.

  • Sending the email to a friend: Facilitating users to share the email with others.

A few end user benefits of using special links are the following:

  • User Convenience: Simplifies adding recurring URLs and actions to designs, which increases efficiency throughout the design creation process.

  • Consistent Implementation: Ensures URLs and actions are consistent and accessible across various platforms.

Important: Special links are inserted as code and treated as such during export, ensuring they populate in the HTML as-is. This prevents encoding issues and guarantees that the syntax is validated by the sending platform.

By incorporating special links, end users benefit from the ease of managing various links efficiently across diverse platforms.

This section will explain how to configure special links with steps and provide a code sample to help get you started.

Special Links Configuration

Take the following steps to configure special links in your application:

  1. Define a contentDialog object within your configuration or settings file.

  2. Add a specialLinks property to the contentDialog object.

  3. Set the label property to the desired name for your link, for example, 'Search a post link'.

  4. Create a handler function within the specialLinks object where you will define the custom logic for handling the link.

  5. Ensure this handler function takes resolve and reject parameters to manage its behavior.

The following code snippet provides an example of how you can configure special links.


contentDialog: {
	specialLinks: {
		label: 'Search a post link',
		handler: function(resolve, reject) {
			//your function goes here
		}
	},
},

Links can be applied to different content types. When you define a link dialog action, it will be displayed in the text-toolbar, which is the same behavior for merge tags, as shown in the following image.

The following image shows an example action that applies to image or button content types.

Most common use cases:

A few of the most common use case for special links are the following:

  • Apply links to products or news using a categories pattern, a search form, or a visual browser

  • Apply special parameters or configuration to certain links with a wizard or form

  • You want to display the same UI your users already know and use in your application

Value

In the following code sample, the parameters serve the following purposes:

  • type: Represents the type of link but will not be shown to the user directly.

  • label: Provides default text for the link if no specific text is selected.

  • link: Contains the URL that will be applied when creating the link, with the possibility of using placeholders.

{
    type: 'A link type', // will not be shown
    label: 'Text', // Will be used as default text when text is not selected
	link: 'http://...' // The URL that will be applied. Placeholders can be used
}

Important: The type parameter will be displayed later if the user selection is saved and loaded in beeConfig during subsequent requests.

Merge Contents

Merge contents is a feature that allows you to consolidate multiple content sources into a unified display. This section will cover how to configure this feature and its most common use cases.

Merge Contents Configuration

  1. Access the configuration file of your application.

  2. Locate the contentDialog object within the file.

  3. Add a mergeContents property to the contentDialog object.

  4. Inside the mergeContents property, set a label with the description you want to appear, such as 'Set up a new product recommendation'.

  5. Implement a handler function that will process your custom logic. This function should accept two parameters: resolve and reject.

  6. Insert your specific code inside the handler function where indicated.

Your configuration should look like the following:


contentDialog: {
	mergeContents: {
		label: 'Set up a new product recommendation',
		handler: function(resolve, reject) {
			//your function goes here
		}
	},
},

The content dialog adds a button to the merge content list as shown in the following image.

Most common use cases

A few of the most common use case for merge contents are the following:

  • Set up the content and/or layout for a product recommendation

  • Set up the content and/or layout for a dynamic advertising

  • Set up the content and/or layout for another type of targeted content

Important: To display the Dynamic content tile in the contents panel, you must configure mergeContents in beeConfig with at least one predefined item.

Value

In the following code snippet, the properties perform the following tasks:

  • name: This property specifies the display name of the content. It appears in the editor UI and helps users identify the content item within the messaging interface.

  • value: This property represents the actual content that will be injected into the HTML output, shown in the preview. The {{ syntax }} is typically used for dynamic content insertion.


{
	name: 'Content name', // Will be displayed in the editor UI and in the message
	value: '{{ syntax }}' // Text string that will be added to the HTML output (will be show in the preview)
}

Display Conditions

Display conditions allow you to control when specific content is shown based on predefined criteria. This section will cover how to configure display conditions in your application and common use cases.

Display Conditions Configuration

To configure display conditions in your host application, take the following steps:

  1. Define the contentDialog Object: Start by defining an object called contentDialog in your code. This object will hold the configuration for the display conditions.

    contentDialog: {
        // Configuration properties go here
    },
  2. Add the rowDisplayConditions Property: Within the contentDialog object, add a property named rowDisplayConditions. This property will specify the conditions under which a particular row is displayed.

    contentDialog: {
        rowDisplayConditions: {
            // Properties for display conditions go here
        },
    },
  3. Set the label Property: Inside the rowDisplayConditions object, define a label property. This property sets the text label for the display condition. For example, to set the label as "Open builder":

    contentDialog: {
        rowDisplayConditions: {
            label: 'Open builder',
        },
    },
  4. Define the handler Function: Add a handler property inside the rowDisplayConditions object. This property is a function that determines the logic for your display conditions. It accepts two parameters: resolve and reject, which are typically used for promise handling.

    contentDialog: {
        rowDisplayConditions: {
            label: 'Open builder',
            handler: function(resolve, reject) {
                // Your function goes here
            }
        },
    },
  5. Implement the Display Logic: Within the handler function, implement the logic to determine whether the row should be displayed. Use the resolve function to indicate the conditions are met, and the reject function to indicate they are not.

    contentDialog: {
        rowDisplayConditions: {
            label: 'Open builder',
            handler: function(resolve, reject) {
                // Your custom logic to determine display conditions
                if (/* condition */) {
                    resolve();
                } else {
                    reject();
                }
            }
        },
    },
  6. Complete the Configuration: Make sure your configuration object is properly closed and integrated into your application. Ensure that all necessary conditions and logic are correctly defined within the handler function.

    contentDialog: {
        rowDisplayConditions: {
            label: 'Open builder',
            handler: function(resolve, reject) {
                // Your custom logic to determine display conditions
                if (/* condition */) {
                    resolve();
                } else {
                    reject();
                }
            }
        },
    },

Customize the logic within the handler function to meet your specific needs.

A new button will be available in the display condition widget. In this example, the button says “Open builder”, which is the label shown in the JSON configuration file shown above.

Most common use cases:

A few of the most common use case for display conditions are the following:

  • Display a condition builder or form to target a segment of recipients

  • Display a form to create a loop with the row dynamic contents, as product recommendations

Value

The following code snippet configures a display condition with a specific label, description, and delimiters that define the start and end of the condition block in the template. This will be shown in the editor UI and inserted around the selected row based on the specified conditions.

{
	type: 'A category for this condition', // Will not be shown
	label: 'Condition', // Will be displayed as the condition name
	description: 'Small text describing what the condition does', // Will be displayed in the editor UI to identify the condition action
	before: '{% if something == \'Condition\' %}', // Will be added before the selected row
	after: '{% endif %}', // Will be added after the selected row
}

Important: The type parameter may be later displayed if the user selection is saved and loaded in beeConfig on subsequent requests.

An example

In this example, a window is shown to users when they click on the button to open the builder.

The UI is entirely up to the hosting application. Here, the developer decided to offer some fields at the top where the Display Condition can be named and described, an area below it where parameters, values, and operators can be selected, and a preview on the right.

When users click on “Confirm”, the information is passed back to the editor and shown in the properties panel.

Of course, it can be edited in the editor like any other Display condition, if the user has the rights to do so.

Reference our Advanced Permissions documentation to learn more about managing the visibility of the Add Condition and Edit Condition buttons.

Custom Rows

Custom rows allow you to import products or news using various patterns, set up predefined content layouts, and create dynamic sections for recommendations, codes, and advertisements. This section will discuss how to configure custom rows in your host application.

Custom Rows Configuration

The following code snippet displays an example of how to configure custom row.

contentDialog: {
    externalContentURLs: {
            label: 'Search products',
            handler: function(resolve, reject) {
                // Your function
        }
    }
}

The content dialog adds a new item, using your text label, in the Rows drop-down:

Most common use cases

A few of the most common use case for custom rows are the following:

  • Import a set of products or news, as custom rows, using a categories pattern, a search form, or a visual browser

  • Set up the row layout for a set of predefined contents

  • Set up rows with dynamic content to build dynamic sections that provide product recommendations, QR or bar codes, advertising content, etc.

Value

The following code snippet configures a custom row with a specific name and value. This will be shown in the editor UI in reference to a specific custom row based on the specified conditions.

{
    "name":"Results name", // Will be added as a new choice in the rows drop-down
    "value":"https://..." // Will be used to get the list of rows
}

This response will:

  1. Create a new drop-down choice with the provided name

  2. Display the rows provided by the URL in the rows panel

Notice that in the rows list, names returned by the content dialog display as highlighted elements to give them further visibility over starting choices.

The content dialog can be used as many times as the user needs and, depending on the response, the behavior may change:

1. Returning the same name

This overwrites the existing results, keeping the same name in the drop-down. This behavior perfectly matches our example above, where the host application returns “Your search results” every time the content dialog is resolved.

2. Returning a new name

This creates a new drop-down choice, keeping the previous results as selectable elements. Previous results are available directly in the drop-down. Usage example:

Synced Rows

Synced rows are rows that are used across multiple designs, ensuring consistency when updates to a row are made. This section will cover how to configure synced rows in your application.

Synced Rows Configuration

The following code snippet displays an example of how to configure synced rows.

contentDialog: {
    editSyncedRow: {
		label: 'Edit synced rows',
		description: `This row is used in other designs.
					  You can decide to update all the designs or transform this single row into a regular one`,
		notPermittedDescription: `This row is used in other designs.
                                  Your plan does not permit you to edit it. Please contact your account administrator`,
        handler: function (resolve, reject, args) => {
        	resolve(false) // the boolean will be the value of  'Label of the sidebar button that triggers the contentDialog'`synced`
                           // if false the row will be un-synced, if true nothing will happen.
    	}
    }
}

The label, description and notPermittedDescription fields handle the wording related to the “Edit synced row” call-to-action/button. Here’s how and where they are used:

  • label: Label related to the sidebar button that triggers the content dialog

  • description: Description of the action on top of the button

  • notPermittedDescription: Description of the action when the button is hidden from the dedicated advanced permission

Here’s an example of what label and description would look like:

And here’s an example of what notPermittedDescription would look like:

Save Rows

Save rows refer to the functionality that allows users to save changes made to specific rows in a data table. This section will discuss how to configure the Save rows feature in your host application.

Saved Rows Configuration

The following code snippet displays an example of how to configure save rows.

contentDialog: {
    saveRow: {
        handler: function (resolve, reject, args) {
            // Your function
        }
    }
}

Unlike the rest of content dialog configurations, Save rows doesn’t use the label parameter as the UI element is a save icon displayed on the selected row (and in the row’s properties panel):

The Save rows content dialog is a mandatory step in the Save rows workflow.

The resolve function must return metadata for the selected row. The metadata section of the rows schema allows you to keep track of row-specific information.

The args object in the handler function returns to the host application metadata already applied to the selected row.

Value

The following code snippet configures a save row with a specific name and category. This will be shown in the editor UI in reference to a specific saved row.


{
    "name":"Row name", // Mandatory metadata
    "Category":"A row category" // If you provide category management for saved rows
    "...":"..." // You can add as metadata as your application needs
}

This response will provide metadata that is added to the row in the asset (email, page, popup) before it’s provided through the Save Rows callback.

The row name is the only required metadata and it’s displayed as the row title in the Rows panel:

  • A string of plain text that identifies the row.

  • Displayed in the row card when the row is shown in the Rows panel.

  • Used for text searches within the Rows panel

Check the Saved rows metadata section for further details on recommended metadata.

Forms

Forms are interactive elements that allow users to input and submit data. This section will discuss how to configure forms to meet specific requirements in your host application.

Forms Configuration

The following code snippet displays an example of how to configure forms.

manageForm: {
	label: 'Edit form',
	handler: async (resolve, reject, args) => { 
		// Your function
	} 
},

If you want to have total control on the forms that a Beefree SDK application displays and renders, you can use this forms Content Dialog rather than passing a single form to the Beefree SDK application.

The forms Content Dialog works the same way as the previous Content Dialog for save rows – but in this case, the resolve function should return the structure for the desired form.

The args object in the handler function returns to the host application the form object already applied. With this information, the application can decide what to display to the user (e.g., edit the current form, suggest a similar form, etc.).

To understand how this data is structured, refer to the form structure page on this website.

Custom Attributes

Custom attributes are user-defined metadata that can be added to links and images within an editor. This section will discuss how to configure custom attributes in your host application.

Custom Attributes Configuration

The following code snippet displays an example of how to configure custom attributes.

        customAttribute: {
          label: 'Search Attributes',
          handler: (resolve, reject) => {
            resolve({
              key: '2783f0ea-f6af-44f3-856e-d7a01cd87714',
              name: '100% Custom',
              value: 'My custom value',
              target: 'link',
            })
          }
        },

If your end users need to apply custom attributes to the links and images in their content, you can completely customize the user experience and workflow for adding those attributes with a Content Dialog that will take over the editor’s UI. The dialog will need to return the attribute to apply.

Custom Video

Custom video allows you to integrate and configure videos from custom sources other than standard platforms like YouTube and Vimeo. This section will discuss how to configure custom video for your host application.

Custom Video Configuration

The following code snippet displays an example of how to configure custom video.

addVideo: {
  label: 'Choose a video',
  handler: async (resolve, reject) => {
    resolve({
      videoSrc: 'https://link.to.your.custom.video', // mandatory
      thumbSrc: 'https://my.beautifulimages.com/thebest.jpg', // mandatory
      thumbAlt: 'The title of my custom video!', // optional
    })
  }
}

It is possible to leverage the Content Dialog method to add videos from custom sources – other than YouTube and Vimeo.

You can use the addVideo Content Dialog modal, which will take over the builder’s UI. The video will be added as a thumbnail in the content area.

The user must fill out the video URL from a custom source, the image used as a thumbnail, and an alt text/title by implementing a custom modal window (optional). When the user clicks on the video thumbnail, it will open videoSrc in a new tab/window.

Content Defaults

This feature is available on Beefree SDK paid plans only.

Overview

With Content Defaults, you can define how content looks when dragged into an email or page.

When adding new content elements through the Content tab, you may want a default style that matches one of these options:

  • your application’s color scheme;

  • your user’s branding guidelines;

  • the look & feel of the template used to create the message or page.

For example, here is how a button dragged into the stage looks by default:

  • The background color is always light blue (HEX code #3AAEE0).

  • The font size is always 16px.

  • The font is Arial, unless a different Default font was set for the template loaded in the editor.

  • The border radius is set at 4.

  • The CTA is a formally correct, but laconic “Button”.

Instead, when applying Content defaults, the button dragged by your users could look out of the box like this:

We’ve used a dark grey color (HEX code #555555), an Ubuntu font at 22px in Bold, with a border radius of 10 and a nice “READ MORE” call-to-action.

Content Defaults are part of the Configuration parameters passed to your Beefree application during startup, so you can have different sets of them for different users.

Use cases

By setting up your Content defaults, you’ll be able to address styling and branding needs for you and your customers.

Create a more consistent UX between your application and the editor

If your application uses dark grey for the primary CTA, then you probably would want a default button in the Beefree builders to follow that style.

Match your customers’ branding

If your application has brand settings that are used for your app’s UI or for assets managed in your application, you may want those to apply also to default content in the Beefree editors.

Create a more consistent experience within the editor

If you’ve customized how the editor looks like, either through Themes or Custom CSS, you may want default content to adhere to the same style.

Define custom social blocks

Since the Social block is one of the available Content defaults, you can define what social platforms – either present in the Beefree editors or added by you – are included when a social block is added to a message or page. For example, you can have a default social block with three platforms defined in the Beefree system and a fourth, custom one (Messenger):

How it works

To set up the content styles you will need to add the contentDefaults object to beeConfig:


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  ...
  contentDefaults: {
    title: { ... },
    text: { ... },
    image: { ... },
    row: { ... },
    button: { ... },
    divider: { ... },
    social: { ... },
    dynamic: { ... },
    video: { ... },
    form: { ... },
    icons: { ... },
    menu: { ... },
    spacer: { ... },
    paragraph: { ... },
    list: { ... },
    carousel: { ... },
    table: { ... },
    general: { ... },
  }
}

Available content settings

You can add all the content styles, some of them or just one. It is up to your application to create them for all the users or for a segment, as there are no related server-side settings; basically you can customize them each time the editor starts.

All the contents use the same pattern, but the object must match the content schema for the type of content (described in the following section).

Title

The title content default inside the beeConfig sets default properties and styling for title elements in the editor. It includes heading levels, alignment, padding, and mobile-specific styles to ensure consistency and responsiveness across different devices.


titleDefaultConfig: {
  bold: true
},
titleDefaultStyles: {
  h1: {
    color: 'red',
    'font-size': '34px',
    'font-family': 'Arial, sans-serif',
    'font-weight': '700',
    'link-color': 'blue',
    'line-height': '120%',
    'text-align': 'center',
    'direction': 'ltr',
    'letter-spacing': 0,
  },
  h2: {
    color: 'red',
    'font-size': '24px',
    'font-family': 'Arial, sans-serif',
    'font-weight': '700',
    'link-color': 'blue',
    'line-height': '120%',
    'text-align': 'center',
    'direction': 'ltr',
    'letter-spacing': 0,
  },
  h3: {
    color: 'black',
    'font-size': '14px',
    'font-family': 'Arial, sans-serif',
    'font-weight': '700',
    'link-color': 'blue',
    'line-height': '120%',
    'text-align': 'center',
    'direction': 'ltr',
    'letter-spacing': 0,
  },
},
contentDefaults: {
  title: {
    hideContentOnMobile: true,
    defaultHeadingLevel: 'h3',
    blockOptions: {
      align: 'center',
      paddingTop: '5px',
      paddingRight: '5px',
      paddingBottom: '5px',
      paddingLeft: '5px',
    },
    mobileStyles: {
      textAlign: "center",
      fontSize: "30px",
      paddingTop: "20px",
      paddingRight: "20px",
      paddingBottom: "20px",
      paddingLeft: "20px",
    },
  }
}

Text

The text content default within the beeConfig provides a default HTML string and sets the styles for text blocks, including color, font, and line height. It also includes options for padding and visibility on mobile devices to ensure a consistent appearance across different screen sizes.

Please note that the default text inside html is required.


text: {
  html: 'This is default text for block...',
  styles: {
    color: "#e63c60",
    linkColor: "#e63c60",
    fontSize: '22px',
    lineHeight: "200%",
    fontFamily: "'Comic Sans MS', cursive, sans-serif",
  },
  blockOptions: {
    paddingBottom: "20px",
    paddingLeft: "20px",
    paddingRight: "20px",
    paddingTop: "20px",
    hideContentOnMobile: true
  },
  mobileStyles: {
    paddingTop: "30px",
    paddingRight: "30px",
    paddingBottom: "30px",
    paddingLeft: "30px",
  },
}

Image

The image content defaults in the BeeConfig define the properties for images, including attributes like alt, src, and href, as well as styling details such as dimensions, border radius, and padding. It also specifies mobile-specific styles to ensure proper alignment and spacing on different devices.


image: {
  alt: "My Alt Label",
  href: "http://www.google.com",
  src: "https://react.semantic-ui.com/images/wireframe/white-image.png",
  width: "250px" // optional - 100% default
  borderRadius: "30px",
  blockOptions: {
    paddingBottom: "0px",
    paddingLeft: "0px",
    paddingRight: "0px",
    paddingTop: "0px",
    align: "center",     
    hideContentOnMobile: true
  },
  mobileStyles: {
    textAlign: "right",
    paddingTop: "10px",
    paddingRight: "10px",
    paddingBottom: "10px",
    paddingLeft: "10px",
  },
}

Image Parameters

Parameter
Data Type
Example
Description

borderRadius

String

30px

Defines the roundness of the image corners.

Row

The row content default in the BeeConfig specifies various styling properties for rows, including background colors, vertical alignment, border radius, and spacing. It also includes options for mobile-specific styles, such as stacking and padding configurations.

row: {
  styles: {
    backgroundColor: "red",
    contentAreaBackgroundColor: "green",
    verticalAlign: "bottom",
    columnsBorderRadius: "10px",
    columnsSpacing: "20px",
    columnsStackOnMobile: false,
    columnsReverseStackOnMobile: true,
    columnsPadding: "42px",
    columnsPaddingLeft: "25px",
    columnsPaddingRight: "20px",
    columnsPaddingTop: "15px",
    columnsPaddingBottom: "10px",
    columnsBackgroundColor: "yellow",
    padding: "20px",
    paddingLeft: "25px",
    paddingRight: "20px",
    paddingTop: "15px",
    paddingBottom: "10px",
  }
}

Row Parameters

The following table lists the row content default parameters and their corresponding descriptions and data types.

Parameter
Data Type
Example
Description

backgroundColor

String

Red

Sets the background color of the row.

contentAreaBackgroundColor

String

Green

Sets the background color of the content area within the row.

verticalAlign

String

bottom

Specifies the vertical alignment of the row content.

columnsBorderRadius

String

10px

Defines the roundness of the column corners.

columnsSpacing

String

20px

Sets the spacing between columns.

columnsStackOnMobile

Boolean

false

Determines if columns should stack on mobile devices.

columnsReverseStackOnMobile

Boolean

true

Specifies if the order of stacked columns should be reversed on mobile devices.

columnsPadding

String

42px

Defines the padding inside each column (the value applies to all padding sides).

columnsBackgroundColor

String

Yellow

Sets the background color for each column.

columnsPaddingLeft

String

25px

Defines the left padding for each column.

columnsPaddingRight

String

20px

Defines the right padding for each column.

columnsPaddingTop

String

15px

Defines the top padding for each column.

columnsPaddingBottom

String

10px

Defines the bottom padding for each column.

padding

String

20px

Defines the padding for the entire row (the value applies to all padding sides).

paddingLeft

String

25px

Defines the left padding for the entire row.

paddingRight

String

20px

Defines the right padding for the entire row.

paddingTop

String

15px

Defines the top padding for the entire row.

paddingBottom

String

10px

Defines the bottom padding for the entire row.

Button

The button content default in the BeeConfig specifies the appearance and behavior of buttons, including attributes such as label, hyperlink, width, and styles like font, color, and padding. It also defines block options for padding and alignment, as well as mobile-specific styles for responsiveness.


button: {
  label: "My New Label",
  href: "http://www.google.com ",
  width: "35%",
  styles: {
    color: "#ffffff",
    fontSize: '22px',
    fontFamily: "'Comic Sans MS', cursive, sans-serif",
    backgroundColor: "#FF819C",
    borderBottom: "0px solid transparent",
    borderLeft: "0px solid transparent",
    borderRadius: "25px",
    borderRight: "0px solid transparent",
    borderTop: "0px solid transparent",
    lineHeight: "200%",
    maxWidth: "100%",
    paddingBottom: "5px",
    paddingLeft: "20px",
    paddingRight: "20px",
    paddingTop: "5px"
  },
  blockOptions: {
    paddingBottom: "20px",
    paddingLeft: "20px",
    paddingRight: "20px",
    paddingTop: "20px",
    align: "center",
    hideContentOnMobile: true
  },
  mobileStyles: {
    paddingBottom: "10px",
    paddingLeft: "10px",
    paddingRight: "10px",
    paddingTop: "10px",
    textAlign: "center",
    fontSize: "40px",
  },
  hoverStyles:{
    color: "#FFFFFF"
    backgroundColor: "#16688B",
    borderBottom: "0px solid transparent",
    borderLeft: "0px solid transparent",
    borderRight: "0px solid transparent",
    borderTop: "0px solid transparent",
  }
}

Divider

The divider content default in the BeeConfig specifies the appearance of dividers, including properties such as width, line style, and alignment. It also defines block options for padding and visibility on mobile, as well as mobile-specific styles for alignment and padding.


divider: {
  width: '50%',
  line: "10px solid #BBBBBB",
  align: "right",
  blockOptions: {
    paddingBottom: "20px",
    paddingLeft: "20px",
    paddingRight: "20px",
    paddingTop: "20px",
    hideContentOnMobile: true
  },
  mobileStyles: {
    align: 'left',
    paddingLeft: "10px",
    paddingRight: "10px",
  },
}

Social

The social content default in the BeeConfig specifies the display of social media icons, including their type, name, image properties, and link. It also defines the block options for alignment and padding, with specific styles for mobile devices.


social: {
  icons: [
    {
      type: 'custom',
      name: 'Facebook',
      image: {
        prefix: 'https://www.facebook.com/',
        alt: 'Facebook',
        src: `https://img.icons8.com/dusk/64/000000/facebook-new--v2.png`,
        title: 'Facebook',
        href: 'https://www.facebook.com/'
      },
      text: ''
    }
  ],
  blockOptions: {
    align: "center",
    hideContentOnMobile: true,
    paddingBottom: "10px",
    paddingLeft: "10px",
    paddingRight: "10px",
    paddingTop: "10px",
  },
  mobileStyles: {
    paddingTop: "10px",
    paddingRight: "10px",
    paddingBottom: "10px",
    paddingLeft: "10px",
    textAlign: "right",
  },
}

Dynamic

The dynamic content default in the BeeConfig specifies the block options, including padding and the ability to hide content on mobile. This ensures a consistent design by managing spacing and visibility across different devices.


dynamic: {
    blockOptions: {
      paddingBottom: "20px",
      paddingLeft: "20px",
      paddingRight: "20px",
      paddingTop: "20px",
      hideContentOnMobile: true,
    }
  }

Video

The video content default in the BeeConfig specifies block options, including padding and the ability to hide content on mobile devices, ensuring a consistent appearance across different platforms. Additionally, it defines mobile-specific styles to enhance the user experience on smaller screens.


video: {
  blockOptions: {
    paddingBottom: "20px",
    paddingLeft: "20px",
    paddingRight: "20px",
    paddingTop: "20px",
    hideContentOnMobile: true,
  },
  mobileStyles: {
    paddingTop: "40px",
    paddingRight: "40px",
    paddingBottom: "40px",
    paddingLeft: "40px",
  },
}

Form

The form content default in the BeeConfig defines the structure and styling for form elements, including fonts, colors, alignments, and padding, ensuring a consistent layout across different devices. It also includes options for mobile-specific styles to improve usability on smaller screens.


form: {
  structure: {...}, // see form docs
  styles: {
    width: "100px"
    fontSize: "14px",
    fontFamily: "'Comic Sans MS', cursive, sans-serif",
    fontWeight: '700',
  },
  labelsOptions: {
    color: "#000000",
    lineHeight: "200%",
    fontWeight: "",
    fontStyle: "",
    align: "left",
    position: "top"
    letterSpacing: 1,
    minWidth: 30,
  },
  fieldsOptions: {
    color: "#000000",
    backgroundColor: "#ffffff",
    outlineColor: "#3AAEE0",
    borderRadius: "4px",
    borderTop: "1px solid transparent",
    borderRight: "1px solid transparent",
    borderBottom: "1px solid transparent",
    borderLeft: "1px solid transparent",
    paddingBottom: "5px",
    paddingLeft: "5px",
    paddingRight: "5px",
    paddingTop: "5px",
  },
  buttonsOptions: {
    color: "#ffffff",
    backgroundColor: "#3AAEE0",
    borderRadius: "4px",
    borderTop: "0px solid transparent",
    borderRight: "0px solid transparent",
    borderBottom: "0px solid transparent",
    borderLeft: "0px solid transparent",
    lineHeight: "200%",
    align: "center",
    width: "100%",
    maxWidth: "100%",
    paddingBottom: "5px",
    paddingLeft: "20px",
    paddingRight: "20px",
    paddingTop: "5px",
    marginBottom: "0px",
    margingLeft: "0px",
    marginRight: "0px",
    marginTop: "0px",
  },
  blockOptions: {
    align: "center",
    paddingBottom: "10px",
    paddingLeft: "10px",
    paddingRight: "10px",
    paddingTop: "10px",
    hideContentOnMobile: true,
    hideContentOnDesktop: false,
    backgroundColor: "#FF819C",
  },
  mobileStyles: {
    textAlign: "right",
    fontSize: "25px",
    paddingTop: "20px",
    paddingRight: "20px",
    paddingBottom: "20px",
    paddingLeft: "20px",
  },
}

Icons

The icons content default in the BeeConfig specifies the properties for displaying icon items, such as the image source, text, size, and link attributes. It also includes styles for the icon's appearance and mobile-specific configurations to ensure proper alignment and padding across devices.


icons: {
  items: [
    {
      image: "https://react.semantic-ui.com/images/wireframe/white-image.png",
      textPosition: "right",
      text: "Company name",
      alt: "Company name",
      title: "Company name",
      href: "https://www.acme.com",
      target: "_blank",
      width: "128px",
      height: "48px",
    }
  ],
  styles: {
    color: "#000000",
    fontSize: "14px",
    fontFamily: "'Comic Sans MS', cursive, sans-serif",
    fontWeight: '700',
  },
  blockOptions: {
    align: "center",
    paddingBottom: "0px",
    paddingLeft: "0px",
    paddingRight: "0px",
    paddingTop: "0px",
    hideContentOnMobile: true,
    hideContentOnDesktop: false,
    itemSpacing: "10px",
    iconHeight: "50px",
  },
  iconSpacing: {
    paddingBottom: "5px",
    paddingLeft: "5px",
    paddingRight: "5px",
    paddingTop: "5px",
  },
  mobileStyles: {
    textAlign: "right",
    fontSize: "50px",
    paddingTop: "20px",
    paddingRight: "20px",
    paddingBottom: "20px",
    paddingLeft: "20px",
  },
}

Menu

The menu content default in the BeeConfig defines the properties for menu items, including text, links, and target attributes. It also sets the styles for the menu's appearance and behavior, such as font styles, colors, spacing, and mobile-specific configurations like hamburger icon settings.


menu: {
  items: [
    {
      text: "Contact us"
      link: {
        href: "https://www.acme.com/contact-us",
        title: "Contact us",
        target: "_blank"
      }
    }
  ],
  styles: {
    color: "#000000",
    linkColor: "#0068A5",
    fontSize: "14px",
    fontFamily: "'Comic Sans MS', cursive, sans-serif",
    fontWeight: '700',
  },
  hamburger: {
    mobile: false,
    foregroundColor: "#ffffff",
    backgroundColor: "#000000",
    iconSize: "36px",
    iconType: "normal" // or "rounded"
  },
  blockOptions: {
    align: "center",
    paddingBottom: "0px",
    paddingLeft: "0px",
    paddingRight: "0px",
    paddingTop: "0px",
    hideContentOnMobile: true,
    hideContentOnDesktop: false,
  },
  itemsSpacing: {
    paddingBottom: "5px",
    paddingLeft: "5px",
    paddingRight: "5px",
    paddingTop: "5px",
  },
  mobileStyles: {
    textAlign: "right",
    fontSize: "50px",
    paddingTop: "10px",
    paddingRight: "10px",
    paddingBottom: "10px",
    paddingLeft: "10px",
  },
}

Spacer

The spacer content in the BeeConfig is used to add vertical spacing between elements in the layout. It allows for hiding the spacer on mobile devices through the hideContentOnMobile option.


spacer: {
  height: "60px",
  blockOptions: {
    hideContentOnMobile: true    
  }
}

Paragraph

The paragraph content configuration in BeeConfig specifies the default styles such as color, font size, alignment, line height, and spacing for paragraphs. It also defines block options and mobile styles to ensure consistent rendering on different devices.


paragraph: {
  styles: {
    color: '#000000',
    fontSize: '14px',
    fontFamily: 'inherit',
    fontWeight: '400',
    lineHeight: '120%',
    textAlign: 'left',
    direction: 'ltr',
    letterSpacing: '0px',
    linkColor: '#0068a5',
    paragraphSpacing: '16px',
  },
  blockOptions: {
    paddingTop: '10px',
    paddingRight: '10px',
    paddingBottom: '10px',
    paddingLeft: '10px',
  },
  mobileStyles: {
    textAlign: "right",
    fontSize: "50px",
    paddingTop: "60px",
    paddingRight: "60px",
    paddingBottom: "60px",
    paddingLeft: "60px",
  },
}

List

The list content default in BeeConfig sets the basic styling for list elements, including options like color, font size, alignment, and list type. It also ensures consistent spacing and padding across devices by defining both block options and mobile-specific styles.


list: {
  styles: {
    color: '#000000',
    fontSize: '14px',
    fontFamily: 'inherit',
    fontWeight: '400',
    lineHeight: '120%',
    textAlign: 'left',
    direction: 'ltr',
    letterSpacing: '0px',
    linkColor: '#0068a5',
    liSpacing: '0px',
    liIndent: '40px',
    listType: 'ul', // or 'ol'
    listStyleType: 'revert',
    startList: '1',
  },
  blockOptions: {
    paddingTop: '10px',
    paddingRight: '10px',
    paddingBottom: '10px',
    paddingLeft: '10px',
  },
  mobileStyles: {
    textAlign: "center",
    fontSize: "24px",
    paddingTop: "20px",
    paddingRight: "20px",
    paddingBottom: "20px",
    paddingLeft: "20px",
  },
}

Additionally, listStyleType supports the following: revert, auto, disc, circle, square, decimal, lower-alpha, upper-alpha, lower-roman, upper-roman.

Carousel

The carousel content default in BeeConfig sets the basic padding for carousel elements and provides an option to hide content on mobile devices. It also defines mobile-specific padding to ensure a consistent appearance across different screen sizes.


carousel: {
  blockOptions: {
    paddingBottom: "10px",
    paddingLeft: "10px",
    paddingRight: "10px",
    paddingTop: "10px",
    hideContentOnMobile: true,
  },
  mobileStyles: {
    paddingTop: "20px",
    paddingRight: "20px",
    paddingBottom: "20px",
    paddingLeft: "20px",
  },
}

Table

The table content default in BeeConfig specifies the initial styling and layout properties for table elements, including rows, cells, and headers. It sets text styles, colors, padding, alignment, and optional alternate row and header styles to ensure consistency across different table instances.

{
   ...
   table: {
      rows: [{
        cells: [
          {html: "new-default-text"},{html: "second text"}
        ]
      }, {
        cells: [
          {html: "third"}, {html: "last text"}
        ]
      }],
      headers: [{
        cells: [{html: "header 1"},{html: "header 2"}]
      }],
      styles: {
        color: "red",
        fontFamily: "'Merriweather', serif",
        fontWeight: "700",
        fontSize: "17px",
        textAlign: "right",
        lineHeight: "200%",
        letterSpacing: "8px",
        direction: "rtl",
        linkColor: "yellow",
        backgroundColor: "blue",
        border: "11px solid green",
        alternateRowBackgroundColor: "yellow",
        headersFontSize: "30px",
        headersFontWeight: "400",
        headersTextAlign: "center",
        headersBackgroundColor: "red",
        headersColor: "green",
      },
      blockOptions: {
        paddingBottom: "17px",
        paddingLeft: "15px",
        paddingRight: "14px",
        paddingTop: "13px",
      }
    },
}

Note: If contentDefault values for the Table module are incorrectly formatted, the following onWarning will be triggered (this applies to incorrect values for rows and headers, not all contentDefaults), and the default table will be used instead:

{code: 1730, message: 'Content defaults for [Table] module are not valid'}

If the user tries to load a template that contains an improperly structured Table (for example, if a row does not contain all of its cells), the template will not load, and the onError will be triggered.

The following code displays an example error for this scenario:

{ 
   code: 2250,
   message: 'Bump template validation error',
   detail: 'page/rows/0/columns/0/modules/0/descriptor/table/rows: improperly structured field (each row must contain the same number of cells)',   
}

General

The general content default in the BeeConfig specifies the overall styling for the email template, such as background color, content area width, and default font. These settings help maintain a consistent look and feel throughout the template.


general: {
  backgroundColor: "#efefef",
  contentAreaBackgroundColor: "#efefef",
  contentAreaWidth: "600px",
  defaultFont: "'Comic Sans MS', cursive, sans-serif",
  linkColor: "#efefef"
}

Roles and Permissions

This feature is available on Beefree SDK paid plans only.

About roles and permissions

In Beefree SDK we introduced the idea that some content may be editable by some users and not others. For example, you may want the header and footer section of an email newsletter to be locked, so that it cannot be inadvertently modified when creating the latest version of your weekly news digest.

Internally, we’ve been calling this feature “Restricted editing”. Others refer to it as “locked regions”, “blocked content”, and more.

To allow for this, we created ways for the application hosting the builder to define user roles and set their permissions. Let’s take a look at how the feature works first and then show you how to configure your application to take advantage of it.

Types of roles

The user roles that you create (e.g. Brand Manager, Senior Editor, Junior Editor, etc.) can have different permissions. You can create as many or few user roles as you wish. The permissions that you can assign to them refer to:

  • Locking content (entire rows or specific content blocks)

  • Editing locked content

  • Using Display Conditions

Specifically, the permission settings that can be configured for each role are:

  • Can lock rows (if active, all other permissions are granted)

  • Can lock modules

  • Can edit locked rows

  • Can edit locked modules

  • Can select Display Conditions

  • Can edit Display Conditions

  • Can remove Display Conditions

For example, a Brand Manager all four permissions checked, whereas a Senior Editor might have editing access to rows and modules, but won’t be able to lock rows and modules. Let’s take a look at a few scenarios.

Locking a row

If the user has this permission, locking a row is very easy to do. That user will simply select the row they would like to lock and click on the lock/unlock radio button in the row properties panel.

If a user does not have the permissions needed to edit a locked row, they will see a friendly error when they attempt to select the row, notifying them that the row can’t be edited:

Likewise, they will not be able to drag & drop any content blocks on the locked row, as shown here:

Rows vs content blocks

You can restrict access to layout changes while granting access to content modifications by using user roles and permissions.

This allows you to give your users editing access to the content, while ensuring that the overall layout of the message is not altered, and that specific content blocks that should not be modified are left “as is”. This way, for example, a junior member of the marketing team could focus on updating text & images, without worrying about potentially modifying the structure of the message in an unwanted and/or unauthorized way.

Or, as shown in the example below, the same user could update social media icons and links in the footer of an email, without altering legal language and dynamic fields used in the same footer. That’s accomplished by setting us a social media module that’s editable (unlocked), but in a row that’s locked.

When users without the proper permissions try to edit, move or remove the row, they are told that they may not do so.

Similarly, if they try to edit any content is the row that has not been specifically unlocked, they are told that they are not able to do so. In this case, for instance, the user is not able to edit the merge tags used in the footer of the email.

However, when they click on the social media icons, they are able to edit it.

To accomplish the above, a user with higher permissions needs to:

  1. Open the message in the builder

  2. Lock a row

  3. Unlock one or more specific pieces of content within the row.

Creating and editing user roles

Log into the Beefree SDK Console and click on Manage roles under Application configuration for the selected application:

In the Manage Roles section you’ll be able to create different user roles and set their permissions. For example, your user roles could be Brand Manager, Account Manager, Junior Editor, etc depending on your needs and nomenclature. For each user role you create, you can set and restrict editing permissions, such as the ability to lock or edit rows and content blocks, as you can see below:

Once you create your user roles you’ll be able to see them listed:

How to use the Role Hash parameter

While Role Name is a friendly description of that user role, Role Hash is the parameter that identifies that particular role in Beefree SDK. It must be an alphanumeric string between 8 to 30 characters: it can contain letters and numbers, but cannot contain spaces or special characters (such as “-“, “_”, etc.). You will need to save these role hashes in your application, at the user level – or at the user role level, if you have the concept of “roles” in your application – so that you can retrieve them and pass them to the application when you initialize the builder for that specific user.

The property name is: roleHash.

For user roles to become active in the builder , you will need to add this new property to your Beefree SDK configuration when you configure the builder for a specific user. You will pass:

roleHash: "roleSpecified"

for each of the user, depending on its role. For example, if the Role Hash for a “Junior Editor” is “juniorEditor”, the application configuration will include:

roleHash: "juniorEditor"

Please refer to configuring the builder for more details.

Combination of user roles and permissions

This section goes in more details about the various combinations of permissions. It might help you understand how to best put this feature to work in Beefree SDK with regard to locking & unlocking rows and content blocks.

First, we created some hypothetical roles by using all application combinations of the available user permissions at the row/content level.

Role
Lock rows
Edit locked rows
Lock modules
Edit locked modules

admin

✅

✅

✅

✅

designer

❌

✅

❌

✅

designer2

❌

✅

✅

✅

copy

❌

❌

✅

✅

modules

❌

❌

❌

✅

rows

❌

✅

❌

❌

user

❌

❌

❌

❌

Then, we created a table with a number of possible “actions” and see which user role would have access to which actions. This allows you to map a certain combination of permissions (from above) to a specific task carried out in the Beefree SDK builder.

Description
admin
designer
designer2
copy
modules
rows
user

Lock/unlock a module

✅

❌

widget not provided

✅

✅

❌

widget not provided

❌

widget not provided

❌

widget not provided

Lock/unlock a row

✅

❌

widget not provided

❌

widget not provided

❌

widget not provided

❌

widget not provided

❌

widget not provided

❌

widget not provided

Add a module to locked row (the module is automatically locked)

✅

✅

✅

❌

can’t drop modules in locked rows

❌

can’t drop modules in locked rows

✅

❌

can’t drop modules in locked rows

Move a locked module from an unlocked row to a locked one

✅

✅

✅

❌

can’t drop modules in locked rows

❌

can’t drop modules in locked rows

✅

❌

module handler not provided

Move a locked module from a locked row to a locked one

✅

✅

✅

❌

module handler not provided

❌

module handler not provided

✅

❌

module handler not provided

Move a locked module from a locked row to an unlocked one

✅

✅

✅

❌

module handler not provided

❌

module handler not provided

✅

❌

module handler not provided

Move a locked module from an unlocked row to an unlocked one

✅

✅

✅

✅

✅

✅

❌

module handler not provided

Move an unlocked module from an unlocked row to a locked one

✅

✅

✅

❌

can’t drop modules in locked rows

❌

can’t drop modules in locked rows

✅

❌

can’t drop modules in locked rows

Move an unlocked module from a locked row to a locked one

✅

✅

✅

❌

module handler not provided

❌

module handler not provided

✅

❌

module handler not provided

Move an unlocked module from a locked row to an unlocked one

✅

✅

✅

❌

module handler not provided

❌

module handler not provided

✅

❌

module handler not provided

Move an unlocked module from an unlocked row to an unlocked one

✅

✅

✅

✅

✅

✅

✅

Move a locked row

✅

✅

✅

❌

row handler not provided

❌

row handler not provided

✅

❌

row handler not provided

Move an unlocked row

✅

✅

✅

✅

✅

✅

✅

Delete/duplicate a locked module in locked row

✅

✅

✅

❌

show warning

❌

show warning

✅

❌

show warning

Delete/duplicate an unlocked module in locked row

✅

✅

✅

❌

show warning

❌

show warning

✅

❌

show warning

Delete/duplicate a locked module in unlocked row

✅

✅

✅

✅

✅

✅

❌

show warning

Delete/duplicate an unlocked module in unlocked row

✅

✅

✅

✅

✅

✅

✅

Delete/duplicate unlocked row containing locked modules

✅

✅

✅

✅

✅

❌

show error

❌

show error

Delete/duplicate locked row

✅

✅

✅

❌

show warning

❌

show warning

✅

❌

show warning

Change properties of a locked module

✅

✅

✅

✅

✅

❌

show warning

❌

show warning

Change properties of an unlocked module

✅

✅

✅

✅

✅

✅

✅

Change text of a text/button locked module

✅

✅

✅

✅

✅

❌

show warning

❌

show warning

Change text of a text/button unlocked module

✅

✅

✅

✅

✅

✅

✅

Add an image to a locked image module

✅

✅

✅

✅

✅

❌

show warning

❌

show warning

Add an image to an unlocked image module

✅

✅

✅

✅

✅

✅

✅

Change properties of a locked row

✅

✅

✅

❌

show warning

❌

show warning

✅

❌

show warning

Change properties of an unlocked row

✅

✅

✅

✅

✅

✅

✅

User roles & display conditions

If you use Display Conditions in your builder application, then you can use additional user roles to control the access users have to creating and editing Display Conditions.

AddOn Development

Introduction

Welcome to the Beefree SDK AddOn development documentation!

This document is for anyone that wants to start creating AddOns for Beefree SDK users.

Before you get started, you may want to review these frequently asked questions.

Happy coding!

Creating a development app

First, create a development application so that you are not testing your new AddOn with a production application.

Development applications inherit the plan of the production application to which they are connected. You can only build AddOns when you are on the Superpowers plan or above. If you are not on one of those plans:

  • Create a development application

  • Request an upgrade

Once you have a development application on the Superpowers plan or above, proceed to the next step.

Getting started

The process all starts in the Beefree SDK Console:

  1. Log into the Console at developers.beefree.io

  2. If you have not done so yet, create a development app as indicated above

  3. Click the Details link next to any application on the Superpowers plan or above

  4. Click the AddOns link, under Application configuration

  5. Click the Create a custom AddOn button

When you create a new Custom AddOn, you will be prompted to enter some information through the AddOn setup form. Depending on the method that you choose, the number of fields in the form will change.

  • Name: The name of the AddOn is saved in the dashboard. This is not the name used for the tile in the Beefree editor’s Content tab but rather the internal name visible to other developers. In other words, it will not be shown to end-users of the editor.

  • Enable toggle: A toggle element to enable and disable the AddOn. When toggled OFF, the AddOn is not visible to end-users of the editor in your application (the host application).

  • Type: The type of content that the AddOn will create. Currently, the following content types are available:

    • Image

    • HTML

    • Mixed

    • Row

    • Paragraph

    • Button

    • Title

    • List

    • Menu

    • Icon

  • Handle: A unique identifier for this AddOn. This value will be the future reference between the AddOn and its content dialog. Additionally, it will be used to override settings per user or build a content dialog for the AddOn.

  • Method: This is an important selection and is covered in detail in the section below.

    • External iframe: Choose this option if the AddOn is hosted outside the host application. If this is an AddOn that will be made available to other Beefree SDK applications via the Partner AddOn directory, then it is by definition hosted outside of the host application, and therefore you must select this method.

    • Content Dialog: Choose this option for AddOn that lives inside the host application (e.g., internal AddOn). You cannot choose this method if you plan to make your AddOn available to others by listing it in the Partner AddOn directory.

  • Icon: Upload an image from your local computer that will become the icon associated with the tile shown in the editor’s Content tab. We recommend a 64 x 64 pixel SVG file.

  • Labels:

    • Content Title: This is the name that will be used for the tile in the BEE editor’s Content tab (e.g., “Countdown timer,” “Product Recommendation,” etc.).

    • Content button: The label for the call-to-action button (e.g., “Select a Countdown Timer”), which opens the content dialog or iframe.

    • Placeholder message: This is the message shown in the editor’s stage when the tile is first dropped.

If you are using the iFrame method, some additional fields are shown on the form.

  • Iframe URL – Required The URL that will be loaded inside the Iframe.

  • API Key – Optional The API Key optionally authorizes the application to load the URL provided above. If authorization is not needed, this field can be left empty.

  • Authentication URL – Optional The endpoint that handles the optional authorization request. If authorization is not needed, this field can be left empty.

  • Healthcheck URL – Optional, but required for Partner AddOns This URL will be contacted when the editor is started to verify the status of the AddOn. In the case of AddOn downtime, the editor hides it in the UI. Please note: if you are building a Partner AddOn, this is a required field as it will allow applications that have installed your AddOn to protect the quality of their end-users experience if your service is unavailable.

Once you have entered all the details, click Save, and you should immediately find your AddOn visible within the Beefree SDK platform. However, your AddOn is not completed until the configuration steps described below are done.

Concepts

Content dialog vs. iframe methods

One of the important choices you will make is in regard to how your content creation AddOn loads.

The general rule of thumb is that if your AddOn lives within the host application, you can use a content dialog.

If your AddOn lives on another website outside of the host application or will be listed in the Partner AddOn directory, then you must select the external iframe method.

Overview of iframe method

The AddOn can be built using any technology stack. There are no specific rules about how your AddOn functions internally.

However, you will need to implement the following:

  • JavaScript API

    • Protocol to communicate between iframe and the Beefree application.

  • Server API

    • Conditional health check endpoint

    • Optional authentication endpoint

Don’t worry about the fine details just yet! We’ll revisit each of these methods in more detail in the following sections.

Overview of content dialog method

Superpowers and Enterprise applications have the option to create their own, custom AddOn with content dialogs.

This option is convenient when the AddOn and host applications are hosted under the same domain.

You don’t need to implement a JavaScript API or Server API when using the content dialog.

Content types

An AddOn can only return one type of content. The type you choose will determine which sidebar properties are shown when your AddOn is selected.

Currently, you may choose between the following content types:

  • Image: Will insert an image module on the stage, and show the properties of an image content block in the sidebar. Adjusting the properties allows for customization of the content type.

  • HTML:

    Inserts an HTML module on the stage and displays its properties in the sidebar. However, the HTML text input field will not be visible because the HTML content can only be edited through the content dialog or an iframe provided by your AddOn.

  • Mixed: Will insert a module on the stage that allows for loading of different content blocks with a single action.

  • Row: Will insert a row module on the stage, and show the row properties in the sidebar. The row is pre-built with a specific use case in mind. For example, a row that serves of the purpose of allowing end users to add products to their builders.

  • Paragraph: Will insert a paragraph module on the stage, and show the properties of a paragraph content block in the sidebar.

  • Button: Will insert a button module on the stage, and show the properties of a button content block in the sidebar. This simplifies offering pre-built buttons to your end users.

  • Title: Will insert a title module on the stage, and show the properties of a title content block in the sidebar.

  • List: Will insert a list module on the stage, and show the properties of a list content block in the sidebar.

  • Menu: Will insert a menu module on the stage, and show the properties of a menu content block in the sidebar. This simplifies offering pre-built menus to your end users.

  • Icon: Will insert an icon module on the stage, and show the properties of an icon content block in the sidebar.

Mixed Content AddOns

Mixed Content AddOns are a new type of content tile that allows the host application to load multiple content modules at once. This grants you greater flexibility with how you want your custom AddOn to interact with your customers and data; for example, you could create a mixed content AddOn to drop a product image in your template, along with a title, description, and more.

To utilize this feature:

  • Create a new custom AddOn of type “Mixed Content” from developers.beefree.io, as described in the “Getting started” section of this article;

  • Add the integration code required by custom AddOns (for example, if the user chose the “Content Dialog” method, it might look something like this):


var beeConfig = { ... contentDialog: { addOn: { label: 'Custom AddOn Label', handler: (resolve, reject, args) => { ... } } } }
  • The host application should return a valid response as the parameter of the “resolve” callback.

Response Content

A valid response that the hosting application should send to the Beefree app when the contents of a Mixed Content AddOn are selected must have the following structure:


{
  "type": "mixed",
  "value": [
    ... here the list of modules
  ]
}

Mixed Content AddOn Example

The following code snippet shows an example of a Mixed Content AddOn. It includes the paragraph and button modules together in one mixed content example for reference.


resolve({
    "type": "mixed",
    "value": [
        {
            "type": "paragraph",
            "value": {
                "html": "<p>Hello @first_name,</p><p>Your address of @address was recently updated...</p>",
                "underline": true,
                "italic": true,
                "bold": true,
                "color": "pink",
                "linkColor": "green",
                "padding-top": "5px",
                "padding-right": "20px",
                "padding-bottom": "5px",
                "padding-left": "20px"
            }
        },
        {
            "type": "button",
            "value": {
                "label": "Click here",
                "font-family": "inherit",
                "font-size": "14px",
                "background-color": "#7747FF",
                "border-radius": "4px",
                "color": "#81A07B",
                "line-height": "200%",
                "padding-top": "5px",
                "padding-right": "20px",
                "padding-bottom": "5px",
                "padding-left": "20px",
                "width": "80%",
                "max-width": "100%",
                "direction": "ltr"
            },
            "locked": true
        }
    ],
    "mergeTags": [
        {
            "name": "First Name",
            "value": "@first_name",
            "previewValue": "First Name Preview"
        },
        {
            "name": "Address",
            "value": "@address",
            "previewValue": "Address Preview"
        }
    ]
});

If the response is not valid, an error is raised, and onError is called.

Modules definition

For each module type, here is the list of allowed properties.

Unless otherwise specified, the properties are optional.

Title

The following code calls a function named resolve with an object argument. This object defines a heading element with characteristics such as type, text content, alignment, font size, boldness, text color, and link color. The resolve function handles or returns the constructed heading element.


resolve({
  type: 'heading',
  value: {
    title: 'h3',
    text: 'Title',
    align: 'right',
    size: 48,
    bold: true,
    color: 'pink',
    linkColor: 'green',
  }
})

The following table displays a list of properties in the resolve function, and each of its respective value types and whether or not they are mandatory.

Property
Value
Mandatory

title

String

No

text

String

Yes

align

String

No

size

Integer

No

bold

Boolean

No

color

String

No

linkColor

String

No

Title Simplified Schema

{
  $schema: 'http://json-schema.org/draft-07/schema',
  $id: 'BEE-simplified-title-single',
  type: 'object',
  required: ['text'],
  properties: {
    type: {
      enum: ['title', 'heading'],
    },
    underline: {
      type: 'boolean',
    },
    italic: {
      type: 'boolean',
    },
    bold: {
      type: 'boolean',
    },
    html: {
      type: 'string',
    },
    text: {
      type: 'string',
    },
    align: {
      enum: [
        'left',
        'center',
        'right',
      ],
    },
    title: {
      enum: [
        'h1',
        'h2',
        'h3',
      ],
    },
    size: {
      type: 'integer',
    },
    color: {
      type: 'string',
    },
    linkColor: {
      type: 'string',
    },
    customFields: {
      type: 'object',
    },
  },
}

Image

The following sample code defines an image element with various attributes.


resolve({
  type: 'image',
  value: {
    alt: 'Alternative desc',
    href: 'http://www.example.com/',
    src: 'https://url.to.myimage.com',
    dynamicSrc: '{{any-merge-tag}}',
    target: '_self',
  }
})

The following table displays a list of properties in the resolve function, and each of its respective value types and whether or not they are mandatory.

Property
Value
Mandatory

alt

String

Yes

href

String (URL)

Yes

src

String (URL)

Yes

dynamicSrc

String (URL)

No

target

String

No

Image Simplified Schema

{
  $schema: 'http://json-schema.org/draft-07/schema',
  $id: 'BEE-simplified-image-single',
  type: 'object',
  required: ['src', 'alt', 'href'],
  properties: {
    type: {
      const: 'image',
    },
    alt: {
      type: 'string',
    },
    href: {
      type: 'string',
    },
    src: {
      type: 'string',
      format: 'urlOrMergeTags',
    },
    dynamicSrc: {
      type: 'string',
    },
    target: {
      enum: [
        '_blank',
        '_self',
        '_top',
      ],
    },
    customFields: {
      type: 'object',
    },
  },
}

Button

The following sample code defines a button element with various attributes.


resolve({
      "type" : "button",
      "value" : {
        "label" : "Click here",
        "href": "https://beefree.io/",
        "font-family" : "inherit",
        "font-size" : "14px",
        "background-color" : "#7747FF",
        "border-radius" : "4px",
        "color" : "#81A07B",
        "line-height" : "200%",
        "padding-top" : "5px",
        "padding-right" : "20px",
        "padding-bottom" : "5px",
        "padding-left" : "20px",
        "width" : "80%",
        "max-width" : "100%",
        "direction" : "ltr",
      }
    });

The following table displays a list of properties in the resolve function, and each of its respective value types and whether or not they are mandatory.

Property
Value
Mandatory

label

String

Yes

href

String

No

target

String

No

color

String

No

background-color

String

No

Button Simplified Schema

{
  $schema: 'http://json-schema.org/draft-07/schema',
  $id: 'BEE-simplified-button',
  type: 'object',
  properties: {
    type: {
      const: 'button',
    },
    label: {
      type: 'string',
      format: 'noAnchorTags',
    },
    text: {
      type: 'string',
      format: 'noAnchorTags',
    },
    href: {
      type: 'string',
    },
    target: {
      enum: [
        '_blank',
        '_self',
        '_top',
      ],
    },
    color: {
      type: 'string',
    },
    'background-color': {
      type: 'string',
    },
    customFields: {
      type: 'object',
    },
  },
}

Paragraph

The following sample code defines a paragraph element with various attributes. The mergeTags property contains a list of merge tags, which can be used for dynamic content insertion.

resolve({
  "type" : 'paragraph',
   "value" : {
        "html" : "<p>Hello @first_name,</p><p>Your address of @address was recently updated...</p>",
        "underline" : true,
        "italic" : true,
        "bold" : true,
        "color" : "pink",
        "linkColor" : "green",
  },
  "mergeTags" : [
    {
      "name" : "First Name",
      "value" : "@first_name",
      "previewValue" : "First Name Preview"
    },
    {
      "name" : "Address",
      "value" : "@address",
      "previewValue" : "Address Preview"
    }
  ]
});

The following table displays a list of properties in the resolve function, and each of its respective value types and whether or not they are mandatory.

Property
Value
Mandatory

html

String (HTML content)

Yes

underline

Boolean

No

italic

Boolean

No

align

String

No

size

Number

No

bold

Boolean

No

color

String

No

linkColor

String

No

Paragraph Simplified Schema

{
  $schema: 'http://json-schema.org/draft-07/schema',
  $id: 'BEE-simplified-paragraph-single',
  type: 'object',
  required: ['html'],
  properties: {
    type: {
      const: 'paragraph',
    },
    underline: {
      type: 'boolean',
    },
    italic: {
      type: 'boolean',
    },
    bold: {
      type: 'boolean',
    },
    html: {
      type: 'string',
    },
    text: {
      type: 'string',
    },
    align: {
      enum: [
        'left',
        'center',
        'right',
      ],
    },
    size: {
      type: 'integer',
    },
    color: {
      type: 'string',
    },
    linkColor: {
      type: 'string',
    },
    customFields: {
      type: 'object',
    },
  },
}

HTML

The following sample code defines an HTML element with various attributes.

resolve({
    type: 'html',
    value: {
        html: `<div><h4>Html Block</h4>
    </div>`,
    })

The following table displays a list of properties in the resolve function, and each of its respective value types and whether or not they are mandatory.

Property
Value
Mandatory

html

String (HTML content)

Yes

HTML Simplified Schema

{
  $schema: 'http://json-schema.org/draft-07/schema',
  $id: 'BEE-simplified-html-single',
  type: 'object',
  required: ['html'],
  properties: {
    type: {
      const: 'html',
    },
    html: {
      type: 'string',
    },
    customFields: {
      type: 'object',
    },
  },
}

Menu

The code defines a menu structure with a list of items. Each item has text content (e.g., “Menu item”) and a link associated with it. The link includes a title, URL (href), and a target attribute, demonstrating that it generates a menu with clickable items that open the specified links in the same browser window or tab when clicked.


resolve({
  type: 'menu',
  value: {
    items: [
      {
        text: 'Menu item',
        link: {
          title: 'Link',
          href: 'https://beefree.io',
          target: '_self'
        }
      },
      ...
    ],
  }
})

The following table displays a list of properties in the resolve function, and each of its respective value types and whether or not they are mandatory.

Property
Value
Mandatory

items

Array of objects

Yes

text

String

No

link

Object

No

title

String

No

href

String (URL)

No

target

String

No

Menu Simplified Schema

{
  $schema: 'http://json-schema.org/draft-07/schema',
  $id: 'BEE-simplified-menu-single',
  type: 'object',
  required: ['items'],
  properties: {
    type: {
      const: 'menu',
    },
    items: {
      type: 'array',
      items: {
        type: 'object',
        additionalProperties: false,
        properties: {
          type: {
            const: 'menu-item',
          },
          text: {
            type: 'string',
          },
          link: {
            type: 'object',
            additionalProperties: false,
            properties: {
              title: {
                type: 'string',
              },
              href: {
                type: 'string',
                format: 'urlOrMergeTags',
              },
              target: {
                type: 'string',
                enum: [
                  '_blank',
                  '_self',
                  '_top',
                ],
              },
            },
          },
        },
      },
    },
    customFields: {
      type: 'object',
    },
  },
}

List

The following code snippet calls the resolve function to generate a list element defined by the type property set to 'list'. The value object specifies the list's characteristics, including the list tag ('ol'), HTML content, alignment, text formatting options like underline, italic, bold, and colors for text and links. This configuration allows you to customize list elements when creating custom addons for your host application using Beefree SDK.


resolve({
  type: 'list',
  value: {
    tag: 'ol',
    html: `<ul><li>1 item</li></ul>`,
    align: 'right',
    size: 48,
    underline: true,
    italic: true,
    bold: true,
    color: 'pink',
    linkColor: 'green',
  }
})

The following table displays a list of properties in the resolve function, and each of its respective value types and whether or not they are mandatory.

Property
Value
Mandatory

html

String (HTML content)

Yes

tag

String ('ol' or 'ul')

No

underline

Boolean

No

italic

Boolean

No

align

String ('left', 'center' or 'right')

No

size

Integer

No

bold

Boolean

No

color

String

No

linkColor

String

No

List Simplified Schema

{
  $schema: 'http://json-schema.org/draft-07/schema',
  $id: 'BEE-simplified-list-single',
  type: 'object',
  required: ['html'],
  properties: {
    type: {
      const: 'list',
    },
    underline: {
      type: 'boolean',
    },
    italic: {
      type: 'boolean',
    },
    bold: {
      type: 'boolean',
    },
    html: {
      type: 'string',
    },
    text: {
      type: 'string',
    },
    align: {
      enum: [
        'left',
        'center',
        'right',
      ],
    },
    tag: {
      enum: [
        'ol',
        'ul',
      ],
    },
    size: {
      type: 'integer',
    },
    color: {
      type: 'string',
    },
    linkColor: {
      type: 'string',
    },
    customFields: {
      type: 'object',
    },
  },
}

Icons

The following code snippet defines an icons component for your application using Beefree SDK. It specifies an array of icon objects, including properties such as image URL, text, dimensions, and positioning. You can customize each icon with optional attributes like alt, title, and hyperlink details.


resolve({
  type: 'icons',
  value: {
    icons: [
      {
        image: 'https://link.to.my/icon.png',
        text: 'Icon text',
        target: '_self',
        alt: 'Image alt',
        title: 'Image title',
        href: 'https://beefree.io',
        width: '50px',
        height: '50px',
        textPosition: 'top'
      }
    ],
  }
})

The following table displays a list of properties in the resolve function, and each of its respective value types and whether or not they are mandatory.

Property
Value
Mandatory

icons

Array of objects

Yes

image

String (URL)

Yes

width

String

Yes

height

String

Yes

textPosition

String ('left', 'right', 'top', or 'bottom')

Yes

text

String

No

title

String

No

alt

String

No

href

String (URL)

No

target

String (_blank, _self, or _top)

No

Icons Simplified Schema

{
  $schema: 'http://json-schema.org/draft-07/schema',
  $id: 'BEE-simplified-icons-single',
  type: 'object',
  required: ['icons'],
  properties: {
    type: {
      const: 'icons',
    },
    icons: {
      type: 'array',
      items: {
        type: 'object',
        additionalProperties: false,
        required: [
          'image',
          'textPosition',
          'width',
          'height',
        ],
        properties: {
          alt: {
            type: 'string',
          },
          text: {
            type: 'string',
          },
          title: {
            type: 'string',
          },
          image: {
            type: 'string',
            format: 'urlOrMergeTags',
          },
          href: {
            type: 'string',
            format: 'urlOrMergeTags',
          },
          height: {
            type: 'string',
          },
          width: {
            type: 'string',
          },
          target: {
            enum: [
              '_blank',
              '_self',
              '_top',
            ],
          },
          textPosition: {
            enum: [
              'left',
              'right',
              'top',
              'bottom',
            ],
          },
        },
      },
    },
    customFields: {
      type: 'object',
    },
  },
}

Custom AddOn - Row

This feature expands the capabilities of Custom AddOns by including:

  • additional integrations (e.g. a Product Block integrated with client’s e-commerce)

  • domain-specific contents (e.g Event Block for an application that offers event engagement)

  • .. and much more

To take advantage of this new feature, you have to:

  • Create a new custom AddOn of type “Row” from developers.beefree.io, as described in the “Getting started” section of this article;

  • Add the integration code required by custom AddOns (for example, if the user chose the “Content Dialog” method, it might look something like this):



var beeConfig = { contentDialog: { addOn: { label: 'Custom AddOn Label',  handler: (resolve, reject, args) => { ... }  }  } }

  • The host application should return a valid response as the parameter of the “resolve” callback.

Response Content

A valid response that the hosting application should send to the Beefree app when the contents of a Row AddOn are selected must have the following structure:


{
  "type": "rowAddon", 
  "value": {
    ... here all the props accepted by the simplified JSON schema 
        (the one used for "custom-rows")
    ... like name, columns etc...
  }
}

For example:


{
    "type": "rowAddon",
    "value": {
        "name": "First item", // Identifies the row
        "columns": [{ // The columns inside the row
            "weight": 12, // This weight identifies a single column row
            "modules": [{ // This describes the content modules inside the column
                    "type": "title", // Every module is identified by a type parameter
                    "text": "How am I supposed to fight?"
                },
                {
                    "type": "paragraph",
                    "text": "Look, I can take you as far as Anchorhead. You can get a transport there to Mos Eisley or wherever you're going."
                },
                {
                    // List module, with common additional text parameters 

                    "type": "list",
                    "tag": "ol",
                    "text": "<ol><li>First List item</li><li>Second List item</li></ol>",
                    "align": "right",
                    "size": 50,
                    "bold": true,
                    "color": "green",
                    "linkColor": "yellow",
                    "italic": true,
                    "underline": true
                },
                // Icons module
                {
                    "type": "icons",
                    "icons": [{
                        "image": "http://cdn.onlinewebfonts.com/svg/img_456510.png",
                        "textPosition": "right",
                        "text": "Custom addon icon text",
                        "alt": "Custom addon icon alt",
                        "title": "Custom addon icon title",
                        "href": "https://www.google.com",
                        "target": "_blank",
                        "width": "100px",
                        "height": "100px"
                    }]
                }

            ]
        }]
    "metadata": {
        "myMeta": "myMetaValue"
    }, // an object of custom metadata that will be passed back to the Application when the content selection is triggered again
    }
}

The content dialog configuration, required for this custom AddOn is the same configuration used by the other AddOns. Please see the Content Dialog method paragraph.

The Content dialog method

The purpose of the contentDialog object in the code snippet is to handle different types of content that can be added to a dialog. It has a handler function that resolves with an image or HTML content based on the provided contentDialogId.

To set up the content dialogs you will need to add the contentDialog object to beeConfig. For more details about the content dialog, please review Content Dialog: How it works.

Configure content dialog in beeConfig


contentDialog: {
    addOn: {
        handler: (resolve, reject, args) => {
            if (args.contentDialogId == { addOnID }) {
                resolve(
                    {
                        "type": "image",
                        "value": {
                            "alt": "Alternative desc",
                            "href": "http://www.example.com/",
                            "src": "https://d1oco4z2z1fhwp.cloudfront.net/templates/default/731/HNY2020.gif",
                            "dynamicSrc": "{{any-merge-tag}}"
                        }
                    }
                )
            } else if (args.contentDialogId == { addOnID }) {
                resolve(
                    {
                        "type": "html",
                        "value": {
                            "html": "<div>example</div>",
                        }
                    }
                )
            }
        }, // close handler
    }, // close addOn
}, // close contentDialog

Image


{
  "type": "image",
  "value": {
    "alt": "Alternative desc",
    "href": "http://www.example.com/",
    "src": "https://d1oco4z2z1fhwp.cloudfront.net/templates/default/731/HNY2020.gif"
    "dynamicSrc": "{{any-merge-tag}}"
  }
}

HTML


{
  "type": "html",
  "value": {
    "html": "<div>example</div>",
  }
}

Custom Fields

This is optional. Should you feel the need to add custom fields when resolving, we created a “customFields” key allowing to you place any additional custom fields inside of that object.


resolve (
    {
        "type": "html",
        "value": {
            "html": "<div>example</div>",
            "customFields": {
                "customField_example_one": {
                    "example_key": "...",
                    "...": "..."
                },
                "customField_example_two": [
                    "example_index"
                ]
            },
        }
    }
)

Row Simplified Schema

This simplified row schema is designed to help you structure and validate rows. It allows you to define rows that contain columns, which can hold various design elements like buttons, images, text, and more, all while enforcing clear rules for responsiveness, styling, and structure. Its simplicity lies in its modular approach: each column and module follows a predictable pattern with reusable definitions like padding and predefined options for properties like alignment and color.

You can reference the simplified schema in the following code snippet:

{
  $schema: 'http://json-schema.org/draft-07/schema',
  $id: 'BEE-simplified-row',
  type: 'object',
  required: [
    'name',
    'columns',
  ],
  definitions: {
    padding: {
      type: 'integer',
      minimum: 0,
      maximum: 60,
    },
  },
  properties: {
    name: {
      type: 'string',
    },
    colStackOnMobile: {
      type: 'boolean',
    },
    rowReverseColStackOnMobile: {
      type: 'boolean',
    },
    contentAreaBackgroundColor: {
      type: 'string',
    },
    'background-color': {
      type: 'string',
    },
    'background-image': {
      type: 'string',
    },
    'background-position': {
      type: 'string',
    },
    'background-repeat': {
      type: 'string',
    },
    customFields: {
      type: 'object',
    },
    'display-condition': {
      type: 'object',
      properties: {
        type: {
          type: 'string',
        },
        label: {
          type: 'string',
        },
        description: {
          type: 'string',
        },
        before: {
          type: 'string',
        },
        after: {
          type: 'string',
        },
      },
    },
    metadata: {
      type: 'object',
    },
    columns: {
      type: 'array',
      minItems: 1,
      items: {
        type: 'object',
        required: [
          'weight',
          'modules',
        ],
        additionalProperties: false,
        properties: {
          weight: {
            type: 'integer',
            minimum: 1,
            maximum: 12,
          },
          'background-color': {
            type: 'string',
          },
          'padding-top': {
            $ref: '#/definitions/padding',
          },
          'padding-right': {
            $ref: '#/definitions/padding',
          },
          'padding-bottom': {
            $ref: '#/definitions/padding',
          },
          'padding-left': {
            $ref: '#/definitions/padding',
          },
          modules: {
            type: 'array',
            items: {
              type: 'object',
              discriminator: {
                propertyName: 'type',
              },
              required: [
                'type',
              ],
              properties: {
                type: {
                  enum: [
                    'button',
                    'divider',
                    'heading',
                    'html',
                    'icons',
                    'image',
                    'list',
                    'menu',
                    'paragraph',
                    'title',
                  ],
                },
              },
              oneOf: [
                {
                  $schema: 'http://json-schema.org/draft-07/schema',
                  $id: 'BEE-simplified-button',
                  type: 'object',
                  properties: {
                    type: {
                      const: 'button',
                    },
                    label: {
                      type: 'string',
                      format: 'noAnchorTags',
                    },
                    text: {
                      type: 'string',
                      format: 'noAnchorTags',
                    },
                    href: {
                      type: 'string',
                      format: 'urlOrMergeTags',
                    },
                    target: {
                      enum: [
                        '_blank',
                        '_self',
                        '_top',
                      ],
                    },
                    color: {
                      type: 'string',
                    },
                    'background-color': {
                      type: 'string',
                    },
                    customFields: {
                      type: 'object',
                    },
                  },
                },
                {
                  $schema: 'http://json-schema.org/draft-07/schema',
                  $id: 'BEE-simplified-divider',
                  type: 'object',
                  properties: {
                    type: {
                      const: 'divider',
                    },
                    customFields: {
                      type: 'object',
                    },
                  },
                },
                {
                  $schema: 'http://json-schema.org/draft-07/schema',
                  $id: 'BEE-simplified-icons',
                  type: 'object',
                  properties: {
                    type: {
                      const: 'icons',
                    },
                    icons: {
                      type: 'array',
                      items: {
                        type: 'object',
                        additionalProperties: false,
                        required: [
                          'image',
                          'textPosition',
                          'width',
                          'height',
                        ],
                        properties: {
                          alt: {
                            type: 'string',
                          },
                          text: {
                            type: 'string',
                          },
                          title: {
                            type: 'string',
                          },
                          image: {
                            type: 'string',
                            format: 'urlOrMergeTags',
                          },
                          href: {
                            type: 'string',
                            format: 'urlOrMergeTags',
                          },
                          height: {
                            type: 'string',
                          },
                          width: {
                            type: 'string',
                          },
                          target: {
                            enum: [
                              '_blank',
                              '_self',
                              '_top',
                            ],
                          },
                          textPosition: {
                            enum: [
                              'left',
                              'right',
                              'top',
                              'bottom',
                            ],
                          },
                        },
                      },
                    },
                    customFields: {
                      type: 'object',
                    },
                  },
                },
                {
                  $schema: 'http://json-schema.org/draft-07/schema',
                  $id: 'BEE-simplified-image',
                  type: 'object',
                  properties: {
                    type: {
                      const: 'image',
                    },
                    alt: {
                      type: 'string',
                    },
                    href: {
                      type: 'string',
                      format: 'urlOrMergeTags',
                    },
                    src: {
                      type: 'string',
                      format: 'urlOrMergeTags',
                    },
                    dynamicSrc: {
                      type: 'string',
                    },
                    target: {
                      enum: [
                        '_blank',
                        '_self',
                        '_top',
                      ],
                    },
                    customFields: {
                      type: 'object',
                    },
                  },
                },
                {
                  $schema: 'http://json-schema.org/draft-07/schema',
                  $id: 'BEE-simplified-html',
                  type: 'object',
                  properties: {
                    type: {
                      const: 'html',
                    },
                    html: {
                      type: 'string',
                    },
                    customFields: {
                      type: 'object',
                    },
                  },
                },
                {
                  $schema: 'http://json-schema.org/draft-07/schema',
                  $id: 'BEE-simplified-list',
                  type: 'object',
                  properties: {
                    type: {
                      const: 'list',
                    },
                    underline: {
                      type: 'boolean',
                    },
                    italic: {
                      type: 'boolean',
                    },
                    bold: {
                      type: 'boolean',
                    },
                    html: {
                      type: 'string',
                    },
                    text: {
                      type: 'string',
                    },
                    align: {
                      enum: [
                        'left',
                        'center',
                        'right',
                      ],
                    },
                    tag: {
                      enum: [
                        'ol',
                        'ul',
                      ],
                    },
                    size: {
                      type: 'integer',
                    },
                    color: {
                      type: 'string',
                    },
                    linkColor: {
                      type: 'string',
                    },
                    customFields: {
                      type: 'object',
                    },
                  },
                },
                {
                  $schema: 'http://json-schema.org/draft-07/schema',
                  $id: 'BEE-simplified-menu',
                  type: 'object',
                  properties: {
                    type: {
                      const: 'menu',
                    },
                    items: {
                      type: 'array',
                      items: {
                        type: 'object',
                        additionalProperties: false,
                        properties: {
                          type: {
                            const: 'menu-item',
                          },
                          text: {
                            type: 'string',
                          },
                          link: {
                            type: 'object',
                            additionalProperties: false,
                            properties: {
                              title: {
                                type: 'string',
                              },
                              href: {
                                type: 'string',
                                format: 'urlOrMergeTags',
                              },
                              target: {
                                type: 'string',
                                enum: [
                                  '_blank',
                                  '_self',
                                  '_top',
                                ],
                              },
                            },
                          },
                        },
                      },
                    },
                    customFields: {
                      type: 'object',
                    },
                  },
                },
                {
                  $schema: 'http://json-schema.org/draft-07/schema',
                  $id: 'BEE-simplified-paragraph',
                  type: 'object',
                  properties: {
                    type: {
                      const: 'paragraph',
                    },
                    underline: {
                      type: 'boolean',
                    },
                    italic: {
                      type: 'boolean',
                    },
                    bold: {
                      type: 'boolean',
                    },
                    html: {
                      type: 'string',
                    },
                    text: {
                      type: 'string',
                    },
                    align: {
                      enum: [
                        'left',
                        'center',
                        'right',
                      ],
                    },
                    size: {
                      type: 'integer',
                    },
                    color: {
                      type: 'string',
                    },
                    linkColor: {
                      type: 'string',
                    },
                    customFields: {
                      type: 'object',
                    },
                  },
                },
                {
                  $schema: 'http://json-schema.org/draft-07/schema',
                  $id: 'BEE-simplified-title',
                  type: 'object',
                  properties: {
                    type: {
                      enum: ['title', 'heading'],
                    },
                    underline: {
                      type: 'boolean',
                    },
                    italic: {
                      type: 'boolean',
                    },
                    bold: {
                      type: 'boolean',
                    },
                    html: {
                      type: 'string',
                    },
                    text: {
                      type: 'string',
                    },
                    align: {
                      enum: [
                        'left',
                        'center',
                        'right',
                      ],
                    },
                    title: {
                      enum: [
                        'h1',
                        'h2',
                        'h3',
                      ],
                    },
                    size: {
                      type: 'integer',
                    },
                    color: {
                      type: 'string',
                    },
                    linkColor: {
                      type: 'string',
                    },
                    customFields: {
                      type: 'object',
                    },
                  },
                },
              ],
            },
          },
          customFields: {
            type: 'object',
          },
        },
      },
    },
  },
}

The Iframe method

JavaScript API

General

The JavaScript API allows an application inside of an external iframe to communicate with the host application that’s embedded a Beefree app. If you use the content dialog option, there is no need to implement the JavaScript API.

This section describes the communication protocol between a Beefree app and an external AddOn (i.e. an AddOn that is loaded into an iframe inside a Beefree app).

The communication takes place using postMessage, which is a standard way of communicating between Window objects.

The data object sent in the messages exchanged between the Beefree app and the AddOn has a standardized form:


{
  action: string,  
  data: any
}

Actions

The application inside the iframe may trigger the following actions:

  • onCancel

  • onSave

Events

The application inside of the iframe may listen for the following events:

  • loaded

  • init

  • load

Protocol

The Beefree app creates an iframe for the AddOn and then expects it to start the conversation by sending the loaded action:


{ action: 'loaded' }

The AddOn may also pass optional arguments to define the shape and style of the modal dialog that will contain the AddOn. If no arguments are provided the modal will fill the screen with no border.

The following parameters are available for the loaded method:

  • isRounded: Boolean true or false value. If true, the modal will have rounded corners.

  • hasTitleBar: Boolean true or false value. If true, the modal will display a title bar.

  • showTitle: Boolean true or false value. If true, the name of the AddOn will display in the title bar.

  • width: The width of the modal in pixels. If not provided, the modal will be 100% width.

  • height: The height of the modal in pixels. If not provided, the modal will be 100% height.

The following is a full example of a fixed-size modal with rounded corners, no title, and no close button. In this case, a custom close button is provided by the AddOn using the onCancel method.


  window.parent.postMessage(
    {
      action: 'loaded',
      data: {
        isRounded: true,
        hasTitleBar: false,
        showTitle: false,
        width: '820px',
        height: '640px'
      },
    },
    '*'
  )

The Beefree app then responds with an init message that contains the current locale of the editor and any pass-through data defined by the host application:


{
  action: 'init',
  data: {
    locale: 'current plugin locale',
    data: { ... sent by host app }
  }
}

This message may be followed by an optional load message from the Beefree app in case the user has already defined the content of this AddOn in a previous session:


{ 
  action: 'load', 
  data:  
}

Any further action is then on the AddOn. In case the user cancels the edit, it is expected to send an onCancel message:


{ action: 'onCancel' }

And if the user finishes editing and clicks on the save (or OK) button, the AddOn is expected to send an onSave message:


{
  action: 'onSave',
  data: {
    type: 'html | image',
    value: 
  }
}

Server API

The Server API is only for use with external iframe applications. The application inside of the iframe must implement at least one API endpoint for a health check, but may also implement an optional endpoint for authentication. If you use the content dialog option, there is no need to implement the Server API.

Healthcheck

The health check endpoint is mandatory for apps that will be posted to the partner directory but otherwise optional. If your AddOn is for internal use (i.e. a custom AddOn), then you can perform your own health checks inside of the host application. If the application is offline, then you can use the configuration settings to disable it. If you choose to implement the health endpoint, simply ensure it returns a 200 for all GET requests.

Authentication

An application is not required to use any authentication. For example, the Giphy AddOn by Beefree is FREE for all users and therefore has no need for authentication.

However, authentication can be enabled for applications of any kind, if you want to identify or authorize the user to access your resources.

To enable authentication, simply add the optional parameters to your AddOn in the Beefree SDK Console:

  • API Key: This is any globally unique identifier that can be used to identify the customers, but usually, this would be a bearer token or JWT.

  • Authentication URL: This is the URL of your authentication endpoint. More on this below.

Protocol

With authentication enabled, a specific protocol follows:

  1. Before the Beefree app creates an iframe for the AddOn, it performs a proxied GET request to the authentication URL.

  2. The following HTTP Headers are passed to the AddOn’s endpoint.

    1. x-real-ip: The IP Address of the host application

    2. authorization: It contains the API Key (e.g. bearer token), which you provided to the host application.

    3. x-bee-clientid: It contains the client id of the host application.

    4. x-bee-uid: It contains the uid defined in the BEE configuration.

  3. The iframe application uses the Authorization Header to validate the user permissions.

    1. In the event of success, the application returns a URL to load within the iframe. The URL is provided as plain text with a 200 status code, no JSON formatting is needed.

    2. In the event of unauthorized, the application returns a 403 status code.

  4. The Beefree app creates an iframe for the AddOn using the URL returned from the authorization endpoint.

  5. The AddOn application loads the application or performs additional authentication.

Configuration parameters

Once you have initialized the Beefree app, you can pass a series of configuration parameters to it.

The AddOn section of the configuration allows you to override the parameters you configured at the application level, on a per-user basis.

See: Adding client-side configuration parameters for AddOns.

Advanced Permissions

This feature is available on Beefree SDK Superpowers plan and above. If you're on the Core or Essentials plan, upgrade a development application for free to try this and other Superpowers-level features.

Overview

With Advanced permissions, you can tailor permissions for users of your Beefree application by hiding or locking UI elements related to:

  • content tiles

  • content settings

  • layout settings

  • row & content actions (clone, delete, drag, save)

  • basically anything in the editor!

These advanced permissions grant total customization of the experience you want to present. Since you set them in the configuration parameters passed to your application after you’ve initialized it, they could be different each time the editor starts, and have different setups for different users.

Use cases

The absolute flexibility of these permissions makes it easy to address specific needs, not achievable with the Roles and Permissions feature that is available in the Beefree SDK Console.

Create skill-based roles

You can create roles that can act only on a content type. For example, you may want a “copywriter” role for people in an organization that only need to touch copy for editing or translation purposes. To do so, you can:

  • hide any action that doesn’t involve working on the copy of an email or page.

  • limit style options for the text itself, by

    • locking/hiding the side tab;

    • hiding specific settings in the text toolbar.

Note: UID is a mandatory field when you configure Beefree SDK. This field connects end users to the permissions you set in the configuration.

Customize image & file management workflows

You can limit how users upload and manage images and files inside Beefree SDK; for example, you want some users – e.g., external collaborators – to select pre-approved images and files uploaded by “admin” users. You can do so by:

  • disabling drag-and-drop of images onto the stage;

  • limit actions in the file manager (either the built-in one or your custom file picker) by disabling actions like upload, import, and create a folder.

Another interesting case for using advanced permissions is the possibility to set a maximum size for uploads, per user. The maximum size set per user must not exceed the custom limitation size set on the Activate Custom Limitation on File Manager. The default limit is 20 Mb unless otherwise stated. When this permission is configured, the system will check if a file exceeds the set size before uploading it; if so, Beefree SDK will return an error message, which you may customize using Custom languages.

Create custom, secondary roles

When customers of your applications are structured businesses, typically with a headquarter and a locally-deployed organization (e.g., Real Estate, Travel, Retail), their administrators can create custom, secondary roles to match any internal policy they might have. In this scenario, admins typically want to reduce disruptions of centrally-deployed templates for external communication, while allowing a specific degree of freedom.

Initialize different versions of the editor

By combining multiple permissions, you can load Beefree SDK with radically different experiences, based on the user that starts it. For example:

  • a “stripped-down” version of the content builder for lower-level subscribers;

  • a “simplified” version of the builder for new users of an account.

How it works

To set up the advanced permissions, you will need to add the advancedPermissions object to beeConfig.

Note: UID is a mandatory field when you configure Beefree SDK. This field connects end users to the permissions you set in the configuration.

Steps to set up Advanced Permissions in your beeConfig file

Take the following steps to set up advanced permissions in your beeConfig for Beefree SDK:

  1. Locate your beeConfig object: This is where you configure the Beefree SDK with its basic settings, such as the user ID and container.

  2. Add the advancedPermissions object: You will need to insert the advancedPermissions object within your beeConfig to specify which content types and settings can be customized with specific permissions.

  3. Define content permissions: Inside advancedPermissions, you can specify what content blocks (e.g., image, button, text) are visible and what actions are allowed.

  4. Configure settings permissions: This controls settings like content area width, background color, or fonts for different blocks.

  5. Control tabs visibility: You can manage which tabs (such as rows or settings) are visible and editable in the editor interface.

  6. Set rows behaviors: You can control row-specific permissions, such as adding or hiding rows, background colors, and mobile visibility.

  7. Test the configuration: After adding the advancedPermissions object to your beeConfig, test your configuration by launching the editor and checking if the permissions are applied correctly (e.g., specific settings are visible or locked as intended).

Note: Click on the arrow next to Sample code to expand the full configuration example.

Sample code

Reference the following sample code to understand the structure of advancedPermissions.


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      button: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          link: { locked: false, show: true },
          buttonWidth: { locked: false, show: true },
          padding: { locked: false, show: true },
          backgroundColor: { locked: false, show: true },
          textColor: { locked: false, show: true },
          textAlign: { locked: false, show: true },
          buttonLineHeight: { locked: false, show: true },
          borderRadius: { locked: false, show: true },
          contentPadding: { locked: false, show: true },
          border: { locked: false, show: true },
          hideOnMobile: { locked: false, show: true },
          hideOnAmp: { locked: false, show: false }
        },
        textEditor: { toolbar: "bold italic underline" }
      },
      image: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          imageWidth: { locked: false, show: true },
          textAlign: { locked: false, show: true },
          dynamicImage: { locked: false, show: true },
          imageSelector: { locked: false, show: true },
          inputText: { locked: false, show: true },
          link: { locked: false, show: true },
          padding: { locked: false, show: true },
          hideOnMobile: { locked: false, show: true },
          hideOnAmp: { locked: false, show: false },
          borderRadius: { locked: false, show: true },
          id: { locked: false, show: true },
          customAttributes: { locked: false, show: true }
        }
      },
      // Repeat structure for other elements: form, text, title, etc.
    },
    settings: {
      contentAreaWidth: { locked: false, show: true },
      contentAreaAlign: { locked: false, show: true },
      containerBackgroundColor: { locked: false, show: true },
      contentBackgroundColor: { locked: false, show: true },
      defaultFontFamily: { locked: false, show: true },
      linkColor: { locked: false, show: true }
    },
    tabs: {
      rows: { locked: false, show: true },
      settings: { locked: false, show: true },
      content: { locked: false, show: true }
    },
    rows: {
      behaviors: {
        canSelect: true,
        canAdd: true,
        canViewSidebar: true,
        hiddenOnAmp: false,
        hiddenOnHtml: false,
        hiddenOnMobile: false,
        hiddenOnDesktop: false,
        canResize: true,
        canResetMobile: true
      },
      backgroundColorRow: { locked: false, show: true },
      backgroundVideo: { locked: false, show: true },
      backgroundColorContent: { locked: false, show: true },
      doNotStackOnMobile: { locked: false, show: true },
      hideOnMobile: { locked: false, show: true },
      backgroundImage: { locked: false, show: true },
      displayConditions: { locked: false, show: true },
      rowLayout: { locked: false, show: true },
      columnTabs: { locked: false, show: true },
      contentBorder: { locked: false, show: true },
      roundedCorners: { locked: false, show: true },
      verticalAlign: { locked: false, show: true },
      columnsSpacing: { show: true, locked: false },
      columnsBorderRadius: { show: true, locked: false }
    }
  },
  components: {
    filePicker: {
      canApplyEffects: true,
      canChangeImage: true,
      canChangeVideo: true,
      canCreateFolder: true,
      canDeleteFile: true,
      canDeleteFolder: true,
      canImportFile: true,
      canSearchFreePhotos: true,
      canSearchFreeVideos: true,
      canUpload: true,
      maxUploadFileSize: 20971520
    },
    linkTypes: {
      webAddress: { show: true },
      emailAddress: { show: true },
      telephone: { show: true },
      text: { show: true },
      anchor: { show: true }
    }
  },
  rowAddon: {
    customRowAddonHandle: {
      behaviors: {
        canSelect: true,
        canAdd: true,
        canViewSidebar: true,
        hiddenOnAmp: false,
        hiddenOnHtml: false,
        hiddenOnMobile: false,
        hiddenOnDesktop: false,
        canResize: true,
        canResetMobile: true
      }
    }
  },
  workspace: {
    stageToggle: { locked: false, show: true },
    historyButtons: { show: true }
  }
}

First-level fields

The following table provides the name, data type, description, and an example value for the first-level fields for advancedPermissions.

Name
Data Type
Description
Example Value

uid

string

Unique identifier for the CMS user (mandatory).

'CmsUserName'

container

string

HTML container element ID for embedding Beefree SDK (mandatory).

'bee-plugin-container'

advanced permissions

object

Contains settings for content elements, rows, settings, and tabs configurations.

See configuration object for details.

components

object

Specifies available components like file picker and link types.

{ filePicker: {...}, linkTypes: {...} }

rowAddOn

object

Settings for custom row add-ons, such as custom behaviors.

{ customRowAddonHandle: {...} }

workspace

object

Defines workspace settings, such as stage toggle and history buttons visibility.

{ stageToggle: {...}, historyButtons: true }

Available permissions and behaviors

You can add all the permissions, some of them, or just one. It is up to your application to create them for all users or a segment, as there are no related server-side settings. You may have a different setup each time the editor starts.

All the permissions use a similar pattern, but the object must match the content schema for the type of content (described in the following section).

Defaults

Each content type below contains a parameter for “behaviors” and “properties”. The behaviors control what someone can, or can’t, do. The properties parameter is an array of sidebar property widgets (e.g., the width slider), and each widget has its default permissions.

Sidebar property widget permissions

All sidebar property widgets (e.g. width slider, alignment, color, etc.) accept the following basic permissions:

Name
Type
Value

locked

boolean

true or false

show

boolean

true or false

Let’s look at an example of these permissions applied to an image module. The following example will hide the image width property widget and lock the text alignment widget. We’ll cover more of the available settings below.


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      image: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          imageWidth: {
            locked: false,
            show: false
          },
          textAlign: {
            locked: true,
            show: true
          },
          dynamicImage: {
            locked: false,
            show: true
          },
          imageSelector: {
            locked: false,
            show: true
          },
          inputText: {
            locked: false,
            show: true
          },
          link: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          },
          borderRadius: {
            locked: false,
            show: true
          },
          id: {
            locked: false,
            show: true
          },
          customAttributes: {
            locked: false,
            show: true
          }
        }
      }
    }
  }
}
 

Default behaviors

All contents and rows (e.g. image module, video module, stage row, etc.) accept the following basic behaviors:

Name
Type
Value
Description

canSelect

boolean

true or false

Can select a row or module to edit its properties

canAdd

boolean

true or false

Can drag and drop the content tile or row onto the stage

canViewSidebar

boolean

true or false

Can view the content in the sidebar

canClone

boolean

true or false

Can clone a content or row on the stage

canMove

boolean

true or false

Can drag content to another location on the stage

canDelete

boolean

true or false

Can remove the content or row from the stage

canResetMobile

boolean

true or false

Can reset mobile style for content properties that make use of it

Components

The components object lets you control the behavior and permissions for tools like file pickers and link types within the editor. You can define what actions users can take, such as uploading or deleting files, and specify which link types (e.g., web addresses, emails) are available. This section provides more information on the component object within advanced permissions.

filePicker

The following code provides an example of the filePicker object.


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    components: {
      filePicker: {
        canApplyEffects: true,
        canChangeImage: true,
        canChangeVideo: true,
        canCreateFolder: true,
        canDeleteFile: true,
        canDeleteFolder: true,
        canImportFile: true,
        canSearchFreePhotos: true,
        canSearchFreeVideos: true,
        canUpload: true,
        maxUploadFileSize: 20971520 // 20 MB
      }
    }
  }
}

linkTypes

The following code provides an example of the linkTypes object.


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    components: {
      linkTypes: {
        webAddress: {
          show: true
        },
        emailAddress: {
          show: true
        },
        telephone: {
          show: true
        },
        text: {
          show: true
        },
        anchor: {
          show: true
        }
      }
    }
  }
}

colorPicker

The following code provides an example of the colorPicker object.

const advancedPermissions = {
    ...,
    components: {
      ...,
      colorPicker: {
        canViewColorInput: true,
        canViewSliders: true,
        canViewSwatches: true,
      }
    }
}

Rows

The rows object in Beefree SDK allows you to manage the behavior and appearance of rows in the editor. You can control what users can do with rows, such as adding, deleting, or moving them. Additionally, you can set permissions for properties like background color, stacking behavior on mobile, and visibility settings. Configuring the rows object ensures users can work with rows in a controlled way, customizing their content without altering crucial layout elements.

Important: This section includes expandable content. Click the > symbol to expand the content and view the sample code in this section.

Hosted Saved Rows

Hosted Saved Rows includes advanced permissions to control how rows and categories are accessed and managed. These permissions allow you to define user capabilities, such as editing or deleting rows.

Available Permissions

  • canDeleteHostedRow: Allows or prevents deleting hosted rows.

  • canEditHostedRow: Enables or disables editing of hosted rows.

  • canManageHostedRowCategory: Controls whether end users can manage row categories.

  • canAddHostedRowCategory: Determines if end users can add new categories.

Permission Behavior

  • If both canDeleteHostedRow and canEditHostedRow are set to false, the row menu will be hidden.

  • If both canManageHostedRowCategory and canAddHostedRowCategory are set to false, the category management menu will be hidden.

Edit Synced Row Button

You can set Advanced Permissions for the Edit Synced Row button in the toolbar.

Available Permissions

  • show: Controls visibility of the Edit Synced Row button.

  • locked: Controls whether the button is clickable (false) or read-only (true).

Permission Behavior

  • If show is false, the Edit Synced Row button is hidden.

  • If locked is true, the button is visible but not clickable.

  • Depending on your configuration, when this button is visible and clickable, end users can:

    • Open the row in Edit Single Row Mode (changes apply globally).

    • Convert the Synced Row to a Saved Row to apply edits.

Example Configuration The following example shows how to configure permissions for the Edit Synced Row button:

advancedPermissions: {
  rows: {
    toolbar: {
      editSyncedRow: {
        show: true,     // show or hide the button
        locked: false   // editable (false) or read-only (true)
      }
    }
  }
}

Reference the Implement Synced Rows documentation to learn more about Advanced Permissions for the Edit Synced Row button.

Example Configuration

The following configuration displays an example of the rows object inside of advancedPermissions:

View a Rows Configuration example

The following snippet displays an example of the rows object inside advancedPermissions.

beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    rows: {
      toolbar: {
        editSyncedRow: {
          show: true,
          locked: false,
        },
      },
      behaviors: {
        canSelect: true,
        canAdd: true,
        canViewSidebar: true,
        hiddenOnAmp: false,
        hiddenOnHtml: false,
        hiddenOnMobile: false,
        hiddenOnDesktop: false,
        canResize: true,
        canResetMobile: true
      },
      backgroundColorRow: {
        locked: false,
        show: true
      },
      backgroundVideo: {
        locked: false,
        show: true
      },
      backgroundColorContent: {
        locked: false,
        show: true
      },
      doNotStackOnMobile: {
        locked: false,
        show: true
      },
      hideOnMobile: {
        locked: false,
        show: true
      },
      backgroundImage: {
        locked: false,
        show: true
      },
      displayConditions: {
        locked: false,
        show: true
      },
      rowLayout: {
        locked: false,
        show: true
      },
      columnTabs: {
        locked: false,
        show: true
      },
      contentBorder: {
        locked: false,
        show: true
      },
      roundedCorners: {
        locked: false,
        show: true
      },
      verticalAlign: {
        locked: false,
        show: true
      },
      columnsSpacing: {
        show: true,
        locked: false
      },
      columnsBorderRadius: {
        show: true,
        locked: false
      },
      padding: {
        show: true,
        locked: false
      }
    }
  }
}

Rows AddOn

The following code demonstrates how to specify behavior settings for individual Row AddOns. A custom Row AddOn can have its behaviors set independently from the global row settings.

View a Rows AddOn example

The following sample code dispays a Rows AddOn example.

beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    rows: {
      ...
    },
    rowAddon: {
      customRowAddonHandle: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        }
        ... // properties example
        padding: {
          show: true,
          locked: true
        }
        ...
      }
    }
  }
}

Columns

The columns object in the Beefree SDK lets you control the behavior and permissions for columns within the editor. You can define what users can do with columns, such as adding, selecting, moving, or deleting them. You can also set properties like column spacing and border radius. Configuring the columns object ensures that users can manage column layouts effectively, while maintaining control over the design and structure of the content.


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    columns: {
      behaviors: {
        canSelect: true,
        canAdd: true,
        canViewSidebar: true,
        canDelete: true,
        hiddenOnAmp: false,
        hiddenOnHtml: false,
        hiddenOnMobile: false,
        hiddenOnDesktop: false,
        canResize: true,
        canResetMobile: true
      },
      padding: {
        locked: false,
        show: true
      },
      backgroundColor: {
        locked: false,
        show: true
      },
      backgroundImage: {
        locked: false,
        show: true
      },
      verticalAlign: {
        locked: false,
        show: true
      },
      borderRadius: {
        locked: false,
        show: true
      },
      contentAlign: {
        locked: false,
        show: true
      }
    }
  }
}

Tabs

The tabs object in the Beefree SDK allows you to manage the visibility and permissions of different tabs within the editor, such as the Rows, Content, and Settings tabs. You can control which tabs users can access and whether they can interact with them. By configuring the tabs object, you streamline the editor’s interface, ensuring users have access to only the relevant tabs they need for editing while maintaining control over what they can modify.


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    tabs: {
      rows: {
        locked: false,
        show: true
      },
      settings: {
        locked: false,
        show: true
      },
      content: {
        locked: false,
        show: true
      }
    }
  }
}

Settings

The settings object in the Beefree SDK allows you to control various design-related settings within the editor, such as content area width, background colors, and default font styles. You can define which settings users can view or modify, such as enabling or locking background images or link colors. By configuring the settings object, you ensure that users can customize specific design elements while maintaining overall control over the layout and style of the content.


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    settings: {
      contentAreaWidth: {
        locked: false,
        show: true
      },
      contentAreaAlign: {
        locked: false,
        show: true
      },
      containerBackgroundColor: {
        locked: false,
        show: true
      },
      contentBackgroundColor: {
        locked: false,
        show: true
      },
      containerBackgroundImage: {
        locked: false,
        show: true
      },
      defaultFontFamily: {
        locked: false,
        show: true
      },
      linkColor: {
        locked: false,
        show: true
      },
      title: {
        locked: false,
        show: true
      },
      description: {
        locked: false,
        show: true
      },
      language: {
        locked: false,
        show: true
      },
      favicon: {
        locked: false,
        show: true
      }
    }
  }
}

Content

The content object in the Beefree SDK controls the behavior and permissions for different types of content blocks, such as text, images, buttons, and more. You can specify what users can do with each content type, such as adding, editing, or selecting them, and set properties like alignment, padding, and visibility. By configuring the content object, you allow users to interact with content blocks while maintaining control over how each element can be modified within the design.

Title


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      title: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          direction: {
            locked: false,
            show: true
          },
          heading: {
            locked: false,
            show: true
          },
          title: {
            locked: false,
            show: true
          },
          textAlign: {
            locked: false,
            show: true
          },
          fontSize: {
            locked: false,
            show: true
          },
          fontWeight: {
            locked: false,
            show: true
          },
          fontFamily: {
            locked: false,
            show: true
          },
          letterSpacing: {
            locked: false,
            show: true
          },
          textColor: {
            locked: false,
            show: true
          },
          linkColor: {
            locked: false,
            show: true
          },
          lineHeight: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          },
          id: {
            locked: false,
            show: true
          },
          aiIntegration: {
            locked: false,
            show: true
          }
        },
        textEditor: {
          toolbar: "bold italic underline"
        }
      }
    }
  }
}

Text


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      text: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          textColor: {
            locked: false,
            show: true
          },
          linkColor: {
            locked: false,
            show: true
          },
          lineHeight: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          },
          id: {
            locked: false,
            show: true
          },
          letterSpacing: {
            locked: false,
            show: true
          }
        },
        textEditor: {
          toolbar: "bold italic underline"
        }
      }
    }
  }
}

Image


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      image: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          imageWidth: {
            locked: false,
            show: true
          },
          textAlign: {
            locked: false,
            show: true
          },
          dynamicImage: {
            locked: false,
            show: true
          },
          imageSelector: {
            locked: false,
            show: true
          },
          inputText: {
            locked: false,
            show: true
          },
          link: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          },
          borderRadius: {
            locked: false,
            show: true
          },
          id: {
            locked: false,
            show: true
          },
          customAttributes: {
            locked: false,
            show: true
          }
        }
      }
    }
  }
}

Button


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      button: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          link: {
            locked: false,
            show: true
          },
          buttonWidth: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          backgroundColor: {
            locked: false,
            show: true
          },
          textColor: {
            locked: false,
            show: true
          },
          textAlign: {
            locked: false,
            show: true
          },
          buttonLineHeight: {
            locked: false,
            show: true
          },
          borderRadius: {
            locked: false,
            show: true
          },
          contentPadding: {
            locked: false,
            show: true
          },
          border: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          }
        },
        textEditor: {
          toolbar: "bold italic underline"
        }
      }
    }
  }
}

Divider


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      divider: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          dividerMode: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          },
          id: {
            locked: false,
            show: true
          }
        }
      }
    }
  }
}

Social


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      social: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          iconsMode: {
            locked: false,
            show: true
          },
          icons: {
            locked: false,
            show: true
          },
          align: {
            locked: false,
            show: true
          },
          iconSpacing: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          },
          id: {
            locked: false,
            show: true
          }
        }
      }
    }
  }
}

Dynamic


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      dynamic: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          mergeContent: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          },
          id: {
            locked: false,
            show: true
          }
        }
      }
    }
  }
}

Html


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      html: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          htmlEditor: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          },
          id: {
            locked: false,
            show: true
          }
        }
      }
    }
  }
}

Video (email builder block)


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      video: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          videoUrl: {
            locked: false,
            show: true
          },
          videoIcon: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          },
          id: {
            locked: false,
            show: true
          },
          customAttributes: {
            locked: false,
            show: true
          }
        }
      }
    }
  }
}

Form


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      form: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          beeButton: {
            locked: false,
            show: true
          },
          layOutFields: {
            locked: false,
            show: true
          },
          width: {
            locked: false,
            show: true
          },
          textAlign: {
            locked: false,
            show: true
          },
          fontFamily: {
            locked: false,
            show: true
          },
          fontSize: {
            locked: false,
            show: true
          },
          fontWeight: {
            locked: false,
            show: true
          },
          labelTextColor: {
            locked: false,
            show: true
          },
          labelLineHeight: {
            locked: false,
            show: true
          },
          labelTextAlign: {
            locked: false,
            show: true
          },
          fieldTextColor: {
            locked: false,
            show: true
          },
          fieldBackgroundColor: {
            locked: false,
            show: true
          },
          fieldPadding: {
            locked: false,
            show: true
          },
          buttonWidth: {
            locked: false,
            show: true
          },
          buttonTextColor: {
            locked: false,
            show: true
          },
          buttonBackgroundColor: {
            locked: false,
            show: true
          },
          buttonAlign: {
            locked: false,
            show: true
          },
          buttonPadding: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          },
          id: {
            locked: false,
            show: true
          },
          layoutPreset: {
            locked: false,
            show: true
          }
        }
      }
    }
  }
}

Icon

You should use the Icon object to set advanced permissions when you need granular control over the display and behavior of icon elements. This allows you to lock certain properties, such as the visibility and font weight, ensuring consistency across different devices and user interactions. Additionally, setting these permissions helps in maintaining a cohesive design by managing how icons respond to mobile and AMP environments.

beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      icons: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          icons: {
            locked: false,
            show: true
          },
          align: {
            locked: false,
            show: true
          },
          fontFamily: {
            locked: false,
            show: true
          },
          fontSize: {
            locked: false,
            show: true
          },
          fontWeight: {
            locked: false,
            show: true
          },
          textColor: {
            locked: false,
            show: true
          },
          iconSize: {
            locked: false,
            show: true
          },
          itemsSpacing: {
            locked: false,
            show: true
          },
          iconSpacing: {
            locked: false,
            show: true
          },
          letterSpacing: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: true
          },
          id: {
            locked: false,
            show: true
          }
        }
      }
    }
  }
}

Icon Configuration Elements

In the given icon code, the structure is defined using objects, properties, and parameters to represent a detailed configuration. The main object, icons, encompasses two primary properties: behaviors and properties, each of which is an object itself. The behaviors object contains a property canResetMobile with a boolean parameter set to false, indicating a specific behavior setting. The properties object holds various properties such as icons, fontWeight, align, and more, each representing different characteristics and settings for the icons. Each of these properties has parameters assigned to them; for instance, the icons property has show and locked parameters set to true, determining the visibility and lock status of the icons. This nested structure using objects and properties with defined parameters represent the configuration settings in the code.

Behaviors Object

The table below outlines the configuration elements, their data types, descriptions, and default values for the behaviors object used in the icon configuration.

Configuration Elements
Data Type
Description
Default Value

canResetMobile

boolean

Indicates whether icons can reset to default settings on mobile devices.

false

Properties Object

The table below outlines the configuration elements, their data types, descriptions, and default values for the properties object used in the icon configuration.

Configuration Elements
Data Type
Description
Default Value

icons

object

show

boolean

Determines if the icons are visible.

true

locked

boolean

Indicates if the icons' visibility setting is locked.

true

fontWeight

object

show

boolean

Determines if the font weight option is visible for icons.

true

locked

boolean

Indicates if the font weight option is locked.

false

align

object

Aligns icons within their container.

NA

fontFamily

object

Sets the font family for icon labels.

NA

fontSize

object

Sets the font size for icon labels.

NA

textColor

object

Sets the text color for icon labels.

NA

iconSize

object

Sets the size of the icons.

NA

itemsSpacing

object

Sets the spacing between multiple icons.

NA

iconSpacing

object

Sets the spacing around individual icons.

NA

padding

object

Sets the padding around icons.

NA

hideOnMobile

object

Hides icons on mobile devices.

NA

hideOnAmp

object

Hides icons on AMP-format pages.

NA

id

object

Sets a unique identifier for icons.

NA

letterSpacing

object

Sets the space between letters in icon labels.

NA

Paragraph


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      paragraph: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          direction: {
            locked: false,
            show: true
          },
          paragraphSpacing: {
            locked: false,
            show: true
          },
          textAlign: {
            locked: false,
            show: true
          },
          fontSize: {
            locked: false,
            show: true
          },
          fontWeight: {
            locked: false,
            show: true
          },
          fontFamily: {
            locked: false,
            show: true
          },
          letterSpacing: {
            locked: false,
            show: true
          },
          textColor: {
            locked: false,
            show: true
          },
          linkColor: {
            locked: false,
            show: true
          },
          lineHeight: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          },
          id: {
            locked: false,
            show: true
          },
          aiIntegration: {
            locked: false,
            show: true
          }
        },
        textEditor: {
          toolbar: "bold italic underline"
        }
      }
    }
  }
}

List


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      list: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          direction: {
            locked: false,
            show: true
          },
          textAlign: {
            locked: false,
            show: true
          },
          tag: {
            locked: false,
            show: true
          },
          listStyleType: {
            locked: false,
            show: true
          },
          startList: {
            locked: false,
            show: true
          },
          liSpacing: {
            locked: false,
            show: true
          },
          liIndent: {
            locked: false,
            show: true
          },
          aiIntegration: {
            locked: false,
            show: true
          },
          fontSize: {
            locked: false,
            show: true
          },
          fontWeight: {
            locked: false,
            show: true
          },
          fontFamily: {
            locked: false,
            show: true
          },
          letterSpacing: {
            locked: false,
            show: true
          },
          textColor: {
            locked: false,
            show: true
          },
          linkColor: {
            locked: false,
            show: true
          },
          lineHeight: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: false
          },
          id: {
            locked: false,
            show: true
          }
        },
        textEditor: {
          toolbar: "bold italic underline"
        }
      }
    }
  }
}

Menu


beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      menu: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          menuItems: {
            locked: false,
            show: true
          },
          fontFamily: {
            locked: false,
            show: true
          },
          fontSize: {
            locked: false,
            show: true
          },
          fontWeight: {
            locked: false,
            show: true
          },
          letterSpacing: {
            locked: false,
            show: true
          },
          textColor: {
            locked: false,
            show: true
          },
          linkColor: {
            locked: false,
            show: true
          },
          align: {
            locked: false,
            show: true
          },
          layout: {
            locked: false,
            show: true
          },
          separator: {
            locked: false,
            show: true
          },
          hamburger: {
            locked: false,
            show: true
          },
          itemSpacing: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          id: {
            locked: false,
            show: true
          }
        }
      }
    }
  }
}

Table

beeConfig: {
  uid: 'CmsUserName', // [mandatory]
  container: 'bee-plugin-container', // [mandatory]
  advancedPermissions: {
    content: {
      table: {
        behaviors: {
          canSelect: true,
          canAdd: true,
          canViewSidebar: true,
          hiddenOnAmp: false,
          hiddenOnHtml: false,
          hiddenOnMobile: false,
          hiddenOnDesktop: false,
          canResize: true,
          canResetMobile: true
        },
        properties: {
          columns: {
            locked: false,
            show: true
          },
          rows: {
            locked: false,
            show: true
          },
          backgroundColor: {
            locked: false,
            show: true
          },
          border: {
            locked: false,
            show: true
          },
          textColor: {
            locked: false,
            show: true
          },
          linkColor: {
            locked: false,
            show: true
          },
          fontFamily: {
            locked: false,
            show: true
          },
          fontWeight: {
            locked: false,
            show: true
          },
          fontSize: {
            locked: false,
            show: true
          },
          textAlign: {
            locked: false,
            show: true
          },
          lineHeight: {
            locked: false,
            show: true
          },
          letterSpacing: {
            locked: false,
            show: true
          },
          direction: {
            locked: false,
            show: true
          },
          padding: {
            locked: false,
            show: true
          },
          hideOnMobile: {
            locked: false,
            show: true
          },
          hideOnAmp: {
            locked: false,
            show: true
          },
          id: {
            locked: false,
            show: true
          },
          alternateRowBackgroundColor: {
            locked: false,
            show: true
          },
          headers: {
            locked: false,
            show: true
          }
        },
        textEditor: {
          toolbar: "bold italic underline"
        }
      }
    }
  }
}

Addon

In this section, we will explore how to assign advanced permissions and behaviors for various AddOn types, specifically focusing on how to customize permissions for Custom AddOns and Row AddOns. These permissions can override default settings to provide granular control. For instance, an image addon can have specific permissions different from the default image block permissions.

To successfully use this feature, follow these steps:

  1. Identify the AddOn ID: Obtain the unique ID of the addon you wish to assign permissions to.

  2. Define Custom Permissions: Based on the type of addon, assign relevant permissions in your configuration file.

  3. Override Default Permissions: Specify advanced permissions for the addon, ensuring they override the default ones if needed.

  4. Set Specific Behaviors: For row addons, include permissions for individual modules like image blocks inside the row addon.

  5. Apply Global Restrictions: Optionally, set global restrictions for all mixed and row content addons for consistent behavior.

By following these steps, you can effectively manage and customize addon permissions.

The following code provides an example of the different content modules and the addons-id.

content: {
  image: { /**/ }, // The image block allows you to add and configure images in your content.
  button: { /**/ }, // The button block provides options for adding and styling call-to-action buttons.
  social: { /**/ }, // The social block enables you to include social media icons for sharing or linking.
  addon: {
    // The addon block supports custom addons content, such as custom images or mixed content addons.
    customImageHandle: { /**/ }, // A custom image addon to manage and configure image properties.
    customRowAddonHandle: { /**/ } // A custom row addon for managing entire row behaviors and properties.
  }
}

The following code shows an example AddOn with the canViewSidebar behavior set to true.


content: {
  addon: {
    // This is where you define custom addons, such as a custom images addon.
    customImageHandle: {
      behaviors: {
        canViewSidebar: true, // Specifies that the sidebar is visible for this custom image addon.
      },
    },
  }
}

Module inside row addon

The following code defines specific permissions and behaviors for different modules within a Row AddOn.

content: {
  addon: {
    // This block allows the addition of custom addons and controls their behaviors.
    customImageHandle: {
      behaviors: {
        canViewSidebar: true, // Enables the sidebar for this specific addon.
      },
    },
    customRowAddonHandle: {
      // Custom row-specific behaviors and permissions for an addon inside a row.
      behaviors: {
        canAdd: true, // Allows adding a new row.
        canClone: false, // Disables cloning of this row.
        canDelete: false // Disables deleting of this row.
      },
      image: {
        // Controls behaviors and properties for image modules within this row addon.
        behaviors: {
          canSelect: true // Allows image selection inside the row addon.
        },
        properties: {
          textAlign: {
            show: false // Hides the text alignment control for images in this row addon.
          }
        }
      }
    },
    mixed: {
      // Handles behaviors for mixed content addons (those containing multiple types of content).
      behaviors: {
        canAdd: false // Disables the ability to add mixed content.
      }
    },
    rowAddon: {
      // Controls behaviors for all row content addons.
      behaviors: {
        canAdd: false // Disables adding new row content addons.
      }
    }
  }
}

Add Condition and Edit Condition Buttons

You can choose to display or hide the "Add Condition" and "Edit Condition" buttons when using the Content Dialog with Display Conditions.

The following code shows an example config for how you can display or hide these buttons using advanced permissions.

{
  rows: {
    // Controls the display conditions for rows in your design.
    displayConditions: {
      locked: false, // Specifies whether the display conditions can be edited. 'false' means it can be modified.
      show: true // Determines if the display conditions are visible to the user.
    }
  }
}

Brand Tones Settings

The following code snippet provides an example configuration for integrating the AI Writing Assistant AddOn with advanced permission settings for managing access and permissions to Brand Tones:

const beeConfig = {
  uid: 'unique_user_id', // Unique identifier for the user
  addOns: [
    {
      id: "ai-integration", // Identifier for the AI integration add-on
      settings: {
        isBrandTonesEnabled: true, // Mandatory to enable the Brand Tones feature
        canAddBrandTones: true, // Optional: Allow the user to add new Brand Tones
        canDeleteBrandTones: false, // Optional: Prevent the user from deleting existing Brand Tones
        canEditBrandTones: true, // Optional: Allow the user to edit existing Brand Tones
        canSelectBrandTones: true // Optional: Allow the user to select Brand Tones for use
      }
    }
  ],
  // Other configurations
};

Role templates

We’ve put together a few JSON templates of custom roles created with Advanced permissions, so you can get started experimenting with this powerful feature.

You can find them in our GitHub account.

Tracking Message Changes

This feature is available on Beefree SDK only.

Overview of Tracking Message Changes

This page discusses how to effectively track message changes in the Beefree SDK. It explains how you can use the onChange function to monitor real-time JSON updates, enabling efficient application updates and debugging, if needed. It also covers how to implement the onRemoteChange function to track edits made by other users, ensuring that team projects remain synchronized and consistent. By leveraging these two callbacks, you can develop a workflow for tracking design changes your end users make, whether they are within single session or a session.

This page explores and answers the following questions:

  • How can I monitor what my customers do in the builder?

  • How can I tell when a message has actually been updated?

  • How can I tell when a session has been updated?

Use cases

This section discusses use cases for tracking message changes.

Usage tracking

In today’s software, knowing how customers use an application is essential if you want to provide a good user experience (UX) and eliminate friction points. It’s also a valuable resource to understand where to invest future development effort and build something that customers love.

onChange tracking gives you – the host application – the opportunity to get this information when your customers are creating designs in the builder.

You can use the onChange callback to:

  • Understand if your customers are actively working on the message they opened (or if instead they temporarily abandoned that task to work on something else).

  • Discover if they are using one of the great new features that your team recently enabled.

  • Dismiss or confirm a bug by reproducing a customer’s steps.

Autosave

So you might be asking: “Isn’t this similar to the existing feature?” The simple answer is “No!”.

The function is triggered at regular intervals, whether anything has even changed since the last Autosave event or not, which could result in the user seeing a ‘recovery dialog’ window even if there weren’t any changes between the previously saved message and the most recent automatically saved one.

Now you can invoke the Autosave event only when something has been added or updated, resulting in a better message recovery experience.

History

Why is having a historical log of message changes so important? As with the previous cases, this will allow you to provide a better overall user experience. Creating a good email message or campaign typically involves input from several people or departments before it’s finally ready to send, but that can lead to inadvertent mistakes that might cause hours of work to be lost. Saving the differences between versions of a message created during the email production workflow – and allowing your users to compare & restore them – could be a huge time-saver in those cases.

Content check

When one of your users adds or updates text or images, the onChange callback returns the new input to your application, allowing you to trigger a complementary function based on it.

The use cases change from application-to-application, but the feature is flexible enough to accommodate a wide variety of scenarios. Here are just a few:

  • Content suggestions

  • Prevent unwanted content

  • Link validation

  • Link reputation check

  • Custom HTML validation

  • Set up an alternative workflow when conditional syntax is applied

  • …

How it works

When you enable onChange and your end users edit their message, the callback provides you with:

  • Information on the new content or section

  • The action that was performed on existing content

  • The JSON update (as the entire page, as well as JSON patches)

onChange JSON example

The following JSON displays an example of what you can expect to receive from the onChange callback.

Note: onChange is also the foundation on which the feature was built on.

Prerequisites

To enable tracking message changes, you need to add the following in the :

  • Add trackChanges and set it to true.

  • The onChange callback, with the related response function.

  • (Optional) Add and set the onRemoteChange boolean to true for multi-user message tracking during .

Enable "onChange" Event

The following code provides an example callback function for onChange.

onRemoteChange

The onRemoteChange callback is a bit different than onChange, because it monitors and tracks the changes of other users (those who are not the primary user) during . Using this callback allows you to monitor the changes of all end users in the same session.

Consider the following when using the onRemoteChange callback:

  • onChange and onRemoteChange have the same .

  • onChange and onRemoteChange have the same .

The following code provides an example callback function for onRemoteChange.

onRemoteChange JSON example

The following JSON displays an example of the onRemoteChange callback response.

Note: The following section discusses how to configure both onChange and onRemoteChange. Please keep in mind that the configurations apply to both callbacks.

Configure onChange and onRemoteChange

This section discusses how to configure onChange and onRemoteChange.

This parameter defines when the tracking is active in the builder.

onChange Event

The onChange callback is triggered every time the builder tracks a change in the message. It returns the message JSON and a response JSON which contains all the information needed to handle any of the use cases described above.

Callback response schema

Callback Parameters

The following table lists the parameters in the onChange and onRemoteChange callback response schema and their corresponding types and values.

Parameter
Type
Value

Content Codes

Code
Content

Common Actions

Code
Action

Complete Event Chart

Code
Description
Type
Value
{
    "message": {
        "page": {
            "body": {
                "container": {
                    "style": {
                        "background-color": "#FFFFFF"
                    }
                },
                "content": {
                    "computedStyle": {
                        "linkColor": "#0068A5",
                        "messageBackgroundColor": "transparent",
                        "messageWidth": "500px"
                    },
                    "style": {
                        "color": "#000000",
                        "font-family": "Arial, Helvetica, sans-serif"
                    }
                },
                "type": "mailup-bee-page-properties",
                "webFonts": []
            },
            "description": "Empty template for BEE",
            "rows": [
                {
                    "columns": [
                        {
                            "grid-columns": 12,
                            "modules": [
                                {
                                    "type": "mailup-bee-newsletter-modules-heading",
                                    "descriptor": {
                                        "heading": {
                                            "title": "h1",
                                            "text": "<span class=\"tinyMce-placeholder\">hello</span>",
                                            "style": {
                                                "color": "#555555",
                                                "font-size": "23px",
                                                "font-family": "inherit",
                                                "link-color": "#0068A5",
                                                "line-height": "120%",
                                                "text-align": "center",
                                                "direction": "ltr",
                                                "font-weight": "700",
                                                "letter-spacing": "0px"
                                            }
                                        },
                                        "style": {
                                            "width": "100%",
                                            "text-align": "center",
                                            "padding-top": "0px",
                                            "padding-right": "0px",
                                            "padding-bottom": "0px",
                                            "padding-left": "0px"
                                        },
                                        "mobileStyle": {}
                                    },
                                    "uuid": "e4b98f50-b74c-45a8-a184-e5622cdd62fe",
                                    "locked": false
                                }
                            ],
                            "style": {
                                "background-color": "transparent",
                                "border-bottom": "0px solid transparent",
                                "border-left": "0px solid transparent",
                                "border-right": "0px solid transparent",
                                "border-top": "0px solid transparent",
                                "padding-bottom": "5px",
                                "padding-left": "0px",
                                "padding-right": "0px",
                                "padding-top": "5px"
                            },
                            "uuid": "bb75ccd1-db9a-4c93-9cf4-85644245b25d"
                        }
                    ],
                    "container": {
                        "style": {
                            "background-color": "transparent",
                            "background-image": "none",
                            "background-position": "top left",
                            "background-repeat": "no-repeat"
                        }
                    },
                    "content": {
                        "computedStyle": {
                            "hideContentOnDesktop": false,
                            "hideContentOnMobile": false,
                            "rowColStackOnMobile": true,
                            "rowReverseColStackOnMobile": false,
                            "verticalAlign": "top"
                        },
                        "style": {
                            "background-color": "transparent",
                            "background-image": "none",
                            "background-position": "top left",
                            "background-repeat": "no-repeat",
                            "color": "#000000",
                            "width": "500px"
                        }
                    },
                    "empty": false,
                    "locked": false,
                    "synced": false,
                    "type": "row-1-columns-12",
                    "uuid": "fd68e622-bad7-4cca-84e2-a0315d4ffba7"
                }
            ],
            "template": {
                "name": "template-base",
                "type": "basic",
                "version": "2.0.0"
            },
            "title": "Empty Template"
        },
        "comments": {}
    },
    "changes": {
        "code": "1323",
        "value": "<span class=\"tinyMce-placeholder\">hello</span>",
        "description": "Text edited",
        "patches": [
            {
                "op": "add",
                "path": "/rows/0/columns/0/modules/0",
                "value": {
                    "type": "mailup-bee-newsletter-modules-heading",
                    "descriptor": {
                        "heading": {
                            "title": "h1",
                            "text": "<span class=\"tinyMce-placeholder\">hello</span>",
                            "style": {
                                "color": "#555555",
                                "font-size": "23px",
                                "font-family": "inherit",
                                "link-color": "#0068A5",
                                "line-height": "120%",
                                "text-align": "center",
                                "direction": "ltr",
                                "font-weight": "700",
                                "letter-spacing": "0px"
                            }
                        },
                        "style": {
                            "width": "100%",
                            "text-align": "center",
                            "padding-top": "0px",
                            "padding-right": "0px",
                            "padding-bottom": "0px",
                            "padding-left": "0px"
                        },
                        "mobileStyle": {}
                    },
                    "uuid": "e4b98f50-b74c-45a8-a184-e5622cdd62fe",
                    "locked": false
                }
            }
        ]
    }
}
trackChanges: true, // boolean
onChange: function (jsonFile, response) {
  console.log('json', jsonFile);
  console.log('response', response);
},
onRemoteChange: function (jsonFile, response) {
  console.log('json', jsonFile);
  console.log('response', response);
},
{
    "message": {
        "page": {
            "body": {
                "container": {
                    "style": {
                        "background-color": "#FFFFFF"
                    }
                },
                "content": {
                    "computedStyle": {
                        "linkColor": "#0068A5",
                        "messageBackgroundColor": "transparent",
                        "messageWidth": "500px"
                    },
                    "style": {
                        "color": "#000000",
                        "font-family": "Arial, Helvetica, sans-serif"
                    }
                },
                "type": "mailup-bee-page-properties",
                "webFonts": []
            },
            "description": "Empty template for BEE",
            "rows": [
                {
                    "columns": [
                        {
                            "grid-columns": 12,
                            "modules": [
                                {
                                    "type": "mailup-bee-newsletter-modules-heading",
                                    "descriptor": {
                                        "heading": {
                                            "title": "h1",
                                            "text": "<span class=\"tinyMce-placeholder\">I'm a new title block</span>",
                                            "style": {
                                                "color": "#555555",
                                                "font-size": "23px",
                                                "font-family": "inherit",
                                                "link-color": "#0068A5",
                                                "line-height": "120%",
                                                "text-align": "center",
                                                "direction": "ltr",
                                                "font-weight": "700",
                                                "letter-spacing": "0px"
                                            }
                                        },
                                        "style": {
                                            "width": "100%",
                                            "text-align": "center",
                                            "padding-top": "0px",
                                            "padding-right": "0px",
                                            "padding-bottom": "0px",
                                            "padding-left": "0px"
                                        },
                                        "mobileStyle": {}
                                    },
                                    "uuid": "e4b98f50-b74c-45a8-a184-e5622cdd62fe",
                                    "locked": false
                                }
                            ],
                            "style": {
                                "background-color": "transparent",
                                "border-bottom": "0px solid transparent",
                                "border-left": "0px solid transparent",
                                "border-right": "0px solid transparent",
                                "border-top": "0px solid transparent",
                                "padding-bottom": "5px",
                                "padding-left": "0px",
                                "padding-right": "0px",
                                "padding-top": "5px"
                            },
                            "uuid": "bb75ccd1-db9a-4c93-9cf4-85644245b25d"
                        }
                    ],
                    "container": {
                        "style": {
                            "background-color": "transparent",
                            "background-image": "none",
                            "background-position": "top left",
                            "background-repeat": "no-repeat"
                        }
                    },
                    "content": {
                        "computedStyle": {
                            "hideContentOnDesktop": false,
                            "hideContentOnMobile": false,
                            "rowColStackOnMobile": true,
                            "rowReverseColStackOnMobile": false,
                            "verticalAlign": "top"
                        },
                        "style": {
                            "background-color": "transparent",
                            "background-image": "none",
                            "background-position": "top left",
                            "background-repeat": "no-repeat",
                            "color": "#000000",
                            "width": "500px"
                        }
                    },
                    "empty": false,
                    "locked": false,
                    "synced": false,
                    "type": "row-1-columns-12",
                    "uuid": "fd68e622-bad7-4cca-84e2-a0315d4ffba7"
                }
            ],
            "template": {
                "name": "template-base",
                "type": "basic",
                "version": "2.0.0"
            },
            "title": "Empty Template"
        }
    },
    "changes": {
        "code": "1300",
        "description": "Title dropped",
        "patches": [
            {
                "op": "add",
                "path": "/rows/0/columns/0/modules/0",
                "value": {
                    "type": "mailup-bee-newsletter-modules-heading",
                    "descriptor": {
                        "heading": {
                            "title": "h1",
                            "text": "<span class=\"tinyMce-placeholder\">I'm a new title block</span>",
                            "style": {
                                "color": "#555555",
                                "font-size": "23px",
                                "font-family": "inherit",
                                "link-color": "#0068A5",
                                "line-height": "120%",
                                "text-align": "center",
                                "direction": "ltr",
                                "font-weight": "700",
                                "letter-spacing": "0px"
                            }
                        },
                        "style": {
                            "width": "100%",
                            "text-align": "center",
                            "padding-top": "0px",
                            "padding-right": "0px",
                            "padding-bottom": "0px",
                            "padding-left": "0px"
                        },
                        "mobileStyle": {}
                    },
                    "uuid": "e4b98f50-b74c-45a8-a184-e5622cdd62fe",
                    "locked": false
                }
            }
        ],
        "value": ""
    }
}

onChange: function (jsonFile, response) { // do something with response... },

{
    "code": "01", // See content and action codes bellow
    "description": "string",
    "value": "string", // See the chart below
    "patches": {...} // JSON patch formatted object
}

code

string

Unique identifier for the event created by combining the content code with the action code.

description

string

A text description of the event in the chosen language. (e.g. Image Block Padding Left: 5px)

value

string

If available, this is the new value. (e.g. If padding changes to 5px, then the value returned is “5px”)

patches

array

An array of patches in the JSON Patch specification. JSON Patch is specified in RFC 6902 from the IETF.

01

Text Block

02

Image Block

03

Button Block

04

Divider Block

05

Social Block

06

Dynamic Content Block

07

HTML Block

08

Video Block

09

Form

10

Icons

11

Menu

14

Row

16

Message

18

Spacer

22

Paragraph

23

List

26

Table

00

Dropped

01

Dragged

02

Deleted

03

Duplicated

04

Changed

05

Opened

06

Closed

07

Locked

08

Saved

09

Restored

10

Content area background color

11

Do not stack on mobile

12

Row background image

13

Background Center

14

Background Repeat

15

Background Full width

16

Row Display condition

17

Reverse stack order on mobile

20

Text color

21

Link color

23

Text edited

24

Line height

25

Content area width

27

Background color

28

Default font

30

Padding All sides

31

Padding Left

32

Padding Right

33

Padding Top

34

Padding Bottom

40

Hide on mobile

41

Video url

42

Play icon type

43

Play icon color

44

Play icon size

50

Align

51

Automatic image resizing

52

Full width on mobile

53

Image width

60

Alternate text

61

Dynamic image src

62

Dynamic image toggle

63

Change image

64

Image link

70

Button Align

71

Button Link type

72

Button width

73

Button Auto width

74

Button Background color

75

Border radius

80

HTML edited

81

Border All sides

82

Border Left

83

Border Right

84

Border Top

85

Border Bottom

90

Divider Line toggle

91

Divider Width

92

Divider Height

93

Divider Align

95

Icon Name

96

Icon Alternate text

97

Icon Url

98

Icon spacing

99

Icon Align

128

Background Video

129

Paragraph Spacing

130

Font Weight

131

List Type

132

Start List

133

List Spacing

134

List Indent

135

List Style Position

0100

Text dropped

module

0101

Text dragged

module

0102

Text deleted

module

0103

Text duplicated

module

0120

Text color {{value}}

string

Hex color code (e.g. #FFFFFF)

0121

Link color {{value}}

string

Hex color code (e.g. #FFFFFF)

0123

Text edited

string

HTML

0124

Line height {{value}}

string

Value as percent (e.g. 150%)

0130

Padding Add sides {{value}}

string

Value in pixels (e.g. 25px)

0131

Padding Left {{value}}

string

Value in pixels (e.g. 25px)

0132

Padding Right {{value}}

string

Value in pixels (e.g. 25px)

0133

Padding Top {{value}}

string

Value in pixels (e.g. 25px)

0134

Padding Bottom {{value}}

string

Value in pixels (e.g. 25px)

0140

Hide on mobile

boolean

true | false

0200

Image dropped

module

0201

Image dragged

module

0202

Image deleted

module

0203

Image duplicated

module

0230

Padding Add sides {{value}}

string

Value in pixels (e.g. 25px)

0231

Padding Left {{value}}

string

Value in pixels (e.g. 25px)

0232

Padding Right {{value}}

string

Value in pixels (e.g. 25px)

0233

Padding Top {{value}}

string

Value in pixels (e.g. 25px)

0234

Padding Bottom {{value}}

string

Value in pixels (e.g. 25px)

0240

Hide on mobile

boolean

true | false

0250

Align {{value}}

string

left | right | center

0251

Automatic image resizing

boolean

true | false

0252

Full width on mobile

boolean

true | false

0253

Image width {{value}}

string

%

0260

Alternate Text

string

text value

0261

Dynamic image

string

Image path

0262

Dynamic image toggle

boolean

false (only triggered when disabled)

0263

Change image

string

Image path

0264

Image link

string

Url

0300

Button dropped

module

0301

Button dragged

module

0302

Button deleted

module

0303

Button duplicated

module

0320

Text color {{value}}

string

Hex color code (e.g. #FFFFFF)

0324

Line height {{value}}

string

Value as percent (e.g. 150%)

0330

Padding Add sides {{value}}

string

Value in pixels (e.g. 25px)

0331

Padding Left {{value}}

string

Value in pixels (e.g. 25px)

0332

Padding Right {{value}}

string

Value in pixels (e.g. 25px)

0333

Padding Top {{value}}

string

Value in pixels (e.g. 25px)

0334

Padding Bottom {{value}}

string

Value in pixels (e.g. 25px)

0340

Hide on mobile

boolean

true | false

0370

Align {{value}}

string

left | right | center

0371

Link type {{value}}

string

Url

0372

Button width {{value}}

string

%

0373

Auto width

boolean

true | false

0374

Background color {{value}}

string

Hex Color Code (e.g. #FFFFFF)

0375

Border radius

string

Value in pixels (e.g. 5px)

0381

Border Add sides {{value}}

string

Value in pixels | Border Style | Hex color (e.g. 1px solid #C7702E)

0382

Border Left {{value}}

string

Value in pixels | Border Style | Hex color 1px solid #C7702E

0383

Border Right {{value}}

string

Value in pixels | Border Style | Hex color 1px solid #C7702E

0384

Border Top {{value}}

string

Value in pixels | Border Style | Hex color 1px solid #C7702E

0385

Border Bottom {{value}}

string

Value in pixels | Border Style | Hex color 1px solid #C7702E

0400

Divider dropped

module

0401

Divider dragged

module

0402

Divider deleted

module

0403

Divider duplicated

module

0430

Padding Add sides {{value}}

string

Value in pixels (e.g. 25px)

0431

Padding Left {{value}}

string

Value in pixels (e.g. 25px)

0432

Padding Right {{value}}

string

Value in pixels (e.g. 25px)

0433

Padding Top {{value}}

string

Value in pixels (e.g. 25px)

0434

Padding Bottom {{value}}

string

Value in pixels (e.g. 25px)

0440

Hide on mobile

boolean

true | false

0490

Line

string

Value in pixels | Border Style | Hex color 1px solid #C7702E

0491

Width {{value}}

string

Value as percent (e.g. 150%)

0492

Height {{value}}

string

Value in pixels (e.g. 25px)

0493

Align {{value}}

string

left | right | center

0500

Social dropped

module

0501

Social dragged

module

0502

Social deleted

module

0503

Social duplicated

module

0530

Padding Add sides {{value}}

string

Value in pixels (e.g. 25px)

0531

Padding Left {{value}}

string

Value in pixels (e.g. 25px)

0532

Padding Right {{value}}

string

Value in pixels (e.g. 25px)

0533

Padding Top {{value}}

string

Value in pixels (e.g. 25px)

0534

Padding Bottom {{value}}

string

Value in pixels (e.g. 25px)

0540

Hide on mobile

boolean

true | false

0595

Name {{value}}

string

Icon Name

0596

Alternate Text {{value}}

string

Icon Alternate text

0597

Image Url

string

Icon Url

0598

Icon spacing {{value}}

string

Value in pixels (e.g. 0 0 5px 15px)

0599

Align {{value}}

string

left | right | center

0600

Dynamic content dropped

module

0601

Dynamic content dragged

module

0602

Dynamic content deleted

module

0603

Dynamic content duplicated

module

0604

Dynamic content changed

string

value

0640

Hide on mobile

boolean

true | false

0700

HTML dropped

module

0701

HTML dragged

module

0702

HTML deleted

module

0703

HTML duplicated

module

0740

Hide on mobile

boolean

true | false

0780

HTML edited

string

HTML

0800

Video dropped

module

0801

Video dragged

module

0802

Video deleted

module

0803

Video duplicated

module

0830

Padding Add sides {{value}}

string

Value in pixels (e.g. 25px)

0831

Padding Left {{value}}

string

Value in pixels (e.g. 25px)

0832

Padding Right {{value}}

string

Value in pixels (e.g. 25px)

0833

Padding Top {{value}}

string

Value in pixels (e.g. 25px)

0834

Padding Bottom {{value}}

string

Value in pixels (e.g. 25px)

0840

Hide on mobile

boolean

true | false

0841

Video url

string

Video Url

0842

Play icon type {{value}}

string

Play icon type (e.g. Round outline)

0843

Play icon color {{value}}

string

light | dark

0844

Play icon size {{value}}

string

Value in pixels (e.g. 25px)

1400

Row dropped

row

1401

Row dragged

row

1402

Row deleted

row

1403

Row duplicated

row

1410

Content background color {{value}}

string

Hex Color Code (e.g. #FFFFFF)

1411

Do not stack on mobile

boolean

true | false

1412

Row background image

string

Image path

1413

Center

boolean

true | false

1414

Repeat

boolean

true | false

1415

Full width

boolean

true | false

1416

Display Condition

object

Display condition object

1417

Reverse stack order on mobile

boolean

true | false

1430

Padding Add sides {{value}}

string

Value in pixels (e.g. 25px)

1431

Padding Left {{value}}

string

Value in pixels (e.g. 25px)

1432

Padding Right {{value}}

string

Value in pixels (e.g. 25px)

1433

Padding Top {{value}}

string

Value in pixels (e.g. 25px)

1434

Padding Bottom {{value}}

string

Value in pixels (e.g. 25px)

1474

Background color {{value}}

string

Hex Color Code (e.g. #FFFFFF)

1481

Border Add sides {{value}}

string

Value in pixels | Border Style | Hex color 1px solid #C7702E

1482

Border Left {{value}}

string

Value in pixels | Border Style | Hex color 1px solid #C7702E

1483

Border Right {{value}}

string

Value in pixels | Border Style | Hex color 1px solid #C7702E

1484

Border Top {{value}}

string

Value in pixels | Border Style | Hex color 1px solid #C7702E

1485

Border Bottom {{value}}

string

Value in pixels | Border Style | Hex color 1px solid #C7702E

1625

Content area width {{value}}

string

Value in pixels (e.g. 25px)

1626

Background color {{value}}

string

Hex Color Code (e.g. #FFFFFF)

1627

Content area background color: {{value}}

string

Hex Color Code (e.g. #FFFFFF)

1628

Default font

string

Font

1529

Link color {{value}}

string

Hex Color Code (e.g. #FFFFFF)

1605

Message opened

page

JSON template

1609

Message restored (e.g. undo or redo history)

page

JSON template

13130

Button Font Weight

string

14128

Row Background Video

string

Video URL

22130

Paragraph Font Weight

string

Font Weight value

paid plans
collaborative editing
collaborative editing
Autosave
Autosave
Undo, Redo & Edit History
beeConfig
collaborative editing session
collaborative editing sessions
prerequisites
callback response schema structure