Segment Canvas

Segment Canvas lets you build a segment on a visual canvas, without writing SQL. You add your tables, add steps that filter and combine them, and the result becomes a Dengage segment, stored as a sendable table. You can use it everywhere a sendable table can be used.

You can use Dengage tables together with tables from your own databases, such as BigQuery, MSSQL, MySQL, Oracle, PostgreSQL, Redshift or MongoDB. Your own databases must be connected first. See Prerequisite: Connecting Your Data.

Key Terms

  • Source: A table on the canvas. It can be a Dengage table or a table from your own database. Every flow starts with at least one Source.
  • Step: A block on the canvas that does one job, such as filtering rows or joining two tables.
  • Flow: The sources and steps connected together, from the first table to the Segment Output.
  • Chain: A Source and the Filter, Aggregate and Derive steps placed directly under it. The canvas draws a frame around each chain.
  • Segment Output: The last step. It creates the segment and sets its name, destination, identity column and refresh schedule. Every flow has exactly one Segment Output.
  • Destination: Who the segment reaches: Contact (people) or Token (devices).
  • Identity Column: The column that holds the contact key or the push token. Dengage uses it to match each row to a contact or a device.
  • Remote Source: A connection to your own database, defined in the Dengage panel.

What You Can Build

  • Segments from Dengage tables (contacts, events, master data), from tables in your own databases, or from both together.
  • Audiences based on a total or a count per customer, for example customers who spent more than 5,000.
  • "Did / did not" audiences, for example contacts who added to cart but did not buy.
  • "A or B" audiences, for example TR customers or DE customers.
  • Segments that reach contacts, and segments that reach push tokens.
  • Segments that refresh hourly, daily, weekly or monthly, or only when you run them.

Segment Canvas does not show how many rows each step returns. Preview shows sample rows, and the audience count is available after the segment has run.

Prerequisite

  • Feature flag is enabled for your account.
  • Your data is connected. Dengage tables (contacts, events, master data) are available without any setup.To use a table from your own database, a Remote Source of the matching type must exist in the Dengage panel, and Dengage must be allowed to read the table. Most databases (MSSQL, PostgreSQL, Oracle, Redshift, MySQL, MongoDB) use the credentials you enter when you create the Remote Source.

BigQuery

BigQuery does not use a key file or a password. Instead:

  1. In your Google Cloud project, grant these three roles to the Dengage service account [email protected]:
    • BigQuery Data Viewer (roles/bigquery.dataViewer), at dataset or project level. It decides which data Dengage can see.
    • BigQuery Job User (roles/bigquery.jobUser), at project level. It lets queries run in your project.
    • BigQuery Read Session User (roles/bigquery.readSessionUser), at project level. It lets results be read efficiently.
  2. Create a Remote Source of type BigQuery in the Dengage panel.

Only BigQuery Data Viewer decides which tables appear in Segment Canvas. Grant it at dataset level to share only chosen datasets, or at project level to share every dataset in the project, including ones you create later.

Segment Canvas never copies your BigQuery data. It reads the data only while a segment runs. To stop access, remove the three roles in the Google Cloud Console. Nothing needs to be done on the Dengage side.

Accessing the Feature

  1. Go to Audience > Segments > Segment Canvas. The page lists your canvas segments with their name, status, last edit date and last editor.
  2. Click New.
  3. In the Select segment type dialog, choose Segment Canvas. An empty canvas opens with the Draft status.

The editor has two areas. The Toolbox on the left holds your tables (Sources tab) and the available steps (Steps tab). The canvas on the right is where you build the flow.

On the list page, draft segments have the Edit and Delete actions. Active segments have Edit, Run now, Disable and Delete. Use Search to find a segment and Filter to narrow the list by status: Draft, Active, Running, Error or Passive.

Step 1: Add Your Tables

Choose the tables your segment will be built from, and keep only the columns you need from each one. Every table you add becomes a Source step, which is the starting point of a flow.

  1. In the Sources tab, click a connection to see its tables. Dengage tables are under DENGAGE. Your own databases are grouped by type, for example PostgreSQL, MSSQL, MySQL, Oracle and BigQuery.
  2. Find the table you need. Type its name in Search, or click Show 20 more to load more tables.
  3. Drag the table onto the canvas. It becomes a Source step.
  4. Click Edit on the Source step and set it up:
    • Alias: the step gets a default name such as @source_1. You can replace it with a name of your own, for example customers or orders. Use it as a note to yourself about what this table is for, so the flow stays easy to read.
    • Columns: all columns are selected by default. Keep only the ones you need. Use Deselect All or Select All to change the whole list. At least one column must stay selected.
  5. Click Save. From now on, the Source step passes only the selected columns to the next steps.

Repeat these steps for every table you need. You can add the same table more than once. For example, add the contacts table twice to get TR customers in one chain and DE customers in the other, then merge them with Union.

Select only the columns you need. Runs are faster, Join and Union steps are easier to set up, and on BigQuery each run reads less data, which lowers the cost.

Tables from your own databases

Dengage does not keep the tables of your own databases in sync all the time. The table list and the columns are updated only when you ask for it, and you get the current state at that moment.

What you seeWhat it meansWhat to do
A table in a faded colour, marked Not synced yetIts columns are not loaded yet, so it cannot be used.Click the + (Activate table) button next to it once.
A table in a dark colour, with a column count under its nameIt is synced and ready to use.Drag it onto the canvas.
A table you added to your database is missing from the listThe list was last updated before the table was created.Click Rescan this source for new tables next to the connection.
The columns of a synced table have changed in your databaseDengage still shows the columns from the last load.Click Reload columns for that table.

Shape the table before you combine it

Under each Source step there is a small + button (Add a step to this chain). It offers three steps: Filter, Aggregate and Derive. These steps work on that table only. Use them to decide in what form the table enters your flow:

  • Filter: keep only some of its rows.
  • Aggregate: turn it into one row per group, with a total or a count.
  • Derive: add a column with a fixed value.

When you click Save, your first table is ready on the canvas. You can add any other table, from any of your databases, in the same way: drag it from the Sources tab and drop it onto the canvas. The next step is to connect your tables to each other with steps.

Step 2: Shape and Connect Your Tables

Turn your tables into one result. First narrow each table down to the rows you need, then connect the tables to each other.

Add a step

  1. Click one of the two + buttons under the last step of a chain:
    • Add a step to this chain (inner +): Filter, Aggregate, Derive. These work on one table only.
    • Add a step after this group (outer +): Join, Union, Exists, Derive, Segment Output. These connect tables or finish the flow.
  2. Choose the step from the menu. Its settings open in a side panel.
  3. Fill in the settings and click Save. Save stays disabled until the required settings are filled in, and the panel tells you what is missing.

To change a step later, click its Edit button. To remove it, click Delete.

Steps at a glance

StepWorks onWhat it does
FilterOne tableKeeps only the rows that match your conditions.
AggregateOne tableCalculates one value per group, such as a total or a count.
DeriveOne tableAdds a column with the same fixed value on every row.
JoinTwo tablesPuts two tables side by side using a matching column.
ExistsTwo tablesKeeps or removes rows depending on whether they appear in another table.
UnionTwo tablesMerges two lists that have the same columns into one list.

Steps for One Table

Filter

Use it to keep only some rows of a table.

  • Click Add Condition and choose a column, an operator and a value. Add as many conditions as you need.
  • Conditions are always combined with AND: a row is kept only if it matches all of them. For "A or B", create two Filters and combine them with Union.
  • A Filter placed after an Aggregate filters on the calculated values. For example, add an Aggregate with the sum of amount as total_spend, then a Filter with total_spend is greater than 5000, to keep only customers who spent more than 5,000.
  • The operators depend on the column type:
Column typeOperators
Textequals, not equals, is greater than, is greater or equal, is less than, is less or equal, is null, not null, matches pattern, does not match pattern, starts with, does not start with, ends with, does not end with, is one of, is not one of
Numberequals, not equals, is greater than, is greater or equal, is less than, is less or equal, is between, is null, not null, is one of, is not one of
Dateequals, not equals, is after, is on or after, is before, is on or before, is between, is null, not null
True / falseequals, not equals, is null, not null

How to enter the value:

  • Date column: pick the date from the calendar.
  • True / false column: select TRUE or FALSE.
  • is between: enter two values.
  • is one of: type a value and press Enter, then type the next one. Each value becomes its own tag.
  • Empty values: use is null. No value is needed.

Note

Date values are sent to the database exactly as you enter them. No time zone conversion is applied, so enter them in the time zone of the database.

Example: country equals TR, consent_email equals true, last_order_at is on or after 2026-07-01 keeps the contacts in Turkey with email consent who ordered since 1 July.

Aggregate

Use it to get one row per group, for example one row per customer with a total.

  • Group By: the column that defines a group, usually the customer identifier such as contact_key or customer_id.
  • Metrics: click Add Metric and choose a function (count, count_distinct, sum, avg, min or max), a column and an output name.
  • After an Aggregate, only the Group By columns and the metrics remain. Every other column of the table is gone. Add the Aggregate as late as possible, or join its result back to your main table with a Join.
  • To filter on a result, add a Filter after the Aggregate, for example total_spend is greater than 5000 or order_count is greater or equal 3.

Example: orders > Filter (date range, not refunded) > Aggregate (Group By customer_id, sum of amount as total_spend) > Filter (total_spend above a threshold).

Derive

Use it to add a label to every row of a table.

  • Click Add Column and enter the Column Name and the Constant value.
  • Derive adds fixed text values only. Formulas such as CASE WHEN, COALESCE or date calculations will be available soon.
  • Use it to tag a list before a Union. For example, add segment_source with the value web to one chain and segment_source with the value app to the other, so you can tell them apart in the result.
  • Use it to give two chains the same columns, because Union needs identical column names.

Steps That Connect Two Tables

Join, Exists and Union each need two inputs. To connect them:

  1. Under the first table, click the outer + button and choose Join, Exists or Union. This table fills the first port of the new step.
  2. Drag from the output port at the bottom of the second table (or of its last step) onto the open port of the new step.
  3. Fill in the settings of the step. Both inputs must be connected before you can choose the matching columns.

The two ports are named L and R for Join, Main and Check for Exists, and A and B for Union.

Join

Use it when you need columns from both tables in the result.

The Join step has two input ports, marked L and R on the step. The table you started from fills L, the table you connect afterwards fills R. The join types Left and Right refer to these two ports.

In the examples below, the contacts table is connected to L and a table of order totals per customer is connected to R.

  • Join Type:
    • Inner: keeps only the contacts that have an order total. Contacts without orders are dropped.
    • Left: keeps all contacts, and adds the order total where one exists. Contacts without orders stay in the list with an empty total.
    • Right: keeps all order totals, and adds the contact data where it exists.
    • Full: keeps every contact and every order total.
  • Join Keys: click Add key and choose the column that links the two tables, for example contact_key in the contacts table and customer_id in the order totals. If both tables have a column with the same name, the panel suggests it.
  • Use Left when you want to keep everyone from your main list even if they have no match. Use Inner when a match is required.
  • To connect three tables, use two Joins: join the first two tables, then join the result with the third.
  • The Join step shows how many columns it outputs. To keep that number small, select fewer columns in the Source steps.

Note

Dengage does not convert data types. The key columns must have the same type on both sides, for example a number with a number.

The matching columns must mean the same thing on both sides. The customer_id in your CRM must be the same identifier as the customer_id in Dengage.

Exists

Use it when you only need to know whether a row appears in the other table, for example customers who did or did not order.

  • Behaviour: Exists keeps the Main rows that have a match in Check. Not exists keeps the Main rows that have no match in Check.
  • Match On: choose the matching column from Main and from Check.
  • Exists only decides which Main rows stay. It never adds columns. If you need columns from the second table, use Join instead.
  • This is the step for "did" and "did not" audiences. Contacts who added to cart: Exists against a filtered events chain. Contacts who did not buy: Not exists against a filtered orders chain.
  • Exists is usually faster and simpler than a Left Join followed by an "is null" Filter for the same question.

Union

Use it to merge two lists into one, for example to build an "A or B" audience.

  • Both inputs must have exactly the same column names, with matching types. The order of the columns does not matter.
  • Columns with the same name must have the same type, or both be numeric.
  • This is how you build OR logic. "TR customers with consent, or DE customers with LTV tier 4 or higher" is two filtered chains merged with Union.

Note

Union keeps duplicates. If the same contact is in both lists, it appears twice. This does not matter for the segment, because the identity column of the Segment Output step handles it when the segment is built.

Step 3: Create the Segment

Tell Dengage what to do with the result of your flow: what the segment is called, who it reaches and how often it is refreshed. You do this in the Segment Output step. Every flow has exactly one Segment Output, and it is always the last step.

Add the Segment Output step

  1. Under the last step of your flow, click the outer + button (Add a step after this group) and choose Segment Output. The menu offers it only while the flow has no Segment Output yet.
  2. Fill in the settings described below and click Save.

Name the segment

  • Segment Name: the name you will see when you select the segment in Dengage, for example in a campaign.
  • Output Table Name: created from the segment name and filled in for you. It cannot be edited.

Important: The output table name is fixed at the first save and never changes, even if you rename the segment or publish new versions later, so campaigns and other places that use the table keep working.

Choose who the segment reaches

  • Destination: choose Contact to reach people, or Token to reach devices.
  • Identity Column: the column in your final result that tells Dengage who each row belongs to.
    • For Contact, the column must hold the Dengage contact key, for example your customer id. An email address or a phone number cannot be used.
    • For Token, the column must hold the push token of the device.

Tip: No push token in your tables? Add the Dengage master_device table to the canvas, join it to your table on device_id, and use its token column as the identity column.

Set how often the segment is refreshed

Choose a Refresh Schedule. The segment is rebuilt from your tables at every run, so the schedule decides how fresh the audience is.

OptionWhat you setWhen to use it
HourlyEvery N hours, at a chosen minute.Data that changes all the time, such as events.
DailyA time of day.Orders, CRM and other data that is updated once a day.
WeeklyOne or more days of the week and a time of day.Reports and reviews that happen weekly.
MonthlyA day of the month and a time of day.Monthly campaigns.
ManualNo schedule.When you want to run the segment yourself with Run now.

Under the schedule, the panel shows the next three run times in your time zone (Next Runs), so you can check that the schedule is what you meant.

Tip: Match the schedule to how fast your data changes. Hourly suits events, Daily suits orders and CRM data.

Optional settings

  • Limit: turn it on and enter the Number of rows to keep. Use it for test sends or sample audiences. Rows are not sorted, so the limit keeps a random set of rows, and each run may return different rows.
  • View Generated SQL: opens the query that Dengage will run for your flow. It is read-only. Use it to check the logic or to compare it with a query you already have.

Note

Row counts appear only after the segment has run. They are not shown on the steps or in Preview, because counts estimated on remote databases are not reliable.

Step 4: Check, Save and Publish

Check that the flow returns what you expect, save it, and publish it so that it starts running and becomes available in Dengage.

  1. Click Save Draft in the header. The segment is saved with the Draft status and appears in the Segment Canvas list. You can come back and continue editing it later.
  2. Click Preview. The Preview results window runs your flow on the live data and shows the first 10 rows, together with the number of sources, joins and steps. Check that the columns and values look right. If the sample is empty, the window shows "No rows came back". In that case, check your Filter conditions and the matching columns of your Join and Exists steps.
  3. Click Publish. The segment gets the Active status, runs according to its refresh schedule, and can be used in Dengage.

Note

Preview is a sample, not a count. The audience count appears after the segment has run. See Check the Segment Runs.

Note

If you leave the editor with unsaved changes, Dengage warns you that they will be lost. Click Cancel in the warning to stay on the page.

From here, the normal campaign flow applies: select the sendable table when you create your campaign.

Check the Segment Runs

After you publish, the segment is rebuilt at every run. Use the list page or the segment itself to start a run, stop the segment, or see what happened in earlier runs.

Start or stop a run

  • An Active segment runs automatically at the times set in its refresh schedule.
  • Click Run now, in the list or in the header of the open segment, to start a run immediately. This is also how you run a segment with the Manual schedule.
  • Click Disable to stop the segment from running.

Open a published segment

When you open an Active segment, you see three tabs under the header:

TabWhat it shows
Current ContentThe canvas that is live now. It is read-only.
Edit ContentStarts a draft of the segment, so you can change it without touching the live version. See Change a Published Segment.
Run HistoryEvery run of the segment: when it started, whether it was Manual or Scheduled, who started it, how long it took, its status and the audience count.

Note

A run that ends with an error keeps the last successful audience, so campaigns are never affected. Open the failed run in Run History to see which step failed. The step is highlighted in red.

Change a Published Segment

A published segment is never edited directly. You make your changes in a draft, and the live version keeps running until the new one is ready.

  1. Open the segment and click Edit Content. Choose Copy from Content to start from the live canvas, or Create Blank Canvas to start from an empty one.
  2. A Draft Content tab opens next to Current Content. Make your changes there. The header now shows Delete Draft, Preview, Save Draft and Publish.
  3. Click Save Draft to keep the draft for later, or Publish to replace the live version. When you publish a new version, you are asked whether to run it now or at the next scheduled time. The current content keeps serving campaigns until the new version completes its first run.

To throw the draft away, click Delete Draft. The published version stays as it is.

Use Cases

Start from what you want to achieve and pick the matching steps.

You want toUse these stepsExample
Keep people who did somethingExists, with the behaviour ExistsContacts who added to cart
Keep people who did not do somethingExists, with the behaviour Not existsEveryone with email consent, except customers who bought in the last 7 days
Use a total, count or average per customerAggregate, then a Filter on the resultCustomers who spent more than 5,000
Add columns from another tableJoinContacts with their open support ticket
Combine three or more tablesTwo or more Joins, two tables at a timeContacts, orders and loyalty tiers
Build "A or B"Two Filters, then UnionTR customers with consent, or DE customers with a high LTV tier
Reach push tokens instead of contactsJoin the Dengage master_device table, then the Token destinationLapsed subscribers who still have the app installed

Example: High-Value Customers

Goal: Customers whose non-refunded orders since a chosen date total more than 5,000.

Tables: an orders table in your own database, and Dengage contacts. Table and column names are examples. Replace them with your own.

  1. Add the orders table. Add a Filter: is_refund equals false, ordered_at is on or after the chosen date.
  2. Add an Aggregate: Group By customer_id, metric sum of amount, output name total_spend.
  3. Add a Filter: total_spend is greater than 5000.
  4. Add the contacts table, then add a Join. L: contacts. R: the Filter from step 3. Join Type: Inner. Key: customer_id = customer_id.
  5. Add the Segment Output. Destination: Contact. Identity Column: customer_id, which holds the contact key. Refresh Schedule: Daily.

Example: Cart Abandoners Who Did Not Buy

Goal: Contacts in Turkey with email consent who added to cart recently but have no purchase.

Tables: Dengage contacts and Dengage events, added three times in total.

  1. Add the contacts table. Add a Filter: country equals TR, consent_email equals true.
  2. Add the events table. Add a Filter: event_type equals add_to_cart, event_time is on or after the chosen date.
  3. Add an Exists. Main: the contacts chain. Check: the events chain from step 2. Behaviour: Exists. Match On: contact_key = contact_key. This keeps only the contacts who added to cart.
  4. Add the events table again. Add a Filter: event_type equals purchase.
  5. Add another Exists. Main: the result of step 3. Check: the events chain from step 4. Behaviour: Not exists. Match On: contact_key = contact_key. This removes the contacts who bought.
  6. Add the Segment Output. Destination: Contact. Identity Column: contact_key. Refresh Schedule: Hourly.

Exists is used instead of Join because you only need to know whether a cart or purchase event exists. You do not need the event columns in the result.

FAQ

Do I need to know SQL?

No. You build the flow with steps. If you want to see the query, open View Generated SQL in the Segment Output step. You cannot paste your own SQL.

Why can't I see how many contacts a step returns?

Counts come from a real run. Preview shows sample rows only. After the segment has run, check the audience count in Run History.

Why is a step missing from the + menu?

Each menu only shows the steps you can add at that point. The inner + offers Filter, Aggregate and Derive. The outer + offers Join, Union, Exists, Derive and Segment Output. If Segment Output is missing, the flow already has one.

Why can't I use a table from my own database?

If the table is marked Not synced yet, click the + button next to it to load its columns. If the table is not listed, use Rescan this source for new tables on the connection.

How do I build an "A or B" audience?

Conditions in a Filter are always combined with AND. Create one Filter for A and one for B, then combine them with Union.

Why does Union say the columns do not match?

Both inputs must have exactly the same column names and matching types. Select the same columns in both Source steps, or add the missing column with Derive.

Why does my Join or Exists step match fewer rows than expected?

Keys are compared exactly, including upper and lower case. Check that both columns hold the same identifier in the same format.

Why does my date filter return unexpected rows?

Date values are sent to the database exactly as you enter them. Enter them in the time zone of the database.

Can I change the output table name?

No. It is created from the segment name and fixed when the segment is first saved, so that anything that uses the table keeps working.

How do I run a segment right now?

Click Run now in the list or in the header of the open segment. This also runs a segment with the Manual schedule.

How do I change a segment that is already Active?

Open it, click Edit Content and choose Copy from Content. Make your changes in the Draft Content tab and click Publish. The current content stays in use until the new version completes its first run.

Does a failed run empty my segment?

No. Campaigns keep using the last successful result.

Why does my limited segment contain different contacts after each run?

Rows are not sorted, so Limit keeps a random set of rows, and each run may return different ones.


Did this page help you?