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...
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...
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...
Install Beefree SDK to get started with your implementation.
Use the command npm i @beefree.io/sdk
to install the Beefree SDK library into your project.
Take the steps outlined in this section to initialize your application.
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:
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.
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:
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
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:
Learn how to create an application within the Beefree SDK Developer Console.
This article will cover steps for the following processes:
Complete the required information to sign up or login.
You will be redirected to the dashboard.
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.
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.
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.
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.
Enter and confirm your billing address.
Enter and confirm your card information by clicking Place Order.
You will be redirected your new Free plan subscription.
You will have the option to activate any or all of the following applications:
Take the following steps to create an application:
Click the Activate button that corresponds with the application you'd like to create.
Type in a name for your new application.
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.
Click on your application's Details button to view your Client ID and Client Secret. Use these to authenticate when you initialize it.
Reference the following related topics to learn more about customizing your applications, creating development instances, and referencing sample code.
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:
Navigate to the application you'd like to update the Client Secret for.
Click on the application's Details button.
Navigate to Application keys within the application's details.
Click Regenerate to generate a new Client Secret.
You will be prompted to a modal and asked to confirm your application's name.
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.
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.
We talk about this step in detail , but here’s a quick example:
The following table shows all of the required :
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.
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 :
Navigate to the .
Note: If you already have an account, navigate to the .
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.
Once that’s done, you will be able to . Your dashboard will look like the following image.
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 .
Log in to the .
Create
Welcome to the Beefree SDK technical documentation!
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:
Learn more about our three embeddable builders.
Learn more about how our builder AddOns can help you customize your application's offerings.
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.
Browse our sample code to experiment and gain hands-on experience. Get up and running quickly with a simple implementation.
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.
Email builder: A no-code interactive and guided experience that supports your end users in creating beautiful and stunning quickly.
Page builder: A no-code intuitive experience that guides your end users through how to create visually stunning they can use to present information, , 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 that grab and maintain attention.
File manager: A tool to manage (images, PDFs, and so on).
Template catalog: A 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 on top of our comprehensive suite of features.
AI Writing Assistant: A helpful to help end users write their design content.
These builders can easily integrate into your application in a matter of minutes. Browse the latest , implementation guides, and other available features in this documentation.
In addition to our drag-and-drop editors, we also offer a standalone 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 and .
The 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.
Learn more about and .
Get your free Client ID and Client Secret in the to get started. Experiment with customizing a configuration in the playground. When you're ready, install Beefree SDK.
If you need support at any point throughout your integration, . We are here to support you along the way.
The UID parameter:
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
.
It uniquely identifies a user of the application. When we say “uniquely”, we mean that:
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).
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.
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.
Is an alphanumeric string passed to Beefree SDK throughout the .
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 .
It will be counted as a unique user for .
Learn about the different environments available through Beefree SDK and how to get started to with each.
Development applications are available with any Beefree SDK paid plan.
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.
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:
Create a new application
Navigate to your dashboard where the new application is located
Click the + next to Add a development instance
Type in the name of your development application, for example “development environment” or “QA environment”
Click Create
View the new development application available in your Beefree SDK dashboard
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
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.
Log in to your
Assuming that beePluginInstance
is the instance of your embedded builder application, here are the methods you can call:
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:
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.
When you load a Beefree application inside the host application, you pass a 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.
Updating available categories for
Refreshing a for authorization
Changing for the current user
Updating settings for the editor’s
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.
beePluginInstance.start(templateToLoad)
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.
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.
onComment
Fired every time a thread or comment changes.
onFilePickerInsert
Object with file info
onFilePickerCancel
None
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 .
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 only.
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 only.
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!
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.
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
Here is an example of loading Beefree SDK with a “mixed” workspace:
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:
After you load a workspace, the application will trigger one of these three callbacks:
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.
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.
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 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.
Here is an overview of the different workspaces and their differences. Please for more information on using AMP in Beefree SDK.
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:
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 .
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.
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.
Learn how to manage users within the Beefree SDK Developer 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;
change the company’s name, also in Settings & Security.
Using this simple, client-side example, you can literally try out Beefree SDK in 2 minutes…
Create a new application: you will find your keys in the project’s details page
Open index.html
with your favorite code editor
Locate client_id
and replace “YOUR_CLIENT_ID” with yours
Locate client_secret
and replace “YOUR_CLIENT_SECRET” with yours
Save the file
Before using the code samples listed below in a production environment, please consider the following:
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.
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.
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.
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
An overview of page builder within 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.
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.
The Embedded mode allows video playback inside the page. It requires the URL of a video hosted on YouTube, YouTube Shorts, or Vimeo.
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.
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.
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)
Discover the configuration parameters within 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:
The following table provides a list of the required parameters.
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.
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
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
The following table provides a list of the optional parameters and their corresponding descriptions.
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
{}
defaultForm
{}
commenting
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
When 2FA is set up, users will need to:
use their device and the app to generate a token and log in.
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.
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.
Instead, if 2FA is ON at the account level, admins cannot turn it off from the “Profile” page and must contact their account owner.
turn on , 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 ();
Obtain your application keys (Client ID and Client Secret) (there is a free plan).
the client-side sample code.
Open it in your browser and get creative
Make sure you first and get your application keys (Client ID and Client Secret).
This feature is available on Beefree SDK only.
Allows to exchange data with Beefree SDK using a UI layer you control. See the “” page for the complete reference.
This should contain a structure
object with the form data.
See “” for further details.
Enables commenting on content blocks and rows. See for further details.
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 : their regular login credentials, and a token generated by a two-factor authentication app.
download a two-factor authentication app to their mobile device (e.g. , , , and others);
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.
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!
You can easily change the background to make the workspace look like the destination page where your customer will embed the popup.
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:
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 .
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.
We added a new function to track message changes in the builder. This powerful new feature answers two important questions:
How can I monitor what my customers do in the builder?
How can I tell when a message has actually been updated?
When onChange is enabled and your customers edit their message – the callback provides you valuable information on the new content or section, the kind of action that was performed on existing content, and the JSON update (as the entire page, as well as JSON patches).
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.
Now you can invoke the Autosave event only when something has been added or updated, resulting in a better message recovery experience.
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.
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
…
The configuration option
The onChange
callback, with the related response function
This parameter defines when the tracking is active in the builder.
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.
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
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
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.
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.).
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;
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.
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.
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.
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.
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.
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.
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.
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.
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:
You can load forms in the builder with two methods:
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.
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.
canBeModified
all fields except file
, hidden
, label
, and submit
,
since they cannot be edited
boolean
true
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.
canBeRemovedFromLayout
all fields
boolean
true
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.
removeFromLayout
all fields
boolean
false
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:
you can use a single form with all the possible fields, so there is no form selection step;
you can hide less common fields to load the most used combination at first, and keep the starting point simple, or even empty;
the user than can explore available fields with the form properites and build their custom form
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:
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 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:
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.
Let’s now examine the anatomy of a Beefree SDK form structure.
This object contains the general form attributes as strings: all of them are standard HTML5 attributes.
action
string
method
string
target
string
accept-charset
string
autocomplete
string
enctype
string
novalidate
boolean
dir
string
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.
canBeRemovedFromLayout
all fields
boolean
true
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.
removeFromLayout
all fields
boolean
false
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:
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.
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.
You can enable your users to add forms in Beefree SDK with two methods:
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.
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
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.
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.
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
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 . . .
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:
Beefree SDK just passes the data back to the host application. It doesn’t save anything or touch any of the data.
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).
Learn how to implement the different methods to pass forms to the Builder
A closer look at how to structure a JSON form
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.
Explore how to implement customization options for a form's layout.
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.
Prior to getting started, ensure you have the following:
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
The following JSON display an example of the updated structure for a radio button field with the orientation
field included:
Take the following steps to configure the orientation
field:
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.
Add the orientation
property: Inside the field object, add a new property called orientation
.
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.
Save the changes: After making the necessary updates to the JSON structure, ensure that the changes are saved.
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.
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
JSON Structure Example
Here is an example of a form JSON structure utilizing 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.
Take the following steps to configure the layoutPreset
field:
Locate the structure
object in the JSON: Find the structure
key within the form’s JSON definition where the fields and layout are defined.
Add or modify the layoutPreset
field: Inside the structure
object, add a new property called layoutPreset
.
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:
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.
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.
fullWidth
FieldA 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.
fullWidth
Field in JSONTake the following steps to configure the fullWidth
field:
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"
.
Locate the desired form field: In the JSON structure, find the field you want to configure, such as an email or text field.
Add the fullWidth
field: Inside the form field object, add a new property called fullWidth
.
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:
Save the changes: After adding or modifying the fullWidth
field, save the updated JSON structure.
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.
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.
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.
A quick primer on how to include forms in a web page.
Our Github account hosts useful resources, including sample code to quick start your integrations.
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.
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.
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.
In the following GIF, you can see an example of differently customized experiences.
On a foundational level, the Email builder includes the capabilities detailed in the following table.
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.
To integrate the Email builder, take the following steps:
Obtain your Client ID and Client Secret
Authenticate
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.
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.
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:
Ensure that you have initialized the Beefree SDK and have a reference to the SDK instance (`bee`).
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:
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:
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:
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.
When configuring a builder application with Beefree SDK, you have four image and file storage options:
Beefree SDK Storage: Default option. Images are hosted in Beefree SDK’s AWS S3 bucket. Potential fees apply for usage beyond the included limits.
Existing Storage Application: Connect your builder to an existing storage application to share storage resources.
Own AWS S3 Bucket: Use your own AWS S3 bucket instead of Beefree SDK’s. Follow the documentation to configure this option.
Own File System: Integrate your application’s existing file system for storage. This option is available on Beefree SDK paid plans.
This feature is available on Beefree SDK only.
onChange is also the foundation on which the feature was built on.
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.
To enable changes tracking you need to add in :
An array of patches in the JSON Patch specification. JSON Patch is specified in from the IETF.
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. if you’re interested in learning more.
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 to add forms to popups
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.
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.
Use this method to provide a default form in the when the builder starts.
The Content Dialog feature is available on Beefree SDK only.
The resolve object in the handler function must return a form using the structure and parameters described in .
To take a look at real-world examples and samples, you can head to .
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.
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 .
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.
The Form block is available for the and the
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.
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.
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.).
Besides, end users can , when the “edit” action is available.
You can implement client-side validation in your JSON forms using the built-in , to validate things like:
Visit our to:
This feature is available on all and applies only to and builders.
Page builder or Popup builder application within your
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 .
When you create an application in the , 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 . All the documentation in this site applies to both products, except where noted.
All builders are available to Beefree SDK customers under the same . Please contact your Customer Success Manager for more details.
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.
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.
Note: Additional capabilities and features can be added on top of these through , toggle on options in the , , , , and more.
You do need a to experiment with the Email builder in this environment.
in the
within the Developer Console
Use the to and embed Beefree SDK
Visit to learn more about installing Beefree SDK.
When you create an application in the , you’ll have the option to create a File Manager application.
For those who are new to our platform, our documentation includes a comprehensive 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 Please contact your Customer Success Manager for more details.
Reference the to learn more about how to configure storage for your File manager application.
The stage where the end user drags and drops the content tiles and designs their email.
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
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.
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.
Users can customize Rows with Row properties. Customizable options include Backgrounds, Borders, Column Structure, and more.
Settings enable end users to apply general customization options to their email designs.
A few of the actions included with the email builder include:
Preview
Send test
Save as Template
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.
Important: Do not put your Beefree SDK credentials in client-side code.
The Beefree SDK system uses OAuth2 as the authorization framework.
The following code sample displays an example JSON response.
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.
The following code sample displays an example of how to call the Beefree SDK endpoint, obtain a token, and then start it.
Ensure to call the authorization endpoint server-side to protect your credentials.
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:
Obtain a new token via the new authorization endpoint.
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:
The following code example displays how to get the current JSON from the expiration error:
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.
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
The following code samples display how to handle the 5101 and 5102 errors.
Error management error 5101
Error management 5102
Example error response for unsupported media type Only Content-Type: application/json
is allowed.
Example error response for disabled apps. Contact support if you encounter this error.
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.
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
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:
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
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;
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:
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.
Please note that AMP content is not available for Page Builder.
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.
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.
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."
checked
(boolean): Specifies whether the checkbox is selected by default.
options
: An array of options, each with:
value
(string)
label
(string)
The color
field allows users to select a color from a color picker.
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.
The datalist
field provides a list of predefined options for other input fields, enhancing usability by offering suggestions.
No unique attributes.
options
: An array of options, each with:
value
(string)
The date
field allows users to select a date, displayed as a date picker.
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).
The datetime-local
field allows users to input both a date and a time.
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).
The email
field is used for inputting one or more email addresses.
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.
The file
field allows users to upload one or more files from their device.
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.
The hidden
field stores data that the user cannot see or interact with but is submitted with the form.
autocomplete
(string)
The image
field creates a graphical submit button using an image.
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).
The label
field associates a text label with a form control, improving accessibility.
No unique attributes.
The month
field allows users to select a month and year without choosing a specific day.
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.
The number
field allows users to input numeric values.
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.
The password
field allows users to input masked text (e.g., passwords).
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.
The radio
field allows users to select one option from a group.
checked
(boolean): Indicates whether the radio button is selected by default.
required
(boolean): Specifies that one option must be selected before form submission.
options
: An array of options, each with:
value
(string)
label
(string)
The range
field allows users to select a numeric value within a range, often displayed as a slider.
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).
The select
field creates a dropdown list that allows users to choose one or more options.
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.
options
: An array of options, either:
option
elements, with:
value
(string)
label
(string)
optgroup
elements, containing groups of options.
The search
field allows users to enter search queries with specialized input handling.
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.
The submit
field creates a button that submits the form data.
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.
The tel
field allows users to enter telephone numbers.
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.
The text
field allows users to input text.
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.
The textarea
field allows for multi-line text input, offering more space than the text
field.
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.
The time
field allows users to input a time (hours, minutes, and optionally seconds).
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).
The url
field is used for inputting valid URLs.
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.
The week
field allows users to select a specific week within a year.
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.
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.
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.
For performance reasons, you should use a dedicated bucket and place these folders in the root.
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
Take the following steps to configure Access keys in the Developer Console:
Navigate to the application you'd like to configure a custom S3 bucket for.
Click the Details button for that application.
Navigate to Application configuration and click View more.
You will be redirected to Storage options.
Toggle on Configure your own S3 storage system to enable the option.
Complete the required fields.*
Click the Test S3 settings button.
The following JSON is of the Permissions policy assigned to the AWS user.
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:
If "Custom URL" is set (e.g., https://my-cdn/
):
URLs will be generated like this:
Public Access:
For the generated URLs to work, the bucket’s permissions should allow public access to the files.
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.
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.
Take the following steps to enable the Move icon for your end users:
Navigate to the application you'd like to activate it for.
Click on the Details button.
Select the View more option located under Application configuration.
Navigate to the Services section.
Toggle on the Enable moving files between folders in file manager option.
The Move file option will automatically become available for your end users.
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:
Cancel: For this option, nothing will happen, and the operation will be stopped.
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."
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.
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:
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.
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.
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.
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.
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.
This is a description of the form fields and what information you will need to provide in each of them:
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
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
Note: If you change the custom URL, the new URL is immediately used for all images.
Example using single folders in the bucket root:
Example using single nested folders:
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.
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:
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
.
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.
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.
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.
You can create an additional subscription within the Beefree SDK Developer Console.
To achieve this, take the following steps:
Navigate to your dashboard
Click Add new subscription on the upper right-hand side of the screen
Type a name for your next subscription and click Next
Choose a plan and click Select plan
Confirm the plan you selected
Finalize your additional subscription
When you configure a builder application, you have four options for image & file storage:
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.
End users can upload images, PDFs, and other documents to the builder. For instance, they can link a button to download a PDF report.
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.
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.
If you are using your own AWS S3 bucket, take the following steps to activate the Move File feature:
Ensure that your FSP is updated to the latest version.
Locate the Move File configuration toggle.
Toggle the feature on.
The Move Feature will be available in your application.
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.
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:
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.
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.
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
No, this is not possible. You can either connect production apps included in the same subscription or dev apps included in the same subscription.
Learn more about injecting custom JS libraries into your Beefree SDK integration.
Custom JavaScript requires a complete technical evaluation by the Beefree SDK development team. The assessment will undergo security, technical and compatibility assessments.
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:
Our representative will forward your request to our development team
The development team will review the script and approve it
The script is enabled by our development team
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.
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.
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
The default configuration returned by the system can be extended by using additional configuration objects such as:
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:
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:
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.
You can load Merge Tags in the builder when it is initialized by adding a mergeTags
node to the JSON configuration file. For example:
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.
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.
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:
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.
Additionally, there are some other limitations that are specific to the Merge Content feature. Among them:
Users cannot see & edit the content: what’s in it, the style used, the layout, etc..
Not seeing it, they could select the wrong content from the list of available Merge Content.
The HTML might be created outside of Beefree SDK, which could lead to rendering issues when it’s inserted into the message.
Since the HTML is created elsewhere, and it’s not part of the document created by Beefree SDK, it must be managed separately.
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.
When this is active, adds a toggle to the toolbar that allows a user to simulate the current design in dark mode.
When this is active, advanced users of the builder can set an image as background when editing a row.
When this is active, advanced users of the builder can set a video as the background when editing a row.
Requires “Row background video” to be enabled.
Enables the possibility for users to upload videos.
Requires “Row background video” to be enabled.
Enables a user to search for free stock videos to use in the File Manager.
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.
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.
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.
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.
When enabled, an editor to apply image effects and transformations is available in the image module and row background images.
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.
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.
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.
The sanitization service allows the following tags and attributes:
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
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
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.
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.
Let’s start by looking at some of the differences between Page Builder and Popup Builder.
Content Width
HTML output
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.
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.
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!
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!
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:
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:
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.
Just head over to the “Popup Builder Application” section and click on Activate.
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.
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.
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.
Our Github account has some resources that might help you out when testing and integrating the Popup Builder.
Examples of different implementations and configurations that you can draw from to speed up your development.
A collection of ready-made templates that you can use right away and add to your application.
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.
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.
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.
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.
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:
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).
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.
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:
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.
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.
Sample content strings are not limited to the preview, but can be displayed in the editor’s stage as mentioned above.
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.
Use this method to replicate the behavior described for the standard toolbar.
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.
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.
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:
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.
The easiest implementation is to just pass a simple configuration at startup:
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.
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.
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:
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).
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.
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:
Click Details next to the application you want to configure
We recommend you first familiarize with Commenting in a Development or QA application
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:
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.
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”).
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.
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.
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.
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:
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:
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.
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:
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”.
When a thread or comment changes, the Beefree system triggers the onComment
callback. The callback returns the following details:
JSON contains all the details on the change
JSON array of the entire comments schema, as described in the previous section.
JSON contains the contributors
array with all users in a thread.
NEW_COMMENT
COMMENT_THREAD_RESOLVED
COMMENT_THREAD_REOPENED
COMMENT_EDITED
COMMENT_DELETED
JSON contains all the details of the change
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.
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.
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
.
The onComment
callback contains the comment’s id and a new section called “mentions” containing an array of mentioned users’ uid values.
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.
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.
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
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.
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:
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:
Open the message in the builder
Lock a row
Unlock one or more specific pieces of content within the row.
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:
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"
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.
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.
It’s all good until things scale up. For example…
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.
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:
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.
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:
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
The host application will display to the user a UI element to select or define a content item
When the selection is done, the host application closes the UI and passes it to the editor
The editor receives from the host application the selected content and exits waiting mode
The content is applied to the selected item
The same example applied to special links (link to a product) in a text selection:
The editor starts waiting mode
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.
The editor receives the link and exits waiting mode
The link is applied to the selected text
To set up content dialogs you will need to add the contentDialog
object to beeConfig
:
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:
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).
Defines the text displayed in the editor UI.
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.
The following code snippet displays and example of applying a link action.
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.
The following code snippet displays and example of applying a link with a delay.
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'.
The following code snippet displays and example of opening a dialog UI element.
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.
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 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.
Open your content dialog configuration file:
Locate the file where you configure your application's content dialog.
Add the contentDialog
object:
If it doesn't already exist, add the contentDialog
object into your configuration file.
Configure the mergeTags
property:
Inside the contentDialog
object, insert the mergeTags
property as shown below:
Define the handler function:
Within the handler
function, write your logic to dynamically insert values into the content.
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.
Test your implementation:
Validate that the merge tags are working correctly within the UI, ensuring that the dynamic values are properly inserted.
You can add a new action, available in the text toolbar, and associated with the merge tag element:
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
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.
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.
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.
Take the following steps to configure special links in your application:
Define a contentDialog
object within your configuration or settings file.
Add a specialLinks
property to the contentDialog
object.
Set the label
property to the desired name for your link, for example, 'Search a post link'.
Create a handler
function within the specialLinks
object where you will define the custom logic for handling the link.
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.
The following image shows an example action that applies to image or button content types.
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
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.
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.
Access the configuration file of your application.
Locate the contentDialog
object within the file.
Add a mergeContents
property to the contentDialog
object.
Inside the mergeContents
property, set a label
with the description you want to appear, such as 'Set up a new product recommendation'.
Implement a handler
function that will process your custom logic. This function should accept two parameters: resolve
and reject
.
Insert your specific code inside the handler
function where indicated.
Your configuration should look like the following:
The content dialog adds a button to the merge content list as shown in the following image.
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
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.
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.
To configure display conditions in your host application, take the following steps:
Define the contentDialog
Object: Start by defining an object called contentDialog
in your code. This object will hold the configuration for the display conditions.
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.
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":
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.
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.
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.
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.
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
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.
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.
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.
The following code snippet displays an example of how to configure custom row.
The content dialog adds a new item, using your text label, in the Rows drop-down:
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.
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.
This response will:
Create a new drop-down choice with the provided name
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:
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.
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:
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
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 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.
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 args
object in the handler function returns to the host application metadata already applied to the selected row.
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.
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
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.
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 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.).
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.
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 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.
The following code snippet displays an example of how to configure custom video.
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.
A reference of form fields that can be edited and that cannot 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.
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.
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.
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:
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.
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.
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.
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.
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!
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:
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.
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 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:
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.
Example:
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.
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.
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
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:
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:
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.
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:
This section will show samples of successful requests to FSP (File system provider) API. A response contains metadata about directory and files.
In this section, we define the following types of metadata:
The following table lists the fields, descriptions, types and examples for the FSP API response common meta.
The following table lists the fields, descriptions, notes and examples for the FSP API response file-specific meta.
The following table lists the fields, descriptions, notes and examples for the FSP API response directory-specific meta.
Description: Use this to list the directories within the File manager.
The following code shows an example request for listing directories.
The following code shows an example response for listing directories.
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.
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
Description: This response tells the user interface (UI) whether or not to show the move icon for files within the File manager.
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:
In the response of the listing endpoint, add a new field named can-move
within the extra
object for each file item.
The can-move
field has a boolean value indicating whether the file can be moved. You can set this value to true
or false
.
The following code shows an example request for listing directory content.
The following code snippet shows an example of the can-move
property set to true.
The following table shows the response metadata and its corresponding type and description.
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.
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.
Description: Use this when creating a new directory within the File manager.
The following code shows an example request for creating a new directory.
The following code shows an example response for creating a new directory.
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._- \(\)]+
Description: You can only delete empty directories. Use this to delete a directory when it is empty.
The following code shows an example request for deleting a directory.
The following code shows an example response for deleting a directory.
Description: Use this method when uploading a file to the File manager.
The following code shows an example request for uploading a file.
The following code shows an example response for uploading a file.
If an upload has a name conflict with an existing file in the target folder, the FSP must decide how to manage this conflict:
Return an Error: Notify the user about the conflict and do not proceed with the upload.
Ask the User: Prompt the user for instructions on how to handle the conflict.
Overwrite File: Replace the existing file with the new upload.
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:
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.
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}
.
Description: Use this to delete a file within the File manager.
The following code shows an example request for deleting a file.
The following code shows an example response for deleting a file.
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.
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.
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.
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
In case of errors, the API returns a JSON object structured like this:
Thumbnail generation is up to the developer of the file system provider.
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).
The Authorization Process is an important step throughout your . 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 requires the host application to pass a container parameter in the This is the only required parameters for the configuration.
The following code sample shows an example of this parameter in the .
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 . UID represents your user as described in .
Reference to learn more about UID.
Note: When a refreshable token expires, Beefree SDK receives a and attempts to refresh it automatically. 401 errors are expected and part of the process.
Once you obtain the token, the 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 on your page.
Example error response for an invalid UID. Look at the properties of .
Example error response for invalid credentials. Obtain your credentials using the .
To access server-side configurations, log into your and select the application that you wish to configure.
the Video block allows for video playback, either embedding a YouTube, YouTube Shorts, or Vimeo video or pointing to a hosted video (). Supported video formats are:
The method is available for all plans, including free
The method is available for paid plans only.
We currently provide an content block. After enabling the toggle, you will need to configure an .
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 to try out the attributes and learn more about their specifications.
The following sections list the unique attributes for each field type. Reference the to try out and learn more about unique attributes outlined in the subsequent sections.
Note: apply to each of the field types listed in the following sections.
Their name is restricted by .
This section discusses how you can configure your own custom S3 bucket within the , and also provides an example JSON of the Permission policy.
Prior to configuring your custom S3 bucket, ensure you configure Access keys in the .
Log in to the .
*The following image shows an example of the required fields within the for configuring your own S3 bucket:
Log in to the .
Once you have set up a compliant folder structure, you can use the form in the to connect your application. It’s one of the available server-side configurations for your Beefree application (Application details > Open configuration > Storage options).
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. .
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 and submit a support ticket.
Learn more about .
Log in to the
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.
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 .
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.
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 .
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.
Beefree SDK customers that exceed 50 GB of image data traffic on the Free plan in a given month will be moved to our .
Navigate to the .
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.
You can switch to or .
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.
This feature is available on the .
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 .
Please note that server-side configurations are only available on .
If you decide to go this route, use the to control the builder from your UI.
Use this to enable a custom top bar that allows the end user to .
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.
… 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 .
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).
… 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: .
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 .
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.
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.
Please note that server-side configurations are only available on .
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 .
For and .
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. .
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. .
More on
This will allow users to select a row in the current message and save it for later use. More .
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.
This feature allows users to leave comments and start discussion threads inside an email or page, to collaborate asynchronously. .
Learn more about for custom limitations on File manager.
This section provides the information you need to get started integrating in your SaaS applications. For more advanced settings, see .
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).
Continue to if you’d like to customize more than the position, background, and content area width.
When you log into the you can immediately see what type of applications you have already created under your Beefree SDK subscriptions.
Once created, head over to “Details” for all server-side configurations. Paid applications allow you to create child , to ease new feature testing, development, and maintenance.
Out-of-the-box, the setup and configuration are the same as . 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).
This feature is available on Beefree SDK only.
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 , the application immediately begins tracking changes. Behind the scenes, this is accomplished via a new callback event – – 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
The Undo option is available at the application level in the . 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 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 is not set in .
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.
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 .
After enabling Smart merge tags from your developer account, you need to apply a minor change to the merge tags’ .
The way to do this depends on how your integration manages the .
As with all the actions available in the toolbar, to control this option from your own UI:
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.
You can totally customize the UX of adding attributes by invoking a that will take over the editor’s UI. The dialog will need to return the attribute that needs to be applied.
The Commenting feature is available for .
Learn more about
If you subscribed to a Superpowers plan, and have 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 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 .
We’ve put together a that illustrates how to send email notifications, triggered by a mention in a comment. This code shows how to:
This feature is available on Beefree SDK only.
Using
Log into the and click on Manage roles under Application configuration for the selected application:
Please refer to for more details.
If you use in your builder application, then you can use additional user roles to control the access users have to creating and editing .
This feature is available on Beefree SDK only.
When designing a message or a landing page with Beefree’s editors, there might be cases in which users of your application insert a , add a link to an image, or apply a .
What if you have 400 merge tags? You can 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? is not the right fit.
And what if a needs to be built on-the-fly?
a text placeholder ()
a dynamic link or a link to specific content ()
a markup placeholder ()
a conditional statement ().
Is a function with a -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.
The above code snippet is an example of how to apply a .
Take the following steps to configure in your application:
A few of the most common use case for are the following:
Links can be applied to different . 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.
A few of the most common use case for are the following:
Important: To display the Dynamic content tile in the contents panel, you must configure in with at least one predefined item.
Of course, it can be edited in the editor like any other Display condition, if the user has the .
Reference our to learn more about managing the visibility of the Add Condition and Edit Condition buttons.
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.
The following code snippet displays an example of how to configure .
notPermittedDescription
: Description of the action when the button is hidden from the dedicated
The following code snippet displays an example of how to configure .
The Save rows content dialog is a mandatory step in the workflow.
The resolve
function must return metadata for the selected row. The section of the rows schema allows you to keep track of row-specific information.
This response will provide metadata that is added to the row in the asset (email, page, popup) before it’s provided through the .
Check the for further details on recommended metadata.
The following code snippet displays an example of how to configure .
The Content Dialog works the same way as the previous Content Dialog for – but in this case, the resolve
function should return the structure for the desired form.
To understand how this data is structured, refer to the on this website.
The following code snippet displays an example of how to configure .
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 .
The API uses JSON as the input and output data format: Responses are .
In the event a request fails, the API returns the error codes described in the .
User information is segmented by .
Ensure you save the username
, password
, and base URL
in the Configuration section of the .
Add a can-move
field in the extra
object in the . 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 for steps on how to complete this.
Implement a PATCH method for file URLs with conflict_strategy
management. Reference the for steps on how to complete this.
The final step in activating the 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.
The following response is the same as the . This is the response you will see in the event that a file was successfully moved to a new location.
To read the full list of possible errors, please refer to .
In case you don’t want to develop your own thumbnail generation procedure, you can use a service like to create a thumbnail URL.
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.
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.
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"
Allows the user to input an email address.
"example@email.com"
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"
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"
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)
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
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
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
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
.
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
You may now 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.
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.
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.
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
.
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.
The following image displays the Title and Description fields from within the page builder.
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:
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:
The following code snippet is an example of what the Meta Tags will look like inside the JSON.
The following image displays the Subject and Preheader fields from within the email builder.
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:
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:
The following code snippet is an example of what the Meta Tags will look like inside the JSON.
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.
Here is an example of what a language attribute inside Beefree SDK’s HTML output might look like:
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:
Display conditions allow anyone that is using the builder to easily create personalized messages without writing a line of code.
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.
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.
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.
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:
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
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
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.
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:
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.
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:
Here is an example of a custom builder of Display Conditions.
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:
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.
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 Beefree app after you’ve initialized it, they could be different each time the editor starts, and have different setups for different users.
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.
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;
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.
To set up the advanced permissions, you will need to add the advancedPermissions
object to beeConfig.
The following table provides the name, data type, description, and an example value for the first-level fields for advancedPermissions
.
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).
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.
All sidebar property widgets (e.g. width slider, alignment, color, etc.) accept the following basic permissions:
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.
All contents and rows (e.g. image module, video module, stage row, etc.) accept the following basic behaviors:
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.
The following code provides an example of the filePicker
object.
The following code provides an example of the linkTypes
object.
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.
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.
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.
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.
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.
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.
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.
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.
The table below outlines the configuration elements, their data types, descriptions, and default values for the behaviors object used in the icon configuration.
The table below outlines the configuration elements, their data types, descriptions, and default values for the properties object used in the icon configuration.
To successfully use this feature, follow these steps:
Identify the AddOn ID: Obtain the unique ID of the addon you wish to assign permissions to.
Define Custom Permissions: Based on the type of addon, assign relevant permissions in your configuration file.
Override Default Permissions: Specify advanced permissions for the addon, ensuring they override the default ones if needed.
Set Specific Behaviors: For row addons, include permissions for individual modules like image blocks inside the row addon.
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
.
The following code shows an example AddOn with the canViewSidebar
behavior set to true
.
The following code defines specific permissions and behaviors for different modules within a Row AddOn.
The following code shows an example config for how you can display or hide these buttons using advanced permissions.
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 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:
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
To display custom groups, the application must pass the groups settings in the configuration at initialization, like so:
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.
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.
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.
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.
The properties that make up a theme are divided into sections for clarity and easy of use.
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).
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.
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).
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).
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.
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).
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.
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.
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.
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.
The following parameters are all required.
The following shared parameter is required to start a co-editing session.
You pass this argument in the start instance method’s options parameter.
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.
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.
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.
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
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.
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, …
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).
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.
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.
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.
You can choose one of 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 and above. If you're on the Essentials plan, upgrade a for free to try this and other Core-level features.
The easiest method to override specific text labels is to , which contains the segments of the language file you want to override.
Check out our Github repository for in all supported languages.
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.
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 .
To activate this feature, the host application must add a specific element to the :
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.
Meta Tags are available for and .
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.
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.
Reference our to learn more about managing the visibility of the Add Condition and Edit Condition buttons.
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.
This feature is available on Beefree SDK only.
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 .
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.
The absolute flexibility of these permissions makes it easy to address specific needs, not achievable with the feature that is available in the Beefree SDK Console.
limit actions in the file manager (either the built-in one or your ) 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 . 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 .
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 and . 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.
You can choose to display or hide the "Add Condition" and "Edit Condition" buttons when using the with .
The following code snippet provides an example configuration for integrating the AddOn with advanced permission settings for managing access and permissions to Brand Tones:
You can find them in our
This feature is available on Beefree SDK only.
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.
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.
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.
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.
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.
Co-editing is available for Beefree SDK and plans:
You may override any of the default language strings using . The code block below contains the JSON required to replace all co-editing strings.
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
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
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 }
locked
boolean
true or false
show
boolean
true or false
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
canResetMobile
boolean
Indicates whether icons can reset to default settings on mobile devices.
false
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
username
string
The user’s display name
userColor
string
Hex color code (e.g. #FFFFFF)
shared
boolean
true or false
sessionId
string
globally unique id saved from onSessionStarted callback
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
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.
By setting up your Content defaults, you’ll be able to address styling and branding needs for you and your customers.
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.
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.
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):
To set up the content styles you will need to add the contentDefaults
object to beeConfig
:
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).
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.
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.
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 Parameters
borderRadius
String
30px
Defines the roundness of the image corners.
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 Parameters
The following table lists the row content default parameters and their corresponding descriptions and data types.
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.
columnsBackgroundColor
String
Yellow
Sets the background color for each column.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Additionally, listStyleType
supports the following: revert, auto, disc, circle, square, decimal, lower-alpha, upper-alpha, lower-roman, upper-roman.
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.
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.
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:
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:
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.
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.
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;
Extend Beefree SDK’s design flexibility and build mobile-first campaigns.
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.
Here is a video explaining why we built Mobile design mode and how it enhances the design UX of Beefree SDK.
If your application doesn’t have Mobile Design Mode enabled yet, you need to enable it. It takes just a few clicks:
Select the application you want to configure > Click Details
We recommend testing the feature first with a DEV or QA application
Go to Application Configuration > View More
Go to Services > Toggle Enable mobile design mode ON
Click Save on the top-right corner of the page.
Congrats! You’ve successfully enabled Mobile Design Mode!
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.
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.
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.
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.
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:
Users can click on the x to revert the property back to the desktop.
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.
All the edits performed in the Mobile Stage are tracked and flagged in the history as (Mobile) edits.
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.
type
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
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
Building upon the default tab configuration option, in Beefree SDK v3 you may also re-organize the way tabs are ordered.
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.
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.
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.
The AMP Carousel is OFF by default and you must first activate it in the Beefree SDK Console.
To do so:
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.
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:
If the workspace is loaded successfully, a onLoadWorkspace(workspace)
callback is triggered.
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.
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.
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.
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.
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.
The limit for the AMP version of an email, before being trimmed by Gmail clients, is 200Kb, up from 100Kb for HTML emails.
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.
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.
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.
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.
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.
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.
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:
Locate the application that you wish to work with, and click on Details
Locate the Content Services API section and click Create New API 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}
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.
All API access is over HTTPS, and accessed from the following URL:
https://api.getbee.io/v1/{collection}/{resource}
The following table lists the available collection option and corresponding resources for each collection.
The following table provides a few examples of URLs you can use to make specific types of requests.
The following section provides detailed information for each of the resources associated with each collection mentioned in the previous section.
URL: https://api.getbee.io/v1/{collection}/html
Endpoint: /message/plain-text
URL: https://api.getbee.io/v1/{collection}/pdf
URL: https://api.getbee.io/v1/{collection}/image
URL: https://api.getbee.io/v1/{collection}/merge
URL: https://api.getbee.io/v1/{collection}/merge-rows
URL: https://api.getbee.io/v1/{collection}/synced-rows
URL: https://api.getbee.io/v1/{collection}/merge/index
The resources in the AI collection accept your template JSON and use generative AI to return text within a JSON object to you.
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
v1/ai/metadata
v1/ai/sms
v1/ai/summary
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.
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.
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:
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.
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:
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.
Learn more about how to get started with the Content Services API in the following sections:
Learn more about how to activate cards style widgets and image rounded corners.
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 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.
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.
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
Take the steps outlined in this section to enable Image Rounded Corners and Cards Style Widgets.
This section discusses how to enable Image Rounded Corners.
To activate Image Rounded Corners, follow these steps:
Log in to your developer console
Navigate to your application
Enter your application's configurations
Navigate to the Enable image rounded corners toggle
Toggle it to on
This section discusses how to enable Cards Style.
Follow these steps to enable the Cards Style Widget for your application:
Log in to your developer console.
Navigate to your application.
Enter your application's configurations.
Find the Enable cards style widgets toggle.
Toggle it on.
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
.
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.
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.
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.
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.
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.
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.
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.
The API provides some useful services that offer additional message formats, reducing the development effort in the host application.
A dedicated endpoint that transforms an HTML into a PDF document and supports the following options:
Landscape and portrait as available values.
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.
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
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.
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.
To apply a style globally, take the following steps:
Prepare the Template: Ensure you have the JSON template ready, which is the foundation for your branding modifications.
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.
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.
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.
Include the API key in the request header as follows:
/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.
Example Request:
The following examples displays a button array.
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:
This section discusses the request formats for the different parameters.
The styles parameter in the request should follow this JSON format:
The template parameter should contain your template's JSON structure. Ensure that the JSON structure aligns with the template you intend to update.
The following code shows an example of how to configure the style for headers within the table content block:
For example:
The CSAPI Brand Style Management endpoint will take these styles and merge them with your design template, eliminating the need for complex manual editing.
While both Content Defaults and the Brand Style Management endpoint aim to streamline the design process, they serve different purposes:
Set default styles for specific content types.
Useful for quickly creating new templates with consistent styling.
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.
This feature is available on Beefree SDK only.
If you’ve customized how the editor looks like, either through or , you may want default content to adhere to the same style.
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.
Instantly display the results of – such as do not stack/reverse stack/hide on mobile;
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.
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 .
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.
loads different workspace types (currently used to handle ).
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.
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.
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.
Visit to learn more about what workspaces are and the additional workspaces you can use for 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 to your application. At that point, you may decide to switch to an AMP-compatible workspace, using the .
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 that limits the image types that can be loaded in the builder, it will reflect also on the AMP carousel.
Configure the ‘default’ workspace in the beeConfig document, so that AMP cannot be used (). As an alternative, if you don’t configure a workspace, the Beefree application will be loaded with the default workspace.
Your sending infrastructure must handle delivering an additional MIME type for AMP – this typically involves becoming an 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 .
Register with , (Yahoo) and as an authorized sender for dynamic emails, so that AMP emails will be rendered in the inbox of recipients who use these clients.
As a final step, fill out the . This is the only form they need to fill out to be allowlisted to send AMP emails for all supporting email clients.
Log into the
Acknowledge the message that reminds you that if you exceed the , you may be charged for overages and click Create Key
This feature is available on Beefree SDK only.
Unlike other premium features, fonts are part of the , so they can be defined each time the editor is started.
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.
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.
This feature is available for all . Available for Email Builder, Page Builder, and Popup Builder.
Reference the to learn more about how your application's end users can use this feature.
Reference the to learn more about how your application's end users can use this feature.
Visit the page to learn more about these configurations.
Visit the to learn more about these configurations.
This feature is available on Beefree SDK only.
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.
This service allows the host application to build a custom workflow that doesn’t rely on the onSave
callback in the editor (). Check our .
PDF is often used in most approval processes, but is also a perfect format for printers. Check our .
Check our .
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.
Manage Brand Styles: Begin by defining your brand's styles within the schema. The Brand Style Management endpoint schema mirrors the . 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.
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 .
The following section displays an example request. Note that the syntax for the CSAPI Brand Style Management endpoint is similar to the .
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 .
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 .
Both the (frontend) and Brand Style Management endpoint (backend) include the table content block.
The Brand Style Management endpoint schema is designed to be user-friendly and intuitive. You can use the same you used to style your application’s frontend with the Brand Style Management endpoint.
Can be a part of the .
/message
html
, pdf
, images
, merge
, index, plain-text
/page
html
, pdf
, images
, merge
, index
/popup
html
/amp
html
/template
brand
/ai
metadata
, sms
, summary
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
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:
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.
A classnames change log where you can reference current and past changes to CSS classes.
Learn more about AddOn options within Beefree SDK and how you can use them to offer your end users extended features and functionality.
Essentials
Core
Superpowers
Enterprise
Superpowers
Enterprise
Learn more about Custom AddOns, and how to develop and implement your own custom built AddOn.
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.
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.
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:
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
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.
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.
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.
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.
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.
For the best possible results, please follow these best practices:
Avoid using generic global styles. (e.g. *, p, input, etc.) that could propagate to the editing stage.
Use CSS selectors to select specific elements and groups (e.g. body.bee–cs h3).
Do not attempt to pass JavaScript or any other scripts via CSS.
Ensure the custom CSS URL is hosted over HTTPS.
Do not link to CSS files hosted on GitHub, or by any 3rd party.
Never style elements on the stage, since those styles will not appear in the final HTML, and therefore lead to a confusing user experience.
Please note that classnames with the --cs
suffix are reliable selectors for customCSS.
Other selectors such as the following should be avoided as much as possible:
Nested tag structure (e.g. div > div > div
)
Siblings (input + label
)
Classnames without –cs (e.g. .icons__item)
Prefixed classname selectors (e.g. div[class^="StageModuleIcons_itemRow"]
)
Reference the following Sample Custom CSS Theme to see an example of how you can use custom CSS in your web application.
Radiogroups in the context of our web application refer to a UI component that groups together a set of radio buttons, allowing users to select one option from multiple choices. Each radiogroup is associated with specific classnames that define the appearance and behavior of the grouped buttons within the sidebar's layout. These classnames, such as radiogroup--cs
and radiogroup-button--cs
, are crucial for ensuring consistent and functional navigation in your application's user interface.
This section will cover widget classnames for content in the sidebar. This section will list the classnames for the following sidebar tabs:
This section lists the classnames for widgets and content within the row area of the sidebar.
This section lists the classnames for widgets and content within the Row & Content area of the sidebar.
This section lists the classnames for widgets and content within the Content area of the sidebar.
This section lists the classnames for widgets and content within the Settings area of the sidebar.
Content Area Alight
This section covers classnames for the column structure widget.
This section discusses and lists the various CSS classnames relevant to the application's sidebar widgets where textual input is required. These classnames facilitate the styling and functional integration of widgets such as URLs, images, alt texts, and more, providing a comprehensive guide for developers to enhance the user interface effectively.
This section will cover button classnames for the following sidebar areas:
This section lists the classnames for widgets within the Content tab.
This section lists the classnames for widgets within the Rows tab.
This section lists the classnames for widgets within the Settings tab.
The various classnames and data-qa
attributes associated with entities within the application that feature sliders. These identifiers are crucial for styling and testing purposes, tailored to different areas like Add-On, Button, Form, and Image entities where sliders are a key component.
This section will cover button classnames for the following sidebar areas:
This section lists the classnames for sliders within the Content tab.
This section lists the classnames for sliders within the Settings tab.
Learn more about AddOns at a high-level.
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.
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.
To add your own content tiles to the Content tab in a Beefree editor, you will need to develop a Custom AddOn.
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.
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.
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.
For setup, please reach out to support@interactiveoffers.com, 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.
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.
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.
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.
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.
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.
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.
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.
Learn more about how to get started with the Template Catalog API in this section.
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.
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.
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:
All API access is over HTTPS, and accessed from the following URL:
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.
To enhance the performance and user experience of your template catalog, we recommend following these best practices.
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.
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
.
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.
The following table displays the headers you need to complete your API request.
/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.
The following table displays a list of request parameters.
The following code displays a sample request.
The following code displays a sample response.
/v1/catalog/templates/:slug
HTTP Method: GET
Description: Fetch a single template identified by its slug (in the URL).
The following code displays a sample request.
The following code displays a sample response.
/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.
The following table displays request parameters.
The following code displays a sample request.
The following code displays a sample response.
/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.
The following code displays a sample request.
The following code displays a sample response.
/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.
The following table displays request parameters.
The following code displays a sample request.
The following code displays a sample response.
/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.
The following code displays a sample request.
The following code displays a sample response.
/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.
The following table displays request parameters.
The following code displays a sample request.
The following code displays a sample response.
/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.
The following code displays a sample request.
The following code displays a sample response.
/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.
The following table displays request parameters.
The following code displays a sample request.
The following code displays a sample response.
Find answers to common queries related to the Template Catalog API, its features, and integration.
No, they are included in your subscription. The catalog will be updated with the latest trends at no extra charge.
We are committed to making fresh new templates available every quarter.
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.
No, API calls made to the Template Catalog do not contribute to the total CSAPI count.
Learn more about Partner AddOns that are available within the Beefree SDK Developer Console, and how to integrate them into your application.
Take the following steps to access the Partner AddOns Marketplace:
Navigate to the application you'd like to add a Partner AddOn to.
Click on the Details button.
Navigate to AddOns and click View more.
You'll be redirected to the AddOns page.
Click on the Browse AddOns button.
You'll be redirected to the Marketplace with the available AddOns.
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.
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:
It displays when the AddOn is added to the editing stage and invites the user to take the next step.
When the AddOn content is selected, the same button is displayed in the content properties.
Learn more about how to contribute your Custom AddOn as a Partner AddOn in Beefree SDK's Partner AddOns Marketplace.
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.
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.
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:
You have built an AddOn that:
Uses the optional health check endpoint
You have thoroughly tested the AddOn before submitting it to our test for a final review.
You have a demo of the AddOn that we can access.
Automatically translate content for different language templates using the DeepL addOn.
The following content types qualify as translatable content:
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.
This section discusses the prerequisites and steps you need to take to get started with this feature.
Ensure the Multi-language templates feature is toggled on inside of the Developer Console.
Take the following steps to activate this feature:
Navigate to the application you'd like install the addOn in.
Provide the requested details.
Save your changes.
The following code sample displays an example of the templateLanguageAutoTranslation
, templateLanguage
, and templateLanguages
parameters.
If you have a custom top bar in your application, take the following additional steps:
Describe how to translate a template:
translateTemplate
→ bee.translateTemplate({ language: 'it-IT' })
Describe how to reset a translation:
resetTemplateTranslation
→ bee.resetTemplateTranslation({ language: 'it-IT' })
A function to translate the template to a specified language using the Beefree SDK.
React Translate a Template example
JavaScript Translate a Template example
HTML example
A function to reset the translation of the template to its original state using Beefree SDK.
React Reset a Translation example
Reset a Translation JavaScript example
HTML example
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.
Beefree SDK includes and 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 .
There are two types of AddOns: and . Partner AddOns can easily be integrated with your application in a matter of minutes by installing them inside of the . They are available for the following :
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 :
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.
Custom AddOns are an advanced feature. As a result, the feature is available on the following :
Create a .
Log into the 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.
Refer to the for all the details on building your addon.
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.
If you're looking to hide certain UI elements, we recommend you first check if that can be accomplished with , as it may be easier to implement.
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.
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.
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.
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 .
Here is how you can locate and :
Access the directory from within the , from the Details page of any application that you have created.
For more, see .
These AddOns need to be . Some of them are offered by third-party providers, and they might require an active subscription with those providers in order to be used.
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 , this AddOn employs the same entry points as the , allowing full control over the AI experience within your application. Once your Custom AI Writing Assistant AddOn is fully configured, the displays the modal you created within the user interface when end users click the Write with AI button in the sidebar.
|
| |
Through this AddOn and , 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.
| |
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 or as providers for this feature, our AddOn is quick and simple to integrate.
| |
| |
| | |
| | | |
| |
| | |
| | |
| | |
| | |
This feature is available for purchase with the Core plan and included at no extra cost with the . 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.
For additional information, you can refer to .
Partner AddOns are available for .
Partner AddOns can easily be integrated with your application in a matter of minutes by installing them inside of the . You can reference available Partner AddOns inside of the . 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 .
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 .
You can find the Partner AddOns Marketplace within the .
Log in to your .
Note: Partner AddOns are very intutive and quick to install. For steps on how to install a Partner AddOn, navigate to .
Once you successfully install a Partner AddOn following the steps outlined in , 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.
Visit our for a list of available and upcoming AddOns.
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.
You will instead click on Create a Custom AddOn if you want to for Beefree SDK.
Visit our to learn more about how to configure custom and partner addons.
Partner AddOns can easily be integrated with your application in a matter of minutes by installing them inside of the . You can reference available Partner AddOns inside of the . 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 . 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.
To get started, you will need to follow the documentation and create a Custom AddOn for a web application that has embedded Beefree SDK.
You have signed the Beefree SDK AddOn License and Distribution Agreement. Contact your Account Manager or log in to the and submit a ticket for details.
Uses the External iFrame Method (see )
When you have completed all of the above, contact your Account Manager or log in to the and submit a ticket to complete the review and approval process.
The DeepL AddOn is only available for and plans.
The new addOn available in the empowers your end users to translate all the translatable content within their designs using the new translate button. This feature requires that you have 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 different language versions of their designs. Also, now your end users can have up to six different language versions of their designs. Visit the to learn more about how this feature works for your application's end users.
Note: DeepL offers a for their plans. You can obtain an for free to get started with this feature.
Log in to the .
Install the addOn.
Activate this feature by adding the new templateLanguageAutoTranslation
and setting it to true
.
NA
btn
btn-primary
add-on-sidebar-button--cs
NA
btn-primary
BeeButton_*
ai-sidebar-icon--cs
Special links
href-container__link
href-container__link--special-link
href-special-link--cs
Link file
href-container__link
href-container__link--link-file
href-link-file--cs
Add custom special link
href-container__link
href-container__link--special-link
href-custom-special-link--cs
Add new attribute
btn
btn-primary
icon-manager__add-icon
icon-manager__add-icon--cs
BeeButton_*
toggle-menu-button--cs
Delete
field-remove
delete-attribute--cs
NA
btn
btn-primary
icon-manager__add-icon
BeeButton_*
icon-manager__add-icon--cs
Change image
NA
carousel-item-change-image--cs
Delete
NA
carousel-item-delete-image--cs
NA
btn
btn-primary
BeeButton_*
select-merge-content--cs
NA
NA
content-dialog-button--cs
Edit
field-edit
form-field-edit--cs
Delete
field-remove
form-field-delete--cs
Add new field
btn
btn-primary
icon-manager__add-icon
icon-manager__add-icon--cs
BeeButton_*
toggle-menu-button--cs
NA
btn-primary
BeeButton_*
ai-sidebar-icon--cs
Button
btn
btn-primary
icon-manager__add-icon
icon-manager__add-icon--cs
BeeButton_*
icons-add-icon--cs
Change image
btn-primary
BeeButton_*
BeeIcons_*
icons-change-icon--cs
Apply effects
btn-default
BeeButton_*
BeeIcons_*
icons-edit-icon--cs
Delete
BeeButton_*
BeeIcons_*
icons-delete-icon--cs
NA
btn
btn-image-editor
btn-default
BeeButton_*
btn-image-editor--cs
NA
btn
btn-file-picker
btn-secondary
BeeButton_*
btn-file-picker--cs
Special links
href-container__link
href-container__link--special-link
href-special-link--cs
Link file
href-container__link
href-container__link--link-file
href-link-file--cs
Add custom special link
href-container__link
href-container__link--special-link
href-custom-special-link--cs
Add new attribute
btn
btn-primary
icon-manager__add-icon
icon-manager__add-icon--cs
BeeButton_*
toggle-menu-button--cs
Delete
field-remove
delete-attribute--cs
NA
btn
BeeButton_beeButton*
ai-sidebar-icon--cs
NA
btn
btn-primary
icon-manager__add-icon
icon-manager__add-icon--cs
BeeButton_*
menu-items-add-button--cs
Delete
BeeButton_*
BeeMenuItems_*
menu-items-delete-button--cs
Link file
href-container__link
href-container__link--link-file
href-link-file--cs
NA
btn-primary
BeeButton_beeButton*
ai-sidebar-icon--cs
Button
btn
btn-primary
icon-manager__add-icon
icon-manager__add-icon--cs
BeeButton_*
social-add-icon--cs
Delete
icon-remove
icon-remove--cs
Change image
btn-primary
BeeButton_*
BeeSocialIcons_*
social-change-icon--cs
Apply effects
btn-default
BeeButton_*
BeeSocialIcons_*
social-edit-icon--cs
Choose image
btn
btn-file-picker
btn-secondary
btn-primary
BeeButton_*
btn-file-picker--cs
Change video
btn
btn-file-picker
btn-primary
BeeButton_*
btn-file-picker--cs
Select condition
btn
btn-primary
BeeButton_*
row-display-condition-select-button--cs
Add condition
btn-default
BeeButton_*
row-display-condition-add-button--cs
Edit condition
btn-default
BeeButton_*
row-display-condition-edit-button--cs
Open builder
btn
btn-primary
BeeButton_*
row-display-condition-builder-button--cs
Add new
column-manager--add
BeeButton_*
column-manager-add--cs
Delete
column-manager--delete
BeeButton_*
column-manager-delete--cs
Add favicon
btn
btn-primary
icon-manager__add-icon
icon-manager__add-icon--cs
BeeButton_*
favicon-add-icon--cs
Change favicon
btn-primary
BeeButton_*
favicon-change--cs
Delete
BeeButton_*
favicon-delete--cs
NA
NA
radiogroup--cs
radiogroup-button--cs
active--cs
NA
tgl-container
tgl-container--cs
btn-group
number-selector
number-selector--cs
tgl_bgd
active
btn
multiToggle_option_background-toggle-content-area
multiToggle_option_background-toggle-row
btn-primary
tgl-label
radiogroup--cs
radiogroup-button--cs
active--cs
Button
Carousel
Divider
Form
Heading
Html
Icons
Image
List
Menu
Dynamic
Content
Paragraph
Social
Spacer
Text
Video
hide-on-mobile__desktop
hide-on-mobile__mobile
btn-primary
hideOn-confirm-modal-icon--cs
radiogroup--cs
radiogroup-button--cs
active--cs
confirm-modal-icon--cs
Button
Divider
Form
Heading
Html
Icons
Image
List
Dynamic
Content
Paragraph
Social
Spacer
Text
Video
hide-on-amp__amp
hide-on-amp__html
btn
radiogroup--cs
radiogroup-button--cs
active--cs
Button
Form
Form Label Options
Form Button Options
Heading
Icons
Image
Menu
Paragraph
Social
Divider
item_1-2
widget__label
btn
btn-default
align-left
active
btn-align-left
btn-align-right
btn-align-center
btn-align-justify
radiogroup--cs
radiogroup-button--cs
active--cs
Button
Form Label Options
Heading
Paragraph
List
Text
item_1-2
widget__label
active
btn-line-height--120
btn-line-height--150
btn-line-height--180
btn-line-height--200
radiogroup--cs
radiogroup-button--cs
active--cs
List
icon-toggle
icon-toggle--cs
icon-toggle-item
icon-toggle-item--cs
icon-toggle-item--active
radiogroup--cs
radiogroup-button--cs
active--cs
Form Label Options
tgl-container
tgl-container--cs
item_1-2
widget__label
btn-group
number-selector
number-selector--cs
tgl_bgd
active
btn
multiToggle_option_descriptor_form_style_labels_label-position_0
multiToggle_option_descriptor_form_style_labels_label-position_1
btn-primary
static-label
tgl-label
radiogroup--cs
radiogroup-button--cs
active--cs
Button
Heading
List
Paragraph
paragraph-item
paragraph-item--active
radiogroup--cs
radiogroup-button--cs
active--cs
Dynamic Content
item_1-2
widget__label
radio-button
radio-button__radio
radiogroup--cs
radiogroup-button--cs
active--cs
NA
tgl-container
tgl-container--cs
item_1-2
widget__label
btn-group
number-selector
number-selector--cs
tgl_bgd
active
btn
multiToggle_option_content_computedStyle_align_0
multiToggle_option_content_computedStyle_align_1
btn-primary static-label
tgl-label
radiogroup--cs
radiogroup-button--cs
active--cs
Rows
PanelGroup_handle*
panel-group-dragging--cs
column-manager-delete--cs
column-manager-add--cs
panel-divider--cs
Form - Label
tgl-container
tgl-container--cs
item_1-2
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
multi-toggle--cs
multi-toggle-btns--cs
toggle-btn-pressed--cs
Form - Button
title_icon
icon-organizer__panel
panel__icon-preview-wrapper
panel__title
comp-tree-placeholder
multi-toggle--cs
multi-toggle-btns--cs
toggle-btn-pressed--cs
Social
item_1-2
widget__label
title_icon
icon-organizer__panel
panel__icon-preview-wrapper
panel__title
comp-tree-placeholder
social-collection-list--cs
panel__title--cs
Icons
item_1-2
widget__label
icon-organizer__panel
panel__icon-preview-wrapper
panel__title
comp-tree-placeholder
icons-collection-list--cs
panel__title--cs
URL
number-selector--cs
input-image-url
item_1-2
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Alt Text
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Dynamic Image > Dynamic URL
number-selector--cs
alternate-text--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox btn
input-text--cs input
text-boxed--cs
dynamic-image-url--cs
Web page > URL
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Send email > Mail to
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Send email > Subject
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Send email > Body
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Tel > Tel
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Send SMS> Tel
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Send SMS > Message
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Attributes
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
URL
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Title
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Item > Title
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Item > Alt text
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Item > URL
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Item > Image URL
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Item > Alt text
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Item > Icon Text
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Item > Title
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Field label
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Block identifier
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Row background image
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Row background video
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Row background image
number-selector--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
Title
number-selector--cs
alternate-txt--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
page-metadata-title--cs
Description
number-selector--cs
alternate-txt--cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
page-metadata-description--cs
Subject
number-selector--cs
alternate-text--cs
item_1-2
widget__textbox
widget__label
widget__label--textboxbtn
input-text--cs
input-text-boxed--cs
page-metadata-subject--cs
Preheader
number-selector--cs
alternate-txt-cs
item_1-2
widget__textbox
widget__label
widget__label--textbox
btn
input-text--cs
input-text-boxed--cs
page-metadata-preheader-cs
Add-On (Image)
Width
BeeImageWidth_*
BeeWidthSlider_*
rc-slider*
slider--cs
slider-wrapper--cs
slider-btn
data-qa was moved from a div to the actual input element
Button
Width
BeeImageWidth_*
BeeWidthSlider_*
rc-slider*
slider--cs
slider-wrapper--cs
slider-btn
data-qa was moved from a div to the actual input element
Form
Width
Button Width
BeeWidthSlider_*
rc-slider*
widget-BeeImageWidth
slider--cs
slider-wrapper--cs
slider-btn
data-qa was moved from a div to the actual input element
Image
Width
BeeImageWidth_*
BeeWidthSlider_*
rc-slider*
slider--cs
slider-wrapper--cs
slider-btn
data-qa was moved from a div to the actual input element
Content Area Width
BeeWidthSlider_*
rc-slider*
slider--cs
slider-wrapper--cs
slider-btn
data-qa was moved from a div to the actual input element
https://api.getbee.io/v1/catalog/templates/?{parameter}={value}
Content-type
application/json
Authorization
Bearer{{key}}
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
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
pagesize
int
Set the item number per page
pagesize
int
Set the item number per page
pagesize
int
Set the item number per page
pagesize
int
Set the item number per page
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
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]
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:
Essentials
15,000
$0.01
Core
50,000
$0.01
Superpowers
250,000
$0.003
Enterprise
Custom
Custom
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*
Billing statement changes: you will see new line items on your Beefree SDK invoice.
An additional charge, CSAPI, will be added to your current subscription plan invoice.
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.
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
Welcome to the Beefree SDK AddOn development documentation!
This document is for anyone that wants to start creating AddOns for Beefree SDK users.
Happy coding!
Create a development application
Request an upgrade
Once you have a development application on the Superpowers plan or above, proceed to the next step.
If you have not done so yet, create a development app as indicated above
Click the Details link next to any application on the Superpowers plan or above
Click the AddOns link, under Application configuration
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.
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.
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.
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.
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.
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: Will insert an HTML module on the stage, and show the properties of a custom HTML content block in the sidebar, except the HTML text input will be hidden. That’s because the HTML cannot be edited outside of the content dialog or iframe made available 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 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:
The host application should return a valid response as the parameter of the “resolve” callback.
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:
If the response is not valid, an error is raised, and onError
is called.
For each module type, here is the list of allowed properties.
Unless otherwise specified, the properties are optional.
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.
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.
title
String
No
text
String
Yes
align
String
No
size
Integer
No
bold
Boolean
No
color
String
No
linkColor
String
No
The following sample code defines an image element with various attributes.
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.
alt
String
Yes
href
String (URL)
Yes
src
String (URL)
Yes
dynamicSrc
String (URL)
No
target
String
No
The following sample code defines a button element with various attributes.
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.
label
String
Yes
href
String
No
target
String
No
color
String
No
background-color
String
No
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.
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.
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
The following sample code defines an HTML element with various attributes.
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.
html
String (HTML content)
Yes
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.
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.
items
Array of objects
Yes
text
String
No
link
Object
No
title
String
No
href
String (URL)
No
target
String
No
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.
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.
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
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.
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.
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
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:
The host application should return a valid response as the parameter of the “resolve” callback.
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:
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.
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.
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:
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:
The application inside the iframe may trigger the following actions:
onCancel
onSave
The application inside of the iframe may listen for the following events:
loaded
init
load
The Beefree app creates an iframe for the AddOn and then expects it to start the conversation by sending the loaded action:
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.
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:
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:
Any further action is then on the AddOn. In case the user cancels the edit, it is expected to send an onCancel message:
And if the user finishes editing and clicks on the save (or OK) button, the AddOn is expected to send an onSave message:
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.
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.
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.
With authentication enabled, a specific protocol follows:
Before the Beefree app creates an iframe for the AddOn, it performs a proxied GET request to the authentication URL.
The following HTTP Headers are passed to the AddOn’s endpoint.
x-real-ip: The IP Address of the host application
authorization: It contains the API Key (e.g. bearer token), which you provided to the host application.
x-bee-clientid: It contains the client id of the host application.
x-bee-uid: It contains the uid defined in the BEE configuration.
The iframe application uses the Authorization Header to validate the user permissions.
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.
In the event of unauthorized, the application returns a 403 status code.
The Beefree app creates an iframe for the AddOn using the URL returned from the authorization endpoint.
The AddOn application loads the application or performs additional authentication.
The AddOn section of the configuration allows you to override the parameters you configured at the application level, on a per-user basis.
Learn more about how to configure and use our Azure AI Vision - Image Analysis AddOn.
Read this technical documentation to learn more about how to configure bulk Alt text generation with AI.
Prior to configuring this feature, ensure that you have the following:
Superpowers or Enterprise account
Enabled Azure Vision AddOn in your Developer Console
If you have a default alt text set, the image won't be included among the ones that need an AI-generated alt text. If you have a default value set in your defaultContents
, this will require the end user to delete the default text before being able to generate the new alt text with AI. To avoid this behavior, and for this feature to work best, we recommend you do not set a default value for alt text in your beeConfig
.
If you do have a default value set, you can delete it one of the following ways:
Set the alt property as an empty string
Delete the line of code from your defaultContents
The following code shows an example of the alt
property within the defaultContents
. In the scenario presented in the following code, we recommend deleting the Default alt
value set within the alt
property.
The following code shows an example of the alt
property set as an empty string. This is how we recommend you set your code for this feature to work best.
Note: You can still use the defaultContents
alt
value and the AI-generated Alt text in Bulk at the same time. However, it will require the end user to delete the default alt text prior to using the AI-generation tool for that particular image module.
The type of images they can create alt-text for are the following:
Images
Stickers
Icons
GIFs
Custom AddOn Images
This feature is not compatible with Multi-language Templates, and is currently only available in English.
If you experience any issues with setting up this AddOn, take the following measures to troubleshoot your configuration:
Ensure your Azure API key is connected correctly within your Beefree SDK Developer Console.
Ensure your custom endpoint is set up correctly in the SDK console.
As you configure this feature, ensure you consider the following:
Use this AddOn to enable the AI Writing Assistant for your end users. This AddOn allows users to generate text within their designs using AI, helping them complete their designs faster and more efficiently. This AddOn integrates with OpenAI or Azure OpenAI as the providers for this feature.
With this feature, your end users will see a “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. This AddOn is quick and simple to integrate.
The following image provides an example of how the AI Writing Assistant looks to your end user:
Azure OpenAI or OpenAI account and credentials
AI Writing Assistant AddOn enabled in the developer console
Take the following steps to switch providers:
Log in to the Beefree SDK Developer Console.
Navigate to the application you'd like to use.
Navigate to the application's AddOns section.
Click on the Edit button for the AI Writing Assistant AddOn .
Click Manage providers.
Click Add provider.
Complete the required information*.
Click Save.
*The following information is required for each provider.
Name
API Key
Name
API Key
URL Provider
Deployment ID
When managing your providers, you will have the following options:
Edit
Deactivate
Delete
Azure OpenAI and OpenAI are the only provider options for the AI Writing Assistant.
Cognitive Vision is the provider for the Alt text generation with AI feature.
In certain scenarios, you may find the need to personalize both the user interface (UI) and the operational features of the AI Writing Assistant AddOn. This is particularly applicable when you want to achieve objectives such as:
Controlling Access to the Prompt: You might want to limit who can access and manipulate the prompt. In a shared environment, for instance, you may want to restrict certain users from altering the prompt, which is crucial for maintaining consistency and avoiding unwanted changes.
Enabling Per User or Per Content Type: You might want to limit who can access the AI so you can up-sell the feature to end-users. Or, you may only want to enable the AI capability for specific content types, such as paragraphs vs. buttons.
Disabling Automatic Suggestions: The AI Writing Assistant AddOn can generate automatic suggestions at the prompt, which may not always be desirable. In such cases, you might want to disable this feature to have more control over the input and output at the prompt.
We’ll cover all of these scenarios in the following sections as we discuss the settings and configuration options available for developers.
Currently, the following settings are supported:
tokensAvailable
number
tokensUsed
number
tokenLabel
string
isPromptDisabled
boolean
Set to true to lock the prompt. The chat interface will be disabled but allow previous answers to be applied.
isSuggestionsDisabled
boolean
Set to true to hide the suggestions popup. Set this to false
to disable the prompt presets.
isUpsellEnabled
boolean
metadataGeneration
boolean
submitOnEnterKey
boolean
This boolean is set to false
by default. If you change it to true
, it enables submitting the prompt by hitting the Enter button on the keyboard.
With each prompt response, the addon will report the usage data provided by Azure OpenAI or OpenAI API via the editor’s onInfo
callback without storing or tracking the data.
You can also monitor when the user applies a prompt response.
You may choose to track the end-user’s total usage through the aforementioned onInfo
callback if desired. Additionally, you may choose to show the usage data to the user via the built-in display widget. To activate the display usage widget, provide the usage data via the addon settings. Since the editor doesn’t track usage, you’ll need to refresh the values via the bee.loadConfig
method to keep the display widget data current.
See below for an example of how the UI will render when provided with the optional display usage widget.
To enable the AI Writing Assistant AddOn, but disable the prompt per user, pass the isPromptDisabled
boolean parameter as true
.
The following example will disable the prompts for the user with an uid
of inactive-user
.
To disable the AI Writing Assistant AddOn for a particular user, use the following configuration. Ensure the enabled
parameter is set to false
. To turn the AddOn back on for a user, edit the parameter to true
.
The AI Writing Assistant AddOn is available for the following content blocks:
Title
Paragraph
List
Button
You may utilize the Advanced Permissions configuration to disable AI Writing Assistant AddOn per content type.
The following example will disable the addon for the paragraph block:
The AI Writing Assistant AddOn includes preset prompt suggestions to facilitate the content creation process. These appear after the initial draft of your text has been formulated and whenever further refinement is needed. Please note that this function applies only when editing existing text through the AI prompt. The suggestions will not appear for placeholder text.
Here’s a simplified step-by-step guide on how to use suggestions, as shown below:
Start with your draft text added to the design area.
If you desire to adjust the tone to be more formal, for example, click on the paragraph, list, title, or button you want to modify.
Navigate to the ‘Write with AI’ option.
Click on the area designated for adding prompts.
You’ll notice the prompt suggestions popup.
Select the ‘Make it [desired tone]’ option, making sure to replace [desired tone] with a value (e.g., funny)
Click ‘Generate’.
The AI will then generate a revised version of your content, matching the tone you entered.
Below are the preset prompt suggestions we have identified for the different content tiles, along with their corresponding translation key, in case you’d like to revise the prompt through our custom languages feature.
Spell-check the content
mailup-bee-common-component-ai.suggest-check-spelling
Correct grammar mistakes in the content
mailup-bee-common-component-ai.correct-grammar
Translate content to [language]
mailup-bee-common-component-ai.translate
Make it [tone] without changing the format
mailup-bee-common-component-ai.adjust-tone
Use Active Voice
mailup-bee-common-component-ai.use-active-voice
Summarize the content
mailup-bee-common-component-ai.summarize-text
Convert the content to the third person without changing the format
mailup-bee-common-component-ai.convert-third-person
Translate content to [language]
mailup-bee-common-component-ai.translate
Make it [tone]
mailup-bee-common-component-ai.make-it-tone
Use Active Voice
mailup-bee-common-component-ai.use-active-voice
Spell-check the content
mailup-bee-common-component-ai.suggest-check-spelling
Correct grammar mistakes and return the content
mailup-bee-common-component-ai.correct-grammar-list
Translate content to [language]
mailup-bee-common-component-ai.translate
Make it [tone] without changing the format
mailup-bee-common-component-ai.adjust-tone
Use Active Voice
mailup-bee-common-component-ai.use-active-voice
Capitalize all letters
mailup-bee-common-component-ai.capitalize-text
Capitalize the first letter of each word
mailup-bee-common-component-ai.capitalize-all-words
Make it [number] words long
mailup-bee-common-component-ai.characters-length
Make it [tone] without changing the format
mailup-bee-common-component-ai.adjust-tone
Translate it to [language]
mailup-bee-common-component-ai.translate-heading
Prior to configuring the AI Writing Assistant AddOn, consider the following:
Scrolling behavior
This section will discuss how to manage an odd scrolling behavior related to the AI Writing Assistant AddOn. At times, the AI Writing Assistant side panel opens and requires the end user to scroll down to reach the prompting area.
The following image shows an example of this behavior:
If you encounter this behavior, take the following steps to avoid the need for scrolling to access the prompting area:
Navigate to your CSS code.
Change the height of your container using the calc()
function as shown in the following examples:
This sets the height of the element to be the full height of its parent (100%
) minus 100px
, which accounts for an offset such as a footer.
This sets the height of the element to be exactly 100%
of its parent's height with no offset.
The calc()
function allows for mathematical expressions in CSS values, making it versatile for dynamic layouts.
Save your updated CSS.
You can now access the prompting section of the AI Writing Assistant on the front end without scrolling down the side panel.
The following image shows an example of this result:
This section discusses the prerequisites and steps you need to take to get started with this feature.
Prerequisites
Stability AI addOn installed in the Beefree SDK Developer Console
Take the following steps to activate this feature:
Navigate to the application you'd like install the addOn in.
Provide the requested details.
Save your changes.
The addOn is now activated.
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:
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".
This section includes sample code you can use to configure this AddOn.
The Alternate Text Generation with AI AddOn enables host application end users to instantly generate alternate text for images using AI. This feature is only available for images.
Visit the Alternate Text Generation with AI Knowledge Base article to learn more about the key benefits and use cases of this feature. Continue in this article to learn more about how to implement the Alternate Text Generation with AI AddOn in your host application.
Prior to getting started with the configuration, ensure you have the following:
A working subscription with Azure
Superpower or Enterprise plan
This section discusses the steps you need to take to configure alternate text generation in your host application.
To active alternate text generation with AI in your Beefree SDK Developer Console, take the following steps:
Enter your application
Click on “AddOns”
Select the “Azure AI Vision – Image Analysis” AddOn
Click “Install”
Once you click “Install”, the “Set Up Content” pop up will appear to configure the AddOn
Toggle “Enable” to on
Insert your Azure API Key and Endpoint
Take the following steps to configure Azure Computer Vision and successfully integrate the AddOn into your host application:
Go to “Azure services”
Click “Create a resource”
Search “Cognitive Services”
Select “Cognitive Services” or “Computer Vision”
Note: Cognitive Services allows you to use other functions of Azure AI, but either “Cognitive Services” or “Computer Vision” will work for configuring the alternate text generation. Ensure you select the feature that is best for your use case.
Click “Create”
It will ask you for “Project Details”
Complete the following information to satisfy the “Project Details” requirement:
Subscription
Resource group
Instance Details
Region
Name
Pricing tier
Note: Version 4.0 is not yet available in all regions, but it is required for this feature to work. If you only have access to the 3.2 version, this feature will not work. Ensure that you have access to the correct version.
Click “Review + create” to create the resource
Azure will create your resource with an endpoint and API key
Input in the endpoint in the provider url field within in the Beefree Developer Console
Input in the API key within the API key field within in the Beefree Developer Console
Note: Once you complete these steps, wait at least 15 minutes for the resources to become available. After 15 minutes, you will be able to move forward with using your API Key and Endpoint with the feature.
After you complete the configuration, the Alternate Text Generation with AI tool will be available to your end users. At this point in the process, the tool is offered for free to your end users. Take the steps outlined in this section to limit the usage of this feature for your end users.
The onInfo
call in the following code snippet updates the usage limits for the Alternate Text Generation with AI feature. When AI-generated alternate text is used, the infoMessage.detail.consumedImages
field indicates how many images were processed. This number is added to imagesCounter
, which keeps track of the total images used so far. The backend processes images in bulk, so imagesCounter
reflects the cumulative count of consumedImages
from a single backend call. The refreshed settings ensure that the isIconDisabled
property is updated if the image usage limit (imagesAvailable
) is reached, and the settings are reloaded with bee.loadConfig(refreshedUsageSettings)
.
If you’d like to limit the usage of the Alternate Text Generation with AI tool, take the following steps to configure usage limitations.
Implement the onInfo
call
Sample code onInfo
call:
Confirm the AddOn handle is ai-alt-text
The following sample code shows imagesCounter
and imagesAvailable
, which determine how many images you have used, and the image limit the host application setup for users, respectively.
Note: In this example, the end user can only make five requests in total, after the fifth request, the end user will no longer be able to generate alternate text. The number five is defined in the configuration and can be customized. For example, if imagesAvailable
is set ten, the end user will be able to perform ten requests.
To display the widget usage, take the following steps:
The call looks for imagesAvailable
value and imagesUsed
value
To activate the display usage widget, provide the usage data via the AddOn settings. Since the editor doesn’t track usage, you’ll need to refresh the values via the bee.loadConfig
method to keep the display widget data current
Note: If either of the settings imagesAvailable
or imagesUsed
are not sent, the application will not show the consumption.
This section discusses advanced permissions for your application users. You can use the two settings IsIconDisabled
and enabled to configure permissions for your end users. To configure both booleans, take the steps outlined in the subsequent sections.
To disable prompts per user, perform the following:
Set isIconDisabled
to true
Note: The end user will be able to see the button, but will not be able to use the button through setting the isIconDisabled
setting to true
You can reference the difference in appearance in the following images.
Image 1.0 displays an example of the wand when the feature is not active.
Image 2.0 displays an example of the AI wand icon when the feature is active.
To disable the AddOn completely for an end user, perform the following:
Set the enabled
field to false
Ensure you familiarize yourself with the following feature limitations to ensure this AddOn is suitable for your application’s needs:
You can generate the caption for an image multiple times, but you’ll always get the same result for the alternate text
The AI model does not work well with PNG or SVG images with transparent backgrounds, especially when the outline is black
Only available in English
Not available for Multi-language templates
Images must have URLs and be publicly accessible
Only available for static images, not available for dynamic images
Not available for custom AddOn of image type
If you want to know if you are being charged, and you have the usage widget enabled, you will only be charged if the counter goes down.
Note: If an error occurs after the icon for the Alternate Text Generation AddOn is clicked by an end user, and text is not generated, you will not be charged. You will only be charged for instances when a caption is successfully generated.
In the event an error occurs, the end user will see an alert and you will receive a message from the Azure API with additional details regarding the error.
Q: Will Azure keep the photos used with this feature?
The images you submit to Image Analysis service are processed in real time, and the input images and results are not retained or stored in the service after processing.
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.
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 ).
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 .
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 .
Before you get started, you may want to review these .
First, 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 . If you are not on one of those plans:
The process all starts in the :
Log into the Console at
Healthcheck URL – Optional, but required for 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 , 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.
Create a new custom AddOn of type “Mixed Content” from , as described in the “Getting started” section of this article;
Add the (for example, if the user chose the “Content Dialog” method, it might look something like this):
Create a new custom AddOn of type “Row” from , as described in the “Getting started” section of this article;
Add the (for example, if the user chose the “Content Dialog” method, it might look something like this):
The content dialog configuration, required for this custom AddOn is the same configuration used by the other AddOns. Please see the paragraph.
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 .
Once you have initialized the Beefree app, you can pass a series of to it.
See: .
Bulk Alt text Generation with AI is a feature that works as an extension to our existing . The new functionality enables you to provide your end users with an easy method to create alt text captions across multiple image module types simultaneously using artificial intelligence. Through this feature, your application end users will be able to boost the accessibility of their content while also saving a significant amount of time.
To configure Bulk Alt Text Generation with AI for your application, take the Configuration Steps outlined in our .
AI Alt Text Generation in Bulk is compatible with . Through Token Upselling, you can configure your application to verify that end users have enough tokens to generate alt-text for multiple images at once.
If they do not have sufficient image tokens in their account, you can redirect them to prior to performing the bulk generation.
Repeat the configuration steps outlined in .
You will be billed through your Microsoft Azure account for AI generation-related features. Ensure you for details on pricing.
The AI Writing Assistant AddOn is only available for and plans.
Visit our to learn more about how this feature works on the frontend for your application's end users.
Important: The OpenAI AddOn is now the AI Writing Assistant AddOn with the addition of a new provider: Azure OpenAI. You can use either or to activate the AI Writing Assistant.
is a service offered by Microsoft Azure that provides access to OpenAI's language models, such as GPT-4, integrated within the Azure ecosystem. This integration allows users to leverage the robust cloud infrastructure, security, compliance, and scalability features of Azure, making it an attractive choice for enterprises seeking a seamless and secure AI solution.
directly offers its models through its own API, which may be more straightforward for developers and small businesses looking for a quick, standalone implementation. The primary difference between the two lies in the integration and additional features provided by Azure, such as enhanced data privacy and the ability to easily combine with other Azure services. However, Azure OpenAI may require more familiarity with the .
This section discusses the prerequisites and steps you need to take to get started with this feature. You can watch the following for visual steps on how to activate the AddOn and add or change providers. Or, you can continue reading the documentation in this section for a step-by-step breakdown of how to activate the AddOn and add or change providers.
You can also manage your existing providers within the Developer Console. By taking the same steps mentioned in the and navigating to your application's AddOns, you can manage your configured providers.
Monitoring Token Usage for Cost Management: By tracking the number of tokens being used, you can effectively manage and regulate your expenses related to using the AI Writing Assistant AddOn. This becomes important when your usage is high, and you must keep a budget check.
Token Upselling: The AI Writing Assistant AddOn can be configured to guide your end users to purchase additional tokens when they run out of available tokens. This feature is called .
Note: All settings are optional and may be refreshed, in real-time, via the instance method (e.g. bee.loadConfig(settings)
) during the active session.
Display only value for the optional : The total tokens available for the user to consume during the session. If provided, tokensUsed
and tokenLabel
are required.
Display only value for the optional : The number of tokens that the addon user has consumed during the current session. If provided, tokensAvailable
and tokenLabel
are required.
Display only value for the optional : The API reports token usage, but the host app may refer to tokens as words or any other nomenclature that makes sense to its users. Required when providing usage limits via tokensAvailable
and tokensUsed
parameters.
A boolean that confirms whether or not the feature is enabled.
A boolean that confirms whether or not the is enabled
Visit our to learn more about the flow of your end user's information from prompt creation to generated response.
The Stability AI AddOn is only available for and plans.
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 to learn more about how this feature works for your application's end users.
API key
Log in to the .
Install the addOn.
Go to the
Note: If you do not yet have an Azure API Key and Endpoint, navigate to the of this guide.
Azure Computer Vision is a key component of the Alternate Text Generation with AI AddOn. The steps highlighted in this section will guide you through how to obtain your Computer Vision or Cognitive Services API Key and Endpoint. If you have already obtained both, you can skip this section and navigate to the of this guide to learn more about customizing the AddOn for your end users.
Login to the
For more information, visit the .
In the AddOn settings, isIconDisabled
is configured to automatically disable the Alternate Text Generation with AI feature when the counter reaches zero. However, through the notification banner, application end users will have the opportunity to purchase more images and regain access to the feature.
Unlike the OpenAI AddOn, the Alternate Text Generation AddOn does not charge by tokens. Rather, the AddOn charges for each image caption you generate. Reference the for additional information.
For more information on potential errors and error codes, reference the or the depending on which service you opted in for to configure this feature.
The AI Alternate Text Generator is compatible with token upselling. The token upselling feature notifies the end users when their token usage is running low and when it is completely out. Both notifications include an option for the end user to purchase more tokens. The appearance of these notifications are customizable. Read the to learn more about configuring token upselling within your host application.
A: The following answer is directly from the :
For more information on image processing and data security, refer to the .
handle
String
'ai-alt-text
'
Represents the identifier for the specific add-on handling alt text generation.
infoMessage.detail.consumedImages
Number
5
Indicates the number of images processed by the bulk alt text generation call.
imagesCounter
Number
10
Keeps a running total of the number of images that have been processed for alt text generation.
imagesAvailable
Number
100
Indicates the total number of images available for alt text generation based on the user's subscription or quota.
isIconDisabled
Boolean
true
Determines whether the icon for the add-on is disabled, based on whether the imagesCounter
has reached the imagesAvailable
limit. Default value is false
.
isUpsellEnabled
Boolean
true
Determines whether upsell options or notifications should be enabled for the user.
refreshedUsageSettings
Object
{ addOns: [...] }
Contains the updated configuration settings for the add-on, including the current usage metrics and state settings.
bee.loadConfig
Function
bee.loadConfig(refreshedUsageSettings)
Responsible for reloading the configuration settings for the add-on to reflect the latest usage metrics and states.
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.
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:
The following is a list of all modules that are sent as part of the args parameter:
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.
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 feature. To set it up you will need to add the corresponding entry to the :
The handler
function lets you use your own logic to retrieve the desired value, and it has a -like signature.
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 .
Values must use the same pattern used in the : 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
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
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 six 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:
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.
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
Customize a list of languages the user can choose from
Allow changes to the default language
Enable preview for templates in different language versions
Multi-language Templates (MLT) offers the following in-app features for an application end user:
Switching the editor and template languages
Translate contents
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.
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
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
Click “Details” on the application you’d like to enable multi-language template for.
Select “Application configuration”.
Navigate to the multi-language template toggle.
Toggle the feature to on.
Add the templateLanguage
property to the config object. This property defines the default language for the template.
Add the templateLanguages
property to the config object. This property defines the list of language options for the template translations.
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.
The following sample shows an example of a default language and three translation languages that are written and read from right to left.
Note: You can have up to six different versions of the design using one template.
Once you have initialized multi-language templates, you can confirm that the configuration was successful by following these instructions:
Go to your builder.
Navigate to the top bar.
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.
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.
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.
To save the HTML output for a specific language take the following steps:
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’).
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.
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.
Take the steps outlined in this section to export the translation HTML.
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.
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.
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.
The following sample code displays this:
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.
Create a function to handle the language change. You can use the instance method bee.switchTemplateLanguage
for this purpose.
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.
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.
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.
Test the language switching functionality by calling bee.switchTemplateLanguage
with different language values, and make sure that the onTemplateLanguageChange
callback responds correctly.
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.
The following code shows an example of the methods applied for a preview in French.
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.
Multi-language Templates are only available for .
Enable the , 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 .
Enable the to allow your end users to translate their template language version's content with the .
This Configuration Guide will help you get started with configuring the MLT feature. We recommend you start with the 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 section to learn more about this feature.
Activate the language configuration in the
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 .
For more information on the end user experience for Multi-language Templates, visit our .
View a list of eligible content in the .
Log in to the .
The lang attribute on the content modules helps with .
To get HTML in a specific language by our , ensure you include a “language” key/value pair to the body of your request. Ensure you reference the instructions for using the of the to learn more about exporting template HTML.
Ensure you have a .
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 .
This endpoint accepts HTML and settings to generate a PDF document and provides a URL for the PDF.
The file type for the output.
PDF
Available options: A full HTML document to be transformed into a PDF.
The orientation of the PDF page.
landscape
Available options: The size of the PDF page.
letter
Available options: Retrieve a list of synced rows from a template.
The collection name.
The label used for identifying the rows added to the metadata key, usually GUID.
The JSON structure of the template.
Transform HTML and image settings into an image.
The collection ID or name
Accepts jpg or png
The image height in pixels
A BeeFree HTML message
Image size if width and height are not defined
The image width in pixels
The Merge Rows endpoint enables you to 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. To use this endpoint, send your template and rows in JSON format. You will receive a response with an updated template. The rows requiring an update are identified by their rowIdentifier values.
The collection ID or name
Label for identifying rows, usually GUID
An array of Beefree rows in JSON format
A Beefree template in JSON format
List of available webfonts to rectify missing ones
Transform a JSON template into an HTML response.
The collection ID or name
Flag to return beautified HTML
For multi-language templates, sets the output language using a valid language code
A BeeFree template in JSON format
This endpoint accepts a JSON template to create a plain text version of an email.
Optional. The output language for multi-language templates.
The template's JSON used to create the plain text document.
The endpoint accepts a JSON template and returns a JSON object with metadata.
Optional settings that provide additional instructions to the AI for metadata generation.
A JSON object representing the template structure.