Email builder

Campaigns

Email builder

The builder is a drag-and-drop canvas: add blocks from the left, edit the selected block on the right, and see a live preview in the middle. The same builder powers campaigns and automation emails.

On this page21 sections

Blocks you can add#

  • Text: rich text with formatting and personalization tags.
  • Button: a call to action with your brand styles.
  • Image and Logo: upload or reuse brand assets (formats and limits under Uploading images).
  • Video: a clickable thumbnail linking to your video.
  • Menu: a horizontal nav of links (edit each item's label and URL).
  • Product listing: hand-pick real products from your store.
  • Product recommender: dynamic products (best-selling, recently added, …) chosen per send.
  • Discount: a unique code block (see below).
  • Social Media and HTML Code: a row of social icons, or your own HTML, pasted or imported from a file.
Product blocks pull from whichever store you've connected (Shopify or WooCommerce) in the picker and in the preview.

Uploading images#

Every image in Sendcore goes through the same upload: the Image and Logo blocks, a layout's background, the email background, the image block of a signup form and the brand logo in Settings → Brand assets. Select the block, then click Select file to upload a picture, or Library to reuse one you already uploaded.

Edit image sits above Remove image padding. It opens an editor for filters, resize, crop, drawing and text. Save stores a new file in the Library and the block shows that file. The picture you started from stays in the Library, so you can pick it again. A GIF you edit becomes a still image; the original GIF stays. An image that is not in this account's Library has to be uploaded with Select file or Library first. The new file follows the same size limit as any other upload.

  • Accepted formats: JPG, PNG, GIF, WebP, SVG.
  • Maximum size: 4 MB per image, measured after the automatic resize.
  • Automatic resize: a large photo is reduced in your browser before it is sent. The longest side becomes 1600 px and the picture is saved as JPG, or as PNG when it has transparent areas, so a 10 MB phone photo uploads without you doing anything. GIF and SVG are never modified: an animated GIF over 4 MB is refused.
  • Other formats: a picture email clients cannot display (an iPhone HEIC, an AVIF) is converted to JPG or PNG when your browser can read it; otherwise it is refused with a message.

If an upload fails, the reason appears in red right under the Select file button: file too large, format not supported, no permission (read-only members of the account cannot upload), or a connection problem. The image in the block does not change until the upload has succeeded, and you can pick the same file again to retry.

The Library

Every uploaded image is also saved in the Library of the account you are working in, shared with the other members of that account, so you can reuse it in any campaign, automation or form of that account without uploading it again. Switch account and the Library shows that account's images, not another store's.

Generate a draft with Sendcore AI#

Open the AI panel, describe the email or offer, and Sendcore drafts on-brand copy and layout using your brand kit: fonts, colors, logo and brand context set in Settings → Brand assets. Then refine block by block. AI generation is on paid plans.

Personalization (merge tags)#

Insert a tag in the subject, preheader or any text block; at send time it's replaced with each recipient's value (blank if unknown, spacing tidied). The picker shows every tag exactly as it's inserted. Clicking it or typing it by hand gives the same result:

  • {{ contact.first_name }}: the recipient's first name.
  • {{ contact.last_name }}: the recipient's last name.
  • {{ contact.email }}: the recipient's email address.
  • {{ contact.phone }}, {{ contact.city }}, {{ contact.country }}: the phone and the address the contact card holds.
  • {{ contact.custom.<key> }}: any custom property of your contacts, by its key ({{ contact.custom.size }} for a property named size). The picker lists the keys your audience actually carries; a key with spaces or accents cannot be used as a tag.
  • {{ view_in_browser_url }}: the web version of this email for this recipient, in a button's link or a text link (“View in browser”). It shows exactly what was sent, products and discount code included, and never counts as an open. Campaigns only for now: in an automation email the tag renders empty.

A fallback covers empty values: {{ contact.first_name | "there" }} renders the name, or “there” when it's missing. Abandoned cart/checkout automations get two extra tags: {{ abandoned_checkout_url }} (the checkout recovery link) and {{ abandoned_cart_url }} (rebuilds the customer's cart on any device). Order and back-in-stock workflows add {{ event.* }} tags for the order or the product the contact entered with; see the automations guide.

Formatting & moving blocks#

  • Font size and text color are selection-aware: highlight a word or phrase to change just that selection; with nothing selected, the whole block is styled.
  • Move any existing block with the grip handle: drag it anywhere, including into a layout column, or with the up/down arrows, which also work for nested blocks and on touch screens.
  • Dropping a new block over a layout column inserts it inside that column at the exact spot, with the column highlighting as you hover.

Saved layouts and elements#

Besides saving a whole email as a template (Save template above the canvas), you can save a single piece of it to reuse in your next emails: a header, a footer, a row of columns with everything inside, or one block, such as a button you styled or a text you keep repeating. Select the block on the canvas and click the floppy-disk icon in its toolbar, under the bin and the duplicate icons.

  1. Select the block. To save a whole section, click the layout itself (its edge or the space between its columns) rather than an element inside it.
  2. Click the floppy-disk icon in the block's toolbar, on the right of the canvas.
  3. Give it a name and click Save. Or pick Replace a saved layout / Replace a saved element to save it over one already in the library: the old version is gone, the name stays.
  • Layouts (a header, a footer, any column layout) are saved under Library → Add Elements → Layouts, in the Your layouts section below the standard ones.
  • Elements (any other block) are saved under Library → Saved, the item between Add Elements and Images.
  • Drag a saved block onto the canvas like any other item. A layout always lands between the sections of the email; an element can also go inside a layout's column.
  • Delete one with the bin icon on its card. The emails where you already placed it do not change.

A copy, not a link

A saved block is a copy taken when you saved it: editing it in an email does not change the library, and changing a saved block does not change the emails it is already in. To update the library, save the block again and choose Replace. Dropped into an email, a saved block takes that email's font and global button styles, exactly as a block added from the palette would; a colour you set on one button is kept.

Shared, with limits

Saved layouts and elements belong to the account: every member of the account sees and can use them. A block that only an automation can fill (Abandoned products, Order total, alone or inside a saved layout) is greyed out when you are building a campaign. Product listings keep the products you picked; the product recommender keeps its settings and picks the products at each send.

Product listing options#

Select a Product listing block to configure it in the right panel:

  • Pick products from store: search your catalog and select. Results appear as you type; filter by collection or category and by availability, sort by newest, name or best sellers, and use Show more products to keep going through a large catalogue. Open a product to pick one of its variants. The selection persists while you search and across searches, so you can keep adding; repeated searches render instantly.
  • Layout: grid, image left or image right, plus product count and columns.
  • Reorder: drag a product row, or use its up/down arrows (they work on touch screens too).
  • Product details: toggle image, title, description, price, old price, button and Product variant in title per block.
  • Fit images to same size: crop every product image into one uniform box so the grid lines up even when the originals have different shapes. Images are cropped, never stretched; off, the natural ratios are kept as before.
  • Shared styling across products: Synced (style one product and every other one follows: fonts, colours, alignment, spacing, images and button) or Individual (each product keeps its own styling). Title, image, price and link always stay per product. Turning sync on applies the first product's styling to all of them.

Product cards, top to bottom#

Each product shows its picture, name, price and button one under the other, the same way you arrange them in the editor, including in Gmail on a phone. This applies to the Product listing, Product recommender and Abandoned products blocks, on the canvas, in the previews and in the inbox, and to emails you already wrote. There is nothing to set.

  • It holds for Grid, Image left and Image right: the button stays under that product's own text.

Best sellers in the product picker#

In the Add products window (select a Product listing block, then Pick products from store), the Best sellers option of the Sort menu lists the products that have sold, the one with the most units sold first, when the search box is empty. Each row says how many units it sold, for example 12 sold, and Show more products continues down the ranking. A product with no recorded sales is not a best seller and does not appear in that list: switch to Most recent or Alphabetically to browse the whole catalogue.

Type a name and the search looks through the catalogue, including products that have not sold. Matches that have sold are listed first, still with their units; the others follow. A collection or category you selected, and the availability filter, still apply. If nothing matches, the window says no products were found. It does not tell you there are no sales when the name simply is not among the best sellers.

  • Shopify: the ranking counts the units sold in the last 90 days in the orders Sendcore has received from your store. Orders placed before you connected the store, and orders without an email address, are not counted, so right after connecting the list can be short or empty.
  • WooCommerce: the ranking is your store's own sales count, for as long as the store has existed.
  • Units, not orders: three pieces of the same product in one order count as three.
  • With a collection or category selected and no search, you see that group's best sellers, in ranking order. With a search, you see the matches from that group, sellers first.
  • Choosing products and clicking Add puts the selected products into the list, up to 12, which is as many as a product listing shows. A product already in the list stays. Choosing the same product again updates its variant and does not add a second copy.

Discount codes#

The Discount block can mint a unique, single-use code per recipient at send time (Shopify), so no two customers share a code. Set amount, expiry and button style; Sendcore creates and injects each code.

On a large audience the codes take a while: Shopify creates about ten a second, so 10,000 recipients are some 17 minutes, 100,000 close to three hours. Sendcore creates every code before the first email leaves, and the campaigns list shows Discount codes: N of M created while it does; the send starts by itself once they are ready. Review & send tells you the estimate next to the recipient count when it matters. A code that was created is never created twice, so a send that resumes after a hiccup picks up where it stopped.

The discount's button#

Select the Discount block and open Button in the right panel to set the button under the code:

  • Text: the words on the button.
  • Link to: the page of your store the button opens, a product or a collection for example. A new block starts with your store's home page.
  • Apply Shopify discount link: when on, the button applies the customer's code by itself, then opens the page in Link to: the discount is already applied at checkout, with nothing to type. Only the page counts, such as /collections/summer, and it opens on your store, so use a page of your store. Left at https://, the button opens your store's home page.
  • With Apply Shopify discount link off, the button opens Link to as written and the customer types the code at checkout, so fill the link in.
  • Button style: one of the three button styles of the whole email, set in Email settings → Theme settings → Buttons.
  • Button color: a Background color and a Text color for this button only. They replace the colours of its style and stay when you pick another style or change the email's buttons; Reset to style brings back the style's colour.
  • Button alignment: left, centre, right or the full width.
Text hard to read on the button, such as dark text on a dark brand colour? Give this button a light Text color. To fix every button of the email at once, change the colours of the style in Email settings → Theme settings → Buttons.

When the code expires#

Under the code, the Discount block tells the customer the day their code stops working, in the email's language: Expires on Oct 20, 2026 in English, Scade il 20 ott 2026 in Italian. Select the block and open Expiry in the right panel:

  • Set discount expiry: with it off, the code does not expire and the line is not shown.
  • Expires in: how many days each code lasts.
  • Expiry date format: the month in words, the way the email's language writes a date (Oct 20, 2026 in English, 20 ott 2026 in Italian), or the date in numbers, 2026-10-20 or 20/10/2026, the same in every language.

Sendcore creates each customer's code just before their email goes out, and the code lasts that many days from then: the date the customer reads is the real one, also in a workflow that keeps sending for months. In the editor and in a test email no code exists yet, so the block shows XXXX-XXXX-XXXX and the date is counted from today.

The line follows the email's Language, not the language you use Sendcore in. If it comes out in the wrong language, check Language in the first step of the campaign, or in the panel of the automation email step (see The email's language).

Social icons#

The Social Media block (Add elements → Social Media) is a row of buttons linking to your profiles. Select it to configure it in the right panel:

  • Networks: the buttons in the row, in order, each with the link to your profile. Reorder with the arrows, take one off with ×, add another from Add network…. Clicking a button in the email opens the same link field in place. Nineteen networks are available: Facebook, Instagram, TikTok, X, YouTube, LinkedIn, Pinterest, WhatsApp, Telegram, Threads, Snapchat, Spotify, Discord, Twitter, Medium, Vimeo, SoundCloud, plus a generic website icon and an email icon.
  • Style: Solid (a filled shape behind the icon), Outline (a thin ring) or Icon only (the logo on its own).
  • Colors: Brand uses each network's official colour (Instagram gets its gradient); Dark, Light and Gray make the row uniform, with Light meant for dark footers; Custom lets you pick the background (or the border, for Outline) and the icon colour.
  • Shape (Circle, Rounded, Square), Size (Small, Medium, Large), Spacing between icons, Padding above and below the row, and Alignment.

Save your profiles once in Settings → Brand assets → Social links, where the same networks are offered (the email one takes a mailto: address): every new Social block starts with those networks and links, and Sendcore AI puts them in the footer of the emails it drafts.

Each button is an image, so it looks the same in every inbox, Gmail, Apple Mail and Outlook included, and stays sharp on high-resolution screens. With images blocked, the network's name shows in its place. A network you haven't given a link yet points to the network's home page: fill in every link before sending.

Your own HTML#

The HTML Code block (Add Elements → HTML Code) holds an email, or part of one, written outside Sendcore: a template from your agency, an export from another platform, a layout coded by hand. Select the block and the right panel shows two fields: HTML, the content, and Styles, its stylesheet. Type or paste into them, or import the file.

  1. Add an HTML Code block where the email should go, and select it.
  2. Drag the .html file onto Import an HTML file at the top of the panel, together with its images if you have them as files. Or click Choose file and select them.
  3. Read the summary: it says what went where and what was corrected on its own.
  4. Check Personalization, links and images at the bottom of the panel, then send yourself a test from Review & send.
  • The file's <style> blocks go into Styles and the content of its <body> into HTML. Web fonts the file links are kept.
  • Scripts, frames and attributes such as onclick are removed: no inbox runs them.
  • A countdown the file runs with a script is kept as a picture of the time left. On the canvas and in the previews the numbers move every second. The email that is sent shows the time left when it is opened, because an inbox does not run the script. The date is the one written in the file.
  • Addresses written relative to a <base> tag are completed with it.
  • When the file is a whole email, the block's padding goes to 0, so its own spacing is not doubled.
  • A block cannot carry the page background of the file: the summary shows it, with a Use it as the email background button. It is the same setting as Email settings → Theme settings → Background → Background color.
  • The import does not turn the file into Sendcore blocks: the whole email stays one block, and to change a word you edit it in HTML.
  • If the block already holds your HTML, the import asks before replacing it, and Ctrl+Z (Cmd+Z on a Mac) brings the previous content back.

Below the two fields, Personalization, links and images lists the personalization tags the HTML contains and every link and image that would not work in an inbox. Sendcore tags work exactly as in a text block: {{ contact.first_name | "there" }} greets each recipient by name. The tags of other platforms are recognized and rewritten the Sendcore way: Mailchimp (*|FNAME|*), Klaviyo ({{ first_name }}, {{ person.first_name }}), Shopify Email ({{ customer.first_name }}), Brevo ({{ contact.FIRSTNAME }}), Omnisend ([[contact.first_name]]), ActiveCampaign (%FIRSTNAME%) and MailerLite ({$name}) all become {{ contact.first_name }}.

  • Corrected automatically: on import, whatever has one right form. Another platform's tag, a Sendcore tag with the wrong braces or capitals, a link without https:// or with a mistyped one (htps://), an unsubscribe link that leads nowhere (it becomes {{ unsubscribe_url }}).
  • Proposed corrections: what is likely but not certain, such as a tag that resembles a known one or a path completed with your store's address. Apply them one by one or with Apply all.
  • To fix: what only you can know. A link to #, a name left to fill in (BAIA_PRODUCT_URL), a tag Sendcore does not have, an image that is a file on the computer the template came from. Type the right address and press Apply, or Remove link to keep the text without the link.
  • Images: an image written as a file (images/hero.jpg) needs that file. Drop the images with the HTML, or later onto Import an HTML file: each one is uploaded to Sendcore and put in place by its file name. A name left to fill in, such as HERO_IMAGE_URL, is not a file. On the canvas, click the image that does not load. The picture is uploaded to Sendcore and written into the HTML here. For one image use Upload image or Library (the picture icon) on its row. The name does not match a file in the HTML. Choose which image to replace. Then pick it in Image to replace. An image embedded in the file is blocked by most inboxes: Upload to Sendcore gives it a normal address.
  • Proportions: a picture you put in place of another keeps the width of its place and takes its own height, so the height written for the old picture does not stretch it; where the HTML gives it no maximum width, it also stays within the width of the email. A file with the name the HTML points at (hero.jpg for images/hero.jpg) is the template's own picture: it keeps the size the HTML gives it, so spacers and icons stay as they were designed.

Styles apply to the whole email

In the inbox the rules in Styles are not limited to the block: p { text-align: center; } centres every paragraph of the email, the other blocks included. Aim them with classes, as templates usually do: .hero p { text-align: center; }.
  • Gmail cuts an email over about 102 KB and hides the rest behind a link, the unsubscribe link included: the panel warns you when the block gets close.
  • Clicks are counted on full https:// links. mailto: and tel: links work but are not counted.
  • Conditions and loops ({% if %}, *|IF:|*) are not supported: write a text that works for everyone.
  • Some inboxes ignore style blocks, such as the Gmail app used with a non-Gmail address: what is written on each element (its style attribute) always arrives.

How the canvas shows your HTML#

On the canvas, an HTML Code block is laid out as in the email your customers receive, the same as in the previews of Review & send. A template built on a fixed width, a 620px frame for example, takes the width of the email and stays centred, instead of shifting to the right and being cut off. The look of the Sendcore dashboard stays out of the block: pictures and tables sit where your HTML puts them, centred if your HTML centres them, and headings, paragraphs, lists and links look as they do in an inbox.

  • The HTML field keeps your code exactly as you wrote or imported it. The frame is drawn at the width of the email because that is how the email is sent: what your customers receive does not change.
  • Your Styles apply on the canvas as they do in the inbox: p { margin: 0; } removes the space around paragraphs on the canvas too.
  • A picture takes the size your HTML gives it, on the canvas as in the inbox. If its width and height do not match the picture's proportions, it looks stretched in both: delete the height attribute, or add height: auto; to its style attribute, and it keeps its proportions.
  • A picture wider than the column shrinks to fit it, on the canvas, in the previews and in the email, instead of being cut off or pushing the column wider. max-width: 100%; height: auto; in its style attribute is the same rule, and it is what to write when you size a picture yourself.
  • The desktop/mobile toggle above the email and the Content preview show the email at the width of a phone, and a long line wraps inside that width instead of being cut off at the edge. Mobile puts that preview inside a phone, over a dimmed view of the desktop layout. Desktop removes the phone. They do not apply the changes a template's Styles make on phones (the rules inside @media), such as a smaller type size or tighter padding: those apply in the inbox. To check them, send yourself a test from Review & send and open it on your phone.

Show a section on mobile only, or on desktop only#

Every layout (a column layout, a header or footer, or the stack of blocks around any element) can be shown on every device, on phones only, or on desktops only. Select the element or the layout, open the Layout tab on the right and pick under Visibility on devices: All devices, Mobile only or Desktop only. To build a different design for each, place two layouts one after the other, one Mobile only and one Desktop only, and put in each the version made for that screen: a wide banner and a tall one, three columns of products and a single column, a long menu and a short one.

  • “Mobile” means a screen up to 600px wide, the width the email world has settled on; wider is desktop. The inbox decides from its own width, so a phone held sideways or a narrow desktop window can cross the line.
  • On the canvas, the desktop/mobile toggle above the email shows what each device gets, inside a phone when Mobile is selected, and the Content preview in Review & send does the same. A layout hidden for the device you are previewing disappears from the canvas: switch the toggle to edit it.
  • A layout you have not told anything about is shown everywhere: existing emails do not change.

Where this does not work

Some clients ignore the styles an email carries (some Gmail apps, some webmails, Outlook for Windows): they show the desktop version, so a Desktop only section is shown and a Mobile only one is not. Put in Mobile only sections only content that has a desktop equivalent, never the only copy of something important. This is the same limit Klaviyo and Omnisend have, for the same reason.

How your email fits a phone screen#

Every email Sendcore sends asks the mail app to lay it out at the width of the screen it is read on, with the text at the size you chose. Mail on iPhone and iPad used to open some emails shrunk, as if they were a page made for a wider screen, and show them at their real size only when they were opened again: they now open at their real size the first time. There is nothing to set, and it applies to every email that leaves from now on, campaigns, automation emails and tests alike, including the ones you wrote before.

  • An image keeps the width you gave it and shrinks to the width of the screen when the phone is narrower, keeping its proportions. A picture wider than the phone no longer makes Mail zoom the whole email out.
  • An email made elsewhere and imported into the HTML Code block fits the phone too, even when it is built on a fixed width (a 620px frame, for example): it keeps that width on a computer and takes the width of the screen on a phone. Gmail on Android used to shrink such an email and Gmail on iPhone to lay it out off-centre with narrow buttons, so the same email looked different on each.
  • The block's Styles, including the rules a template uses to change its layout on phones, now reach Gmail on the web, on iPhone and on Android: Sendcore puts them at the top of the message, the only place Gmail reads them. The Gmail app used with a non-Gmail address still ignores them, and the email still fits the screen there.
  • The canvas and the previews in Sendcore lay the email out as it is sent, the frame of an imported template included (see How the canvas shows your HTML). Narrowing the column wraps the text inside it instead of cutting a line off. They do not apply the rules a template uses to change its layout on phones, such as a smaller type size or tighter padding: to see the email as your customers do, send yourself a test from Review & send and open it on your phone.
  • The web version ({{ view_in_browser_url }}) fits the phone the same way.

The email's language#

Every email has a language, the one its recipients read. In a campaign you choose it in the first step, under Language. In an automation, click the email step on the canvas: Language is in the panel on the right, below Sender email. The languages are English, Italian, Spanish, French and German.

Sendcore AI writes the email in that language, and Sendcore uses it for the words it writes into the email for you:

  • Abandoned products: the button under each product (View product in English, Vedi prodotto in Italian) and the quantity written after the variant (qty 2, qtà 2).
  • Order total: the rows Subtotal, Discount, Shipping, Tax and Total, and “Calculated at checkout” while the shipping cost is not known yet.
  • Product recommender: the button under each product (Shop now, Acquista ora) and the line shown when there is no product to recommend.
  • Discount: the line under the code that says when it expires (Expires on Oct 20, 2026, Scade il 20 ott 2026), see When the code expires.
  • The unsubscribe line Sendcore adds at the bottom of an email that has no unsubscribe link of its own.
  • Prices: €19.95 in English, 19,95 € in Italian, Spanish, French and German.
  • The text a new Button or Product listing starts with, the button of a new Discount block (Redeem discount, Usa lo sconto), and the Loyalty points block, which starts in Italian in an Italian email and in English otherwise.

The language is read each time an email goes out. Change it, and every email sent from then on follows it, including the next emails of a workflow that is already running. Emails already sent do not change.

Your own text is never translated

The language changes only the words Sendcore writes. Your subject, your text and the buttons you added stay exactly as you wrote them: a button that says Shop now keeps saying it after you switch the email to Italian. Write the email in the language you choose.
  • A new campaign or automation email starts in the language you are using Sendcore in.
  • The emails of a workflow created from a template start in English, like the template's text. Once you have rewritten the text, choose the language you wrote it in.
  • Automation emails created before the Language field existed are set to English. If one of them is written in another language, choose that language and its cart products, its totals and the expiry line of its discount code will follow.
  • An email whose language is not one of the five (an AI assistant can create one, for example) keeps it: the menu shows it with No translation, and the words Sendcore adds stay in English until you choose one of the five.
  • In the editor and in a test email, the Abandoned products and Order total blocks show an example. The customer's real products and totals, worded in the email's language, appear in the emails the workflow sends.

Preview & test#

  1. Use the desktop/mobile toggle to check both layouts. Mobile shows your email inside a phone, over a dimmed view of the desktop layout. Desktop removes the phone. The subject and the sender name appear at the top of the phone when the email already has them.
  2. Click Preview at the bottom of the editor for the full preview: product blocks show real products from your store, and the personalization shows a sample contact.
  3. Send yourself a test: in the preview with Send test email, or straight from the editor with the arrow next to Preview, which opens Send a test email without going through the preview.

Either way, the test is the email as it is in the editor at that moment, sent the way your recipients will get it: the personalization shows the Test User placeholders, or the data of the contact you enter in With this contact's data. Several inboxes go in the same field, separated by a comma; press Enter or click Send. The subject starts with [TEST], and test sends never count in reports.

Domain not verified yet?

Until your sending domain is verified, tests go out from test@sendcore.me and only to your own inbox: see sending domain.

Space you add on the sides of a section stays inside the email in the preview and in the inbox, the same as on the canvas. Gmail's dark mode can repaint a light card on a dark email: the message asks Gmail to keep the colours you set.

Saving#

The editor autosaves as you work. When you're done, Save & review continues to the final send step, while Save & close saves and returns you to where you came from: handy when editing an automation email.

Next steps