Segment Query definition
Note
Dynamics 365 Marketing and Dynamics 365 Customer Insights are now Customer Insights - Journeys and Customer Insights - Data. For more information, see Dynamics 365 Customer Insights FAQs
New Customer Insights - Journeys customers receive real-time journeys features only. For more information, see Default real-time journeys installation.
Important
This article only applies to outbound marketing, which will be removed from the product on June 30, 2025. To avoid interruptions, transition to real-time journeys before this date. More information: Transition overview
Dynamic segments are based on segment query (msdyncrm_segmentquery
). You can define a segment query by combing groups of logical expressions, each of which results in a set of contacts
. Each group establishes a path through one or more entities that ends at the Contact
entity (the order matters).
This topic showcases different elements that define a segment query.
PROFILE
This is the base expression for the query which selects all the profiles with a given profile type. The profiles matching the query are the target profiles for the segment.
Syntax
PROFILE(profile_type_name)
Note
Queries using UNION
, MINUS
, INTERSECT
or SEGMENT
functions should select the same profile type.
SEGMENT
Expression to access all the profiles that belong to a segment.
Syntax
SEGMENT(segment_name)
TRAVERSE
Expression to move in the graph using the relationship type provided as a parameter. Optionally an expression can be applied for the current edges to filter the ones that don't meet the conditions.
Syntax
TRAVERSE(relationship_type_name, FILTER(condition))
INTERACTION
Expression to select all the profiles linked to interaction. Similar to PROFILE expression where queries can be run only on a single interaction. Interaction can be used with FILTER and HAVING expression but not with TRAVERSE expression. The link_type_name
value is mandatory.
Syntax
INTERACTION(interaction_type_name, link_type_name)
HAVING
A conditional expression that is used on aggregated interactions. Calculation window is an optional parameter. It defines the time sliding period for computation. The default value is Lifetime. More information Usage Limitation.
Syntax
HAVING(condition, calculation_window)
FILTER
Expression applied for the current node to filter the ones that don't meet the conditions. More information: Usage Limitations
Syntax
FILTER(condition)
NOT
A conditional expression that is used to filter out the results that match the given condition.
Syntax
NOT(condition)
DISTINCT
An Expression that can be called on a node or edge collection to get a distinct set.
Syntax
DISTINCT()
COUNT
An expression that can be called inside HAVING expression, for grouping conditional expression.
Syntax
COUNT()
AVG
An expression that can be called inside HAVING expression, for grouping conditional expression.
Syntax
AVG(propertyName)
MIN
An expression that can be called inside HAVING expression, for grouping conditional expression.
Syntax
MIN(propertyName)
MAX
An expression that can be called inside HAVING expression, for grouping conditional expression.
Syntax
MAX(propertyName)
SUM
An expression that can be called inside HAVING expression, for grouping conditional expression.
Syntax
SUM(propertyName)
UNION
An expression that can be used to join the results of two queries.
EXCEPT
An expression that can be used to remove the results from the second query from results from the first query.
Note
Both queries should select the same profile type as target profile.
INTERSECT
An expression that can be used to select only results returned from both queries.
Note
Both queries should select the same profile type as target profile.
DATETIMEUTCNOW
An expression used to get current date and time (minutes precision) in UTC.
DATE
An expression used to get a date specified by the parameters.
Syntax
DATE(year, month, day, hour, minute, second, millisecond)
DATEDIFF
Expression used to get a difference between two dates.
Syntax
DATEDIFF(datePart, date, date)
DATEADD
An expression used to add a given number of years/months/days/ to a given date.
Syntax
DATEADD(datePart, number, date)
ISNULL
An expression to determine if the property is NULL.
Syntax
ISNULL(propertyName)
ISNOTNULL
An expression to determine if the property is not NULL.
Syntax
ISNOTNULL(propertyName)
propertyName CONTAINS stringValue
String function determining whether the property contains a given substring.
propertyName STARTSWITH stringValue
String function determining whether string property starts with a given substring.
propertyName ENDSWITH stringValue
String function determining whether string property ends with a given substring.
Grammar
Grammar definition describes how you can use the query language.
Dynamic Segment
dynamicSegmentDefinitionQuery = simpleProfileSegmentDefinition | compoundProfileSegmentDefinition | interactionSegmentDefinition
Static Segment
staticSegmentDefinitionQuery = profileFunction | profileFunction.filterFunction | profileFunction.orderByFunction.skipFunction.takeFunction.selectFunction | profileFunction.filterFunction.orderByFunction.skipFunction.takeFunction.selectFunction
Rules
Function | Value |
---|---|
simpleProfileSegmentDefinition | profileFunction or profileFunction.traverseQueryList |
profileFunction | PROFILE(identifier) |
traverseQueryList | traverseQueryList.traverseQuery or traverseQuery |
traverseQuery | traverseFunction or filterFunction |
traverseFunction | TRAVERSE(identifier) or TRAVERSE(identifier,filterFunction) |
filterFunction | FILTER(propertyCondition) |
propertyCondition | comparisonCondition or notFunction or logicalCondition or stringComparisonCondition or nullFunction |
comparisonCondition | valueExpression comparisonOperator valueExpression (valueExpression comparisonOperator valueExpression) |
valueExpression | booleanValue or string or number or aliasedIdentifier or dateDiffFunction or dateAddFunction or dateFunction or dateTimeUtcNowFunction or arithmeticOperation |
booleanValue | True or False |
aliasedIdentifier | identifier or identifier.identifier |
dateDiffFunction | DATEDIFF(datePart,valueExpression,valueExpression) |
datePart | YEAR MONTH DAY HOUR MINUTE SECOND MILLISECOND |
dateAddFunction | DATEADD(datePart,number,valueExpression) |
dateFunction | Date(/year/ number, /month/ number, /day/ number) or Date(/year/ number, /month/ number, /day/ number, /hour/ number) or Date(/year/ number, /month/ number, /day/ number, /hour/ number, /minute/ number) or Date(/year/ number, /month/ number, /day/ number, /hour/ number, /minute/ number, /second/ number) or Date(/year/ number, /month/ number, /day/ number, /hour/ number, /minute/ number, /second/ number, /millisecond/ number) |
dateTimeUtcNowFunction | DATETIMEUTCNOW() |
nullFunction | nullFuctionKeyword |
nullFunctionKeyword | ISNULL or ISNOTNULL |
arithmeticOperation | numericExpression arithmeticOperator numericExpression (numericExpression arithmeticOperator numericExpression) |
numericExpression | number or aliasedIdentifier or arithmeticOperation |
arithmeticOperator | + or - or * or / |
comparisonOperator | == or != or > or >= or < or <= |
notFunction | NOT(propertyCondition) |
logicalCondition | propertyCondition logicalOperator propertyCondition (propertyCondition logicalOperator propertyCondition) |
logicalOperator | &&, OR |
stringComparisonCondition | alisedIdentifier stringComparisonOperator string (aliasedIdentifier stringComparisonOperator string) |
stringComparisonOperator | CONTAINS or STARTSWITH or ENDSWITH |
compoundProfileSegmentDefinition | setOperation |
setOperation | setExpression setOperator setExpression (setExpression setOperator setExpression) |
setExpression | segmentFunction or simpleProfileSegmentDefinition or setOperation |
segmentFunction | SEGMENT(identifier) |
setOperator | UNION or INTERSECT or EXCEPT |
interactionSegmentDefinition | interactionFunction.havingFunction or interactionFunction.filterFunction.havingFunction |
interactionFunction | INTERACTION(identifier,identifier) |
havingFunction | HAVING(aggregationFunction comparisonOperator number, calculationWindowFunctionExpression) or HAVING(aggregationFunction comparisonOperator number) |
aggregationFunction | countFunction or sumFunction or avgFunction or minFunction or maxFunction |
countFunction | COUNT() |
sumFunction | SUM(identifier) |
avgFunction | AVG(identifier) |
minFunction | MIN(identifier) |
maxFunction | MAX(identifier) |
calculationWindowFunctionExpression | daysCalculationWindowFunction or monthsCalculationWindowFunction or yearsCalculationWindowFunction |
daysCalculationWindowFunction | UTCDAYS(number) |
monthsCalculationWindowFunction | UTCMONTHS(number) |
yearsCalculationWindowFunction | UTCYEARS(number) |
orderByFunction | ORDERBY(orderByArgumentList) |
orderByArgumentList | orderByArgumentList,orderByArgument or orderByArgument |
orderByArgument | aliasedIdentifier or aliasedIdentifier sortDirection |
sortDirection | ASC or DESC |
skipFunction | SKIP(number) |
takeFunction | TAKE(number) |
selectFunction | SELECT(propertyList) |
propertyList | propertyList,aliasedIdentifier or aliasedIdentifier |
Usage Limitations
HAVING
Condition forbidden
Function | Operator | Value |
---|---|---|
COUNT () | >= , != |
Positive integer |
>= , != , > , == , <= , < |
Negative numeric Non-integer value |
|
== |
0 | |
SUM (identifer) | No limitation | No limitation |
AVG (identifier) | No limitation | No limitation |
MIN (identifier) | No limitation | No limitation |
MAX (identifier) | No limitation | No limitation |
FILTER(condition)
PROFILE and SEGMENT have no limitation for FILTER(condition). The filter has the only limitation in INTERACTION segment. No support of Date, DATEDIFF, DATEADD, DATETIMEUTCNOW, CONTAINS, STARTSWITH, ENDSWITH.
Examples
Create a segment for leads that participated in
Campaign 1
and that opened any email from this campaign but have not clicked on it.SegmentOnProfilesInCampaign = PROFILE(Campaign).FILTER(Name == 'Campaign 1').TRAVERSE(ActivityContactProcessed_Campaign) SegmentOnEmailOpened = INTERACTION(EmailOpened, EmailOpenedLeadLink).FILTER(Name == 'Campaign 1')).HAVING(COUNT()>0) SegmentOnClicked = INTERACTION(EmailClicked, EmailClickedLeadLink).FILTER(Name == 'Campaign 1')).HAVING(COUNT()>0)
Result
SEGMENT(SegmentInCampaign) UNION SEGMENT(SegmentOnEmailOpened) EXCEPT SEGMENT(SegmentOnClicked)
Filter on all the subscriptions that sent from an email marketing campaign, but without registrations in a specific marketing event.
SegmentOnProfilesInCampaign =PROFILE(Campaign).FILTER(Name == 'Campaign 1').TRAVERSE(EmailSubscriptionSubmit_Campaign) SegmentOnProfilesWithoutRegistration =PROFILE(CampaignEvent).FILTER(Name == 'Even1').TRAVERSE(CampaignEventRegistration_CampaignEvent)
Result
SegmentOnProfilesInCampaign EXCEPT SegmentOnProfilesWithoutRegistration
Find all contacts from leads where the lead date is after the end date of the campaign (of the lead’s marketing context)
PROFILE(Campaign).TRAVERSE(ActivityLeadProcessed_Campaign).FILTER(StartDate > '2017-03-30')
Create a segment for all the credit card customers whose credit card(s) are expiring in the next 30 days to send them a notification email.
PROFILE(CreditCard).FILTER(DATEDIFF(day, ExpirationDate, DateTimeNowUtc()) < 30).TRAVERSE(HavingCreditCard)
Create a segment on all the company customers with at least one active
Purchaseditem pi
such aspi.Product=CreditCard
andpi.expirationDate < [month from today]
(parametric query relative to TODAY so that a marketer can set up automated campaigns via rolling queries).PROFILE(Contact).FILTER(NumberOfActivePurchasedItems > 0 && Product == 'CreditCard' && DATEDIFF(month, ExpirationDate,DATETIMEUTCNOW()) < 1)
Create a segment with all contacts that have not clicked on any link in email 12345 in the last week.
SegmentOnProfile = PROFILE(Contact)SegmentOnClicked = INTERACTION(RedirectLinkClicked, RedirectLinkClicked_ContactLink).HAVING(COUNT()>0, UTCDAYS(7)).FILTER(EmailId=='12345')
Result
SEGMENT(SegmentOnProfile) EXCEPT SEGMENT(SegmentOnClicked)
Filter on preferred activity type of some kinds of sports and select a specific range of age.
PROFILE(Activity).FILTER(ActivityType == 'Football').TRAVERSE('SubscribedToActivity').FILTER(Age > 20 && Age < 35)
Lead the campaign
Always Active
and Grade in5to10k
or higher. Add members fromFitness Challenge to 100
. Intersect with the list ofColorRun
signups. Exclude all the existing members (regular + trial).SegmentOnProfilesFromAlwaysActiveAndFitnessChallenge = PROFILE(Campaign).FILTER(Name == 'Always Active' || Name == 'Fitness Challenge to 100').TRAVERSE (ActivityContactProcessed_Campaign).FILTER(Grade == '5to10k') SegmentOnProfilesFromColorRun =PROFILE(Event).FILTER(Name == 'ColorRun').TRAVERSE(SignedToEvent) SegmentOnProfilesWithMembership =PROFILE(Membership).TRAVERSE(InSubscription, FILTER(Status == 'Active'))
Result
SEGMENT(SegmentOnProfilesFromAlwaysActiveAndFitnessChallenge)INTERSECT SEGMENT(SegmentOnProfilesFromColorRun)EXCEPT SEGMENT(SegmentOnProfilesWithMembership)
Segment all the contacts that have unsubscribed in the last 1 month.
PROFILE(Subscription).TRAVERSE(InSubscription, FILTER(DATEDIFF(month, SubscriptionEndDate, DATETIMEUTCNOW()) 1))
Segment all the contacts who are
Marketing Managers
orSales Managers
OrFinance managers
belonging toHi tech
firms in the US West region with greater than 10 billion revenue and total orders of 1 billion in the last year.PROFILE(Campaign) .FILTER(Market == 'Hi tech' && Revenue > 10000000000 && NumberOfOrders > 1000000000).TRAVERSE(ActivityContactProcessed_Campaign).FILTER(Position =='Marketing Manager' || Position == 'Sales Manager' ||Position == 'Finance Manager')
Segment all contacts part of the
Silver Tier
campaign that receivedEvent X
email but did not register.SegmentOnProfile = PROFILE(Campaign).FILTER(Name == 'Silver Tier').TRAVERSE(ActivityContactProcessed_Campaign) SegmentOnEmailDelivered = INTERACTION(EmailDelivered,EmailDelivered_Campaign).FILTER(CampaignName == 'Silver Tier')).HAVING(COUNT()>0) SegmentRegisteredInEvent =INTERACTION(CampaignEventRegistration,CampaignEventRegistration_CampaignEvent).FILTER(Name == 'Event X')).HAVING(COUNT()>0)
Result
SEGMENT(SegmentOnProfile).UNION(SegmentOnReceivedEmail).EXCEPT(SegmentRegisteredInEvent)
Segment all the contacts whose emails have soft bounced more than 10 times in the last month.
INTERACTION(EmailSoftBounced, EmailSoftBounced_ContactLink).HAVING(COUNT()>10, UTCMONTHS(1))
Segment all the male contacts living in USA between ages 15 to 25 and income is greater than $50K.
PROFILE(Contact).FILTER(Sex == 'M' && Country == 'USA' && Age >= 15 && Age <= 25 && Income > 50000 )
Segment all the CEO contacts having accounts that bought product
Xgenerator
.PROFILE(Contact).FILTER(Position == 'CEO').TRAVERSE(HavingAccount).TRAVERSE(Ordered).FILTER(Name == 'Product Xgenerator')
Segment all the contacts part of the campaign
ThankYou Mkt segment
but have an open service ticket with high priority or medium priority ticket for more than a month.SegmentWithImportantServiceTickets = PROFILE(ServiceTicket).FILTER(State == 'Opened' &&(Priority == 'High' || Priority == 'Medium') && DATEDIFF(month, DATETIMEUTCNOW(), StartDate) > 1)).TRAVERSE(HasServiceTicket)
Result
SEGMENT(SegmentWithImportantServiceTickets)INTERSECT SEGMENT(ThankYouMktSegment) Segment all customers whose birthday is within the next month PROFILE(Customer).FILTER(DATEDIFF(month,Birthday,DATETIMEUTCNOW())
Segment all contacts who unsubscribed after the campaign started.
PROFILE(Contact).FILTER(Unsubscribed > CampaignStartDate)
Segment all the events that contain
run
in the name field.PROFILE(Event).FILTER(Name CONTAINS 'run')
Segment all the events whose names end with
run
.PROFILE(Event).FILTER(Name ENDSWITH 'run')
Segment all the customers without address.
PROFILE(Customer).FILTER(ISNULL(Address))