<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RudderStack Docs – RudderStack Data Apps</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/</link><description>Recent content in RudderStack Data Apps on RudderStack Docs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/index.xml" rel="self" type="application/rss+xml"/><item><title>Archive: Data Apps Overview</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/overview/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/overview/</guid><description/></item><item><title>Archive: Attribution</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/</guid><description>
&lt;blockquote class="announcement">
&lt;div class="tip-quote">
&lt;img src=https://www.rudderstack.com/docs/docs/images/announcement.svg loading="lazy" alt="announcement" decoding="async" class="img__small" style="margin-top: 3px; width: 20px;height: 16px;" />
&lt;div class="tip-text">&lt;p>This feature is in &lt;strong>Beta&lt;/strong>, where we work with early users and customers to test new features and get feedback before making them generally available.&lt;/p>
&lt;p>&lt;a href="mailto:product@rudderstack.com" >Contact the Product team&lt;/a> if you have any questions.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;p>Marketing teams struggle to build a centralized view of paid campaign performance because reporting is siloed in individual ad platforms. To build that cross-platform attribution, data teams are often required to manage complex, high-maintenance models in their data warehouse.&lt;/p>
&lt;p>RudderStack&amp;rsquo;s &lt;strong>Attribution Data App&lt;/strong> simplifies the generation of attribution data sets for first and last touch paid campaigns. As an extension of RudderStack Profiles, this feature provides you with an intuitive configuration for the attribution model, then generates and runs the complex SQL for you in your own warehouse.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="key-features" data-heading="Key features" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h2 id="key-features">Key features&lt;/h2>&lt;ul>
&lt;li>&lt;strong>Unified campaign performance data&lt;/strong>: Consolidates campaign performance data from digital campaigns across ad platforms and ties it to user activity from your apps and websites.&lt;/li>
&lt;li>&lt;strong>Cross-platform tracking&lt;/strong>: Uses the Profiles ID stitcher, which reconciles individual entities from events across devices, sessions, and browsers.&lt;/li>
&lt;li>&lt;strong>Complex entity support for accounts and households&lt;/strong>: Reports on advertising ROI for complex business entities like accounts and households that often have multiple individual users participate in the customer journey.&lt;/li>
&lt;li>&lt;strong>Multiple conversion goals&lt;/strong>: Supports tracking multiple conversion types and multiple conversions for each campaign (purchases, subscriptions, signups, etc.)&lt;/li>
&lt;li>&lt;strong>Paid performance metrics&lt;/strong>: Calculates key metrics like Customer Acquisition Cost (CAC) and Return on Ad Spend (RoAS).&lt;/li>
&lt;li>&lt;strong>Supports flexible, granular reporting&lt;/strong>: Provides daily reports that can be aggregated to different time granularities for any dashboard use case.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="prerequisites" data-heading="Prerequisites" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>&lt;ul>
&lt;li>An active RudderStack Profiles project (v0.18.0 or above).&lt;/li>
&lt;li>Tables with the following data:
&lt;ul>
&lt;li>&lt;strong>Event Stream Data&lt;/strong>: User activity touchpoints (usually the &lt;code>page&lt;/code> and &lt;code>track&lt;/code> call tables) to identify the first and last interaction points.&lt;/li>
&lt;li>&lt;strong>Conversion Data&lt;/strong>: Behavioral conversions you want to track, like &lt;code>track&lt;/code> or &lt;code>identify&lt;/code> tables for user signup or purchase events, or timestamped data points from other platforms, like an &lt;code>Opportunity Created Date&lt;/code> from Salesforce.
&lt;ul>
&lt;li>&lt;strong>Revenue data&lt;/strong> (optional): If you want to measure RoAS, your conversion data points must include a value like revenue, total cost, etc. This data does not necessarily have to be ingested via RudderStack but must have an associated timestamp.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Ad Campaign Data&lt;/strong>: ETL dataset (for example, cost, impressions, and engagement metrics) from platforms like Facebook, Google Ads, LinkedIn, etc.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="project-setup" data-heading="Project setup" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h2 id="project-setup">Project setup&lt;/h2>&lt;p>This section guides you on setting up an &lt;code>attribution&lt;/code> model within an existing Profiles project.&lt;/p>
&lt;html lang="en">
&lt;blockquote class="info">
&lt;div class="tip-quote">
&lt;img src=https://www.rudderstack.com/docs/docs/images/info.svg loading="lazy" alt="info" decoding="async" class="img__small" style="margin-top: 3px; width: 20px;height: 16px;" />
&lt;div class="tip-text">You will first need to &lt;a href="#add-required-components-to-your-profiles-project" >add several components&lt;/a> to your core Profiles project if they don&amp;rsquo;t exist yet. These components are a part of the attribution model configuration.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="add-required-components-to-your-profiles-project" data-heading="Add required components to your Profiles project" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h3 id="add-required-components-to-your-profiles-project">Add required components to your Profiles project&lt;/h3>&lt;p>This section guide assumes you have already created a &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/entities/" >business entity&lt;/a> (like &lt;code>user&lt;/code>) and an &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" >ID stitcher model&lt;/a> for that entity as part of an existing Profiles project.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-1-define-a-campaign-entity" data-heading="Step 1: Define a &lt;code>campaign&lt;/code> entity" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h4 id="step-1-define-a-campaign-entity">Step 1: Define a &lt;code>campaign&lt;/code> entity&lt;/h4>&lt;p>In addition to your business entity, define a &lt;code>campaign&lt;/code> entity in &lt;code>profiles.yaml&lt;/code>. This entity will consolidate campaign data from multiple campaign performance tables.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-2-define-inputs" data-heading="Step 2: Define inputs" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h4 id="step-2-define-inputs">Step 2: Define inputs&lt;/h4>&lt;p>Make sure you have all of the relevant tables from the &lt;a href="#prerequisites" >Prerequisites&lt;/a> section as input data sources in your Profiles project in the &lt;code>inputs.yaml&lt;/code> file.&lt;/p>
&lt;p>There are three types of inputs:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Paid performance data from ad platforms&lt;/strong>:
This is the standard campaign performance data you would load from platforms like Google or Facebook using an ETL tool like Fivetran or Airbyte.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Event data for entity touchpoints&lt;/strong>:
To compute an entity&amp;rsquo;s first and last touch, the attribution model reads from event tables to construct a chronological list of touchpoints. Hence, you must add event tables that represent your customer journey (if these are not already defined as inputs in your existing project).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Event data for conversions&lt;/strong>:
The attribution model reports on conversions and uses the conversion&amp;rsquo;s timestamp to compute the end of the user journey. You must define these conversions as &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/pb-project-yaml/entities/" >&lt;code>entity_vars&lt;/code>&lt;/a> in the &lt;code>profiles.yaml&lt;/code>. Common examples of conversions are &lt;code>first_order_date&lt;/code> or &lt;code>user_signup_date&lt;/code>.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-3-create-a-campaign-id-stitcher-model" data-heading="Step 3: Create a &lt;code>campaign&lt;/code> ID Stitcher model" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h4 id="step-3-create-a-campaign-id-stitcher-model">Step 3: Create a &lt;code>campaign&lt;/code> ID Stitcher model&lt;/h4>&lt;p>Add an &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/profiles-yaml/id-stitcher/" >ID Stitching&lt;/a> model for your &lt;code>campaign&lt;/code> entity in the &lt;code>profiles.yaml&lt;/code> file and configure it with following specifications:&lt;/p>
&lt;ul>
&lt;li>Link various campaign identifiers like &lt;code>utm_campaign&lt;/code>, &lt;code>campaign_id&lt;/code>, etc.&lt;/li>
&lt;li>Include user-journey tables (for example, &lt;code>pages&lt;/code>, &lt;code>tracks&lt;/code>) in this stitcher.&lt;/li>
&lt;li>Ensure that the campaign identifier columns like &lt;code>utm_campaign&lt;/code> contribute to the ID graph.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="configure-attributionyaml" data-heading="Configure &lt;code>attribution.yaml&lt;/code>" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h3 id="configure-attributionyaml">Configure &lt;code>attribution.yaml&lt;/code>&lt;/h3>&lt;p>RudderStack recommends creating a new file &lt;code>attribution.yaml&lt;/code> to keep your Profiles project organized. You can copy the &lt;a href="#sample-yaml-for-the-attribution-model" >sample model config code&lt;/a> to get started.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-1-configure-touchpoints" data-heading="Step 1: Configure touchpoints" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h4 id="step-1-configure-touchpoints">Step 1: Configure touchpoints&lt;/h4>&lt;p>Add your inputs as &lt;code>touchpoints&lt;/code> in the &lt;code>attribution.yaml&lt;/code> file.&lt;/p>
&lt;p>Note that each table must satisfy the following conditions to be used as a part of the user journey that the attribution model creates:&lt;/p>
&lt;ul>
&lt;li>It must be a part of both entities&amp;rsquo; ID graph (user and campaign ID graph in this case).&lt;/li>
&lt;li>It must have a timestamp column denoting the time when the user saw/clicked the campaign. This is defined as the &lt;code>occured_at_col&lt;/code> key.&lt;/li>
&lt;/ul>
&lt;p>A sample &lt;code>touchpoints&lt;/code> configuration is shown:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">touchpoints&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/mobile_pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">where&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">timestamp &amp;gt;= {{user.signup_date}}&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># optional&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The &lt;code>where&lt;/code> clause is optional and helps in filtering the parts of user journey that should not be considered for some conversions. For example, if you want to measure the efficiency of retargeting campaigns, you might not want to include the early parts of user journey. The &lt;code>where&lt;/code> key takes a valid SQL where clause string, similar to the &lt;code>where&lt;/code> clause in &lt;code>entity_vars&lt;/code>. All the columns should be present in the same input table or can refer to the &lt;code>entity_vars&lt;/code> of the model entity.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-2-define-conversions" data-heading="Step 2: Define conversions" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h4 id="step-2-define-conversions">Step 2: Define conversions&lt;/h4>&lt;p>Add the &lt;code>entity_vars&lt;/code> that represent your conversions. Note that you can report on multiple conversions for each attribution model.&lt;/p>
&lt;p>Optionally, you can define a &lt;code>value&lt;/code> for each conversion, which the attribution model will use to compute total value generated and RoAS for each campaign.&lt;/p>
&lt;p>A sample &lt;code>conversion_vars&lt;/code> configuration is shown:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">conversion_vars&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">payer_conversion&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">timestamp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user.first_paid_date&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">value: user.first_order_amount # Optional - adding this creates an extra column called &amp;lt;conversion&amp;gt;_&amp;lt;model&amp;gt;_value (ex&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">signup_first_touch_value)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">conversion_window&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">30d&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Optional - takes values in minutes, hours, and days, 30m, 4h, 7d, etc. If provided, RudderStack considers the conversion to have happened if it is within this range only.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mql&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">timestamp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user.user_mql_conversion_dt&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-3-configure-campaigns" data-heading="Step 3: Configure campaigns" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h4 id="step-3-configure-campaigns">Step 3: Configure campaigns&lt;/h4>&lt;p>To configure your campaigns, add the start date, end date, and any columns generated by the campaign ID stitcher that you want to include in the attribution model output as campaign &lt;code>entity_vars&lt;/code>.&lt;/p>
&lt;p>The following snippet highlights a sample &lt;code>campaign&lt;/code> configuration:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">campaign&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">entity_key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">campaign&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">campaign_start_date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">campaign_start_date&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">campaign_end_date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">campaign_end_date&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">campaign_vars&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c">#These represent columns that will be repeated and are pulled from the campaign_var table&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">campaign_name&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">url&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">utm_source&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">utm_medium&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">utm_channel &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-4-define-campaign-performance-data" data-heading="Step 4: Define campaign performance data" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h4 id="step-4-define-campaign-performance-data">Step 4: Define campaign performance data&lt;/h4>&lt;p>Lastly, define the campaign performance data points for &lt;code>cost&lt;/code>, &lt;code>impressions&lt;/code>, and &lt;code>clicks&lt;/code>. RudderStack has standardized these for the campaign performance data loaded through Fivetran and Airbyte. Contact &lt;a href="mailto:support@rudderstack.com" >RudderStack Support&lt;/a> to request the templates.&lt;/p>
&lt;p>A sample &lt;code>cost&lt;/code> configuration is shown:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">campaign_details&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c">#These represent columns that will be computed daily&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">cost&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/ga_campaign_stats&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">date &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(cost_micros / 1000000 )&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/lkdn_ad_analytic_campaign&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">day &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(cost_in_usd)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/fb_basic_campaign&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">date &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(spend)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote class="warning">
&lt;div class="tip-quote">
&lt;img src=https://www.rudderstack.com/docs/docs/images/warning.svg alt="warning" loading="lazy" decoding="async" class="img__small" style="
margin-top: 3px; width: 20px;height: 16px;" />
&lt;div class="tip-text">RudderStack will not be able to compute the RoAS and CAC fields if you do not provide the &lt;code>cost&lt;/code> configuration.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="sample-yaml-for-the-attribution-model" data-heading="Sample yaml for the attribution model" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h4 id="sample-yaml-for-the-attribution-model">Sample yaml for the attribution model&lt;/h4>&lt;p>After completing the above steps, your &lt;code>attribution.yaml&lt;/code> file will look similar to the following example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">campaign_performance_report&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">model_type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">attribution&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">model_spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">entity_key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">conversion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c">#entity_key: user&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">touchpoints&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/mobile_pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">conversion_vars&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">payer_conversion&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">timestamp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user.first_paid_date&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">value: user.first_order_amount # Optional - adding this creates an extra column called &amp;lt;conversion&amp;gt;_&amp;lt;model&amp;gt;_value (ex&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">signup_first_touch_value)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">conversion_window&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">30d&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">mql&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">timestamp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user.user_mql_conversion_dt&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c"># default lookback_value = 90 days&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">campaign&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">entity_key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">campaign&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">campaign_start_date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">campaign_start_date&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">campaign_end_date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">campaign_end_date&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">campaign_vars&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c">#These represent columns that will be repeated and are pulled from the campaign_var table&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">campaign_name&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">url&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">utm_source&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">utm_medium&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">utm_channel&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">campaign_details&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c">#These represent columns that will be computed daily&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">cost&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/ga_campaign_stats&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">date &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(cost_micros / 1000000 )&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/lkdn_ad_analytic_campaign&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">day &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(cost_in_usd)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/fb_basic_campaign&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">date &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(spend)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">impressions&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/ga_campaign_stats&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">date &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(impressions)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/lkdn_ad_analytic_campaign&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">day &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(total_impressions)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/fb_basic_campaign&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">date &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(imp)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">clicks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/ga_campaign_stats&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">date &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(clicks)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/lkdn_ad_analytic_campaign&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">day &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(total_clicks)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/fb_basic_campaign&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">date &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(clicks) &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note that:&lt;/p>
&lt;ul>
&lt;li>The &lt;code>touchpoints&lt;/code> section defines the user journey data sources.&lt;/li>
&lt;li>The &lt;code>conversion_vars&lt;/code> specify the conversion types and their associated data.&lt;/li>
&lt;li>The &lt;code>campaign&lt;/code> section outlines campaign-specific variables and daily performance metrics.&lt;/li>
&lt;li>Ensure that all the referenced inputs and variables are properly set up in your Profiles configuration.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-5-run-your-project" data-heading="Step 5: Run your project" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h4 id="step-5-run-your-project">Step 5: Run your project&lt;/h4>&lt;p>After configuring your project, you can run it using one of the following methods:&lt;/p>
&lt;p>&lt;strong>Using Profile CLI&lt;/strong>&lt;/p>
&lt;p>If you have created your Profiles project locally, run it using the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/run-project/#run" >&lt;code>pb run&lt;/code> CLI command&lt;/a> to generate output tables.&lt;/p>
&lt;p>&lt;strong>Using Profiles UI&lt;/strong>&lt;/p>
&lt;p>Run your Profiles project by first uploading it to a Git repository and then &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/management/import-from-git/#steps" >importing it in the RudderStack dashboard&lt;/a>.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="output" data-heading="Output" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/attribution/" data-title="Attribution" -->
&lt;h2 id="output">Output&lt;/h2>&lt;p>Once your project run is complete, Profiles generates an output table in your warehouse in the following format:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Column name&lt;/th>
&lt;th style="text-align:left">Description&lt;/th>
&lt;th style="text-align:left">Data source&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">REPORT_DATE&lt;/td>
&lt;td style="text-align:left">Report generation date. This is a constant value for all the rows in a table per output. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: 19 July 2024&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">CAMPAIGN_DATE&lt;/td>
&lt;td style="text-align:left">Actual interaction and spend date. For each campaign, RudderStack gets one row per date, from &lt;code>campaign_start_date&lt;/code> till &lt;code>campaign_end_date&lt;/code>, or current date, whichever is earliest. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: 19 July 2024&lt;/td>
&lt;td style="text-align:left">-&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">CAMPAIGN_PROFILE_ID&lt;/td>
&lt;td style="text-align:left">Unique campaign identifier created by the Profiles ID stitcher. The column name is not fixed and depends on the entity name. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: rid033e88e4a945b710dab3e67c08391d65&lt;/td>
&lt;td style="text-align:left">Profiles&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">IMPRESSIONS&lt;/td>
&lt;td style="text-align:left">Total daily impressions. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: 364&lt;/td>
&lt;td style="text-align:left">Definition of &lt;code>campaign_details&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">CLICKS&lt;/td>
&lt;td style="text-align:left">Total daily clicks. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: 112&lt;/td>
&lt;td style="text-align:left">Definition of &lt;code>campaign_details&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">COST (&lt;strong>A&lt;/strong>)&lt;/td>
&lt;td style="text-align:left">Daily ad spend. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: $119.27&lt;/td>
&lt;td style="text-align:left">Definition of &lt;code>campaign_details&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">COUNT_DISTINCT_VIEWS&lt;/td>
&lt;td style="text-align:left">Unique users who clicked. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: 76&lt;/td>
&lt;td style="text-align:left">&lt;a href="#prerequisites" >Event stream&lt;/a>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">COUNT_TOTAL_VIEWS&lt;/td>
&lt;td style="text-align:left">Total page views. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: 102&lt;/td>
&lt;td style="text-align:left">Event stream&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">[CONVERSION_TYPE]_FIRST_TOUCH_COUNT (&lt;strong>B&lt;/strong>)&lt;/td>
&lt;td style="text-align:left">First-touch attributed conversions. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: 3&lt;/td>
&lt;td style="text-align:left">Event stream&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">[CONVERSION_TYPE]_LAST_TOUCH_COUNT (&lt;strong>C&lt;/strong>)&lt;/td>
&lt;td style="text-align:left">Last-touch attributed conversions. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: 2&lt;/td>
&lt;td style="text-align:left">Event stream&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">[CONVERSION_TYPE]_FIRST_TOUCH_CONVERSION_VALUE (&lt;strong>D&lt;/strong>)&lt;/td>
&lt;td style="text-align:left">First-touch conversion value. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: $200.00&lt;/td>
&lt;td style="text-align:left">Event stream or payment platform&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">[CONVERSION_TYPE]_LAST_TOUCH_CONVERSION_VALUE (&lt;strong>E&lt;/strong>)&lt;/td>
&lt;td style="text-align:left">Last-touch conversion value. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: $150.00&lt;/td>
&lt;td style="text-align:left">Event stream or payment platform&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">[CONVERSION_TYPE]_FIRST_TOUCH_COST_PER_CONV&lt;/td>
&lt;td style="text-align:left">First-touch CAC (&lt;strong>A/B&lt;/strong>) &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: $39.76&lt;/td>
&lt;td style="text-align:left">Calculated&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">[CONVERSION_TYPE]_LAST_TOUCH_COST_PER_CONV&lt;/td>
&lt;td style="text-align:left">Last-touch CAC. (&lt;strong>A/C&lt;/strong>) &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: $59.64&lt;/td>
&lt;td style="text-align:left">Calculated&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">[CONVERSION_TYPE]_FIRST_TOUCH_ROAS&lt;/td>
&lt;td style="text-align:left">First-touch RoAS. (&lt;strong>D/A&lt;/strong>) &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: $1.68&lt;/td>
&lt;td style="text-align:left">Calculated&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">[CONVERSION_TYPE]_LAST_TOUCH_ROAS&lt;/td>
&lt;td style="text-align:left">Last-touch RoAS. (&lt;strong>E/A&lt;/strong>) &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: $1.26&lt;/td>
&lt;td style="text-align:left">Calculated&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">[CONVERSION_TYPE]_AVG_DAYS_TO_CONVERT_FROM_FIRST_TOUCH&lt;/td>
&lt;td style="text-align:left">Average days between the first touch date and conversion date for all users of that specific campaign whose first touch was on &lt;code>campaign_date&lt;/code>. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: 15&lt;/td>
&lt;td style="text-align:left">Calculated&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">[CONVERSION_TYPE]_TOTAL_DAYS_TO_CONVERT_FROM_FIRST_TOUCH_ACROSS_USERS&lt;/td>
&lt;td style="text-align:left">Total days between the first touch date and conversion date for all users of that specific campaign whose first touch was on &lt;code>campaign_date&lt;/code>. This is helpful if you roll the report to a different dimension, as average is not additive. Sum of this column, divided by the sum of the total conversions would give a new average at any granularity. &lt;br/>&lt;br/> &lt;strong>Example&lt;/strong>: 30&lt;/td>
&lt;td style="text-align:left">Calculated&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>If you define multiple conversions, the &lt;code>[CONVERSION_TYPE]_&lt;/code> columns are repeated for each conversion, for example, &lt;code>signup_first_touch_count&lt;/code>, &lt;code>subscribed_first_touch_count&lt;/code>, etc.&lt;/p></description></item><item><title>Archive: Propensity Scores</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/</guid><description>
&lt;blockquote class="announcement">
&lt;div class="tip-quote">
&lt;img src=https://www.rudderstack.com/docs/docs/images/announcement.svg loading="lazy" alt="announcement" decoding="async" class="img__small" style="margin-top: 3px; width: 20px;height: 16px;" />
&lt;div class="tip-text">&lt;p>This feature is in &lt;strong>Beta&lt;/strong>, where we work with early users and customers to test new features and get feedback before making them generally available.&lt;/p>
&lt;p>&lt;a href="mailto:product@rudderstack.com" >Contact the Product team&lt;/a> if you have any questions.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;p>Using Profile&amp;rsquo;s &lt;strong>Propensity Scores&lt;/strong> Data App, you can predict the likelihood of user actions using machine learning (ML) algorithms. These predictive capabilities enable data-driven decision-making by calculating scores that represent the probability of a user performing a specific action within a predefined timeframe, for example:&lt;/p>
&lt;ul>
&lt;li>Is a customer likely to churn in the next 30 days?&lt;/li>
&lt;li>Will a user make a purchase in the next 14 days?&lt;/li>
&lt;li>Is a lead likely to convert in the next 7 days?&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="use-cases" data-heading="Use cases" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h2 id="use-cases">Use cases&lt;/h2>&lt;ul>
&lt;li>&lt;strong>Reduced churn&lt;/strong>: Identify users at risk of churning and implement targeted interventions to retain them.&lt;/li>
&lt;li>&lt;strong>Increased conversions&lt;/strong>: Prioritize leads with a higher propensity to convert, boosting your marketing campaign effectiveness.&lt;/li>
&lt;li>&lt;strong>Improved resource allocation&lt;/strong>: Focus resources on high-value user segments for maximized impact.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="prerequisites" data-heading="Prerequisites" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>&lt;ul>
&lt;li>An active RudderStack Profiles project (v0.18.0 or above) using a &lt;a href="https://www.rudderstack.com/docs/destinations/warehouse-destinations/snowflake/" >Snowflake&lt;/a>, &lt;a href="https://www.rudderstack.com/docs/destinations/warehouse-destinations/bigquery/" >BigQuery&lt;/a>, or &lt;a href="https://www.rudderstack.com/docs/destinations/warehouse-destinations/redshift/" >Redshift&lt;/a> warehouse.&lt;/li>
&lt;li>&lt;strong>(Optional)&lt;/strong> If you are using Snowflake, you might need to create a &lt;a href="https://www.snowflake.com/en/data-cloud/snowpark/" >Snowpark&lt;/a>-optimized warehouse if your dataset is significantly large.&lt;/li>
&lt;li>Install the &lt;code>profiles-mlcorelib&lt;/code> library in your Python environment using &lt;code>pip install profiles-mlcorelib&lt;/code>. Note that it should be the same Python environment as the &lt;code>profiles-rudderstack&lt;/code> library.
&lt;ul>
&lt;li>For &lt;strong>Redshift&lt;/strong> and &lt;strong>BigQuery&lt;/strong>: Python versions between 3.9.0 to 3.11.10 are supported.&lt;/li>
&lt;li>For &lt;strong>Snowflake&lt;/strong>: Python version must be ≥ 3.9.0 and &amp;lt; 3.11.0.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;blockquote class="warning">
&lt;div class="tip-quote">
&lt;img src=https://www.rudderstack.com/docs/docs/images/warning.svg alt="warning" loading="lazy" decoding="async" class="img__small" style="
margin-top: 3px; width: 20px;height: 16px;" />
&lt;div class="tip-text">RudderStack strongly recommends using an isolated and clean &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/create-new-project/#create-virtual-environment" >Python virtual environment&lt;/a>.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;ul>
&lt;li>
&lt;p>Update your &lt;code>pb_project.yaml&lt;/code> file to include the library:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">python_requirements&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">profiles_mlcorelib&amp;gt;=0.7.2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="project-setup" data-heading="Project setup" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h2 id="project-setup">Project setup&lt;/h2>&lt;p>Follow these steps to set up a propensity model that generates propensity scores within an existing Profiles project:&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-1-define-the-label-prediction-target" data-heading="Step 1: Define the label (prediction target)" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h3 id="step-1-define-the-label-prediction-target">Step 1: Define the label (prediction target)&lt;/h3>&lt;p>Identify and define the action you want to predict (also known as label), for example, inactivity churn, subscription churn, a lead conversion, payer conversion, reactivation, etc.&lt;/p>
&lt;p>Suppose you want to predict whether a user will pay for your product. You can create a label named &lt;code>is_payer&lt;/code> which takes the value as &lt;code>true&lt;/code> for users who have paid and &lt;code>false&lt;/code> for those who haven&amp;rsquo;t.&lt;/p>
&lt;p>A sample &lt;code>entity_var&lt;/code> definition of &lt;code>is_payer&lt;/code> label will be:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">entity_var&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">is_payer&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">case when user.revenue &amp;gt; 0 then 1 else 0 end&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="label-data-types" data-heading="Label data types" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h4 id="label-data-types">Label data types&lt;/h4>&lt;p>For propensity modeling, the data type must be &lt;strong>Boolean&lt;/strong> or &lt;strong>Binary&lt;/strong>, that is, the label must have only two distinct values like &lt;code>0/1&lt;/code>, &lt;code>true/false&lt;/code>, &lt;code>yes/no&lt;/code>, etc.&lt;/p>
&lt;html lang="en">
&lt;blockquote class="info">
&lt;div class="tip-quote">
&lt;img src=https://www.rudderstack.com/docs/docs/images/info.svg loading="lazy" alt="info" decoding="async" class="img__small" style="margin-top: 3px; width: 20px;height: 16px;" />
&lt;div class="tip-text">&lt;p>Although not the primary focus on the Propensity model, it can also be used to predict numeric values. In that case the label is a continuous numeric value.&lt;/p>
&lt;p>This can be used, for example, for predictions like predicted LTV or predicted purchase total in the next 30 days.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-2-define-the-relevant-entity_vars" data-heading="Step 2: Define the relevant &lt;code>entity_vars&lt;/code>" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h3 id="step-2-define-the-relevant-entity_vars">Step 2: Define the relevant &lt;code>entity_vars&lt;/code>&lt;/h3>&lt;p>You need to specify the user set for model training. For example, you can define following &lt;code>entity_vars&lt;/code> that may predict whether a user is likely to spend anything in future:&lt;/p>
&lt;ul>
&lt;li>Number of days since the user was last seen&lt;/li>
&lt;li>Number of user sessions&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">- &lt;span class="nt">entity_var&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">days_since_last_seen&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{macro_datediff(&amp;#39;max(timestamp)&amp;#39;)}}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">models/rsPages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>- &lt;span class="nt">entity_var&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">n_sessions&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">count(distinct session_id)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/rsPages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">default_value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Some &lt;code>entity_vars&lt;/code> may not directly depend on the label and you may not want to train the model on all the users. Define the &lt;code>entity_vars&lt;/code> for an eligible user set. For example, to predict a user&amp;rsquo;s likelihood of paying for a product, define the following features:&lt;/p>
&lt;ul>
&lt;li>New users who created their account within the past 30 days.&lt;/li>
&lt;li>Users belonging to US.&lt;/li>
&lt;li>Users who haven&amp;rsquo;t made any purchases so far.&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">- &lt;span class="nt">entity_var&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">days_since_account_creation&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{macro_datediff(&amp;#39;min(timestamp)&amp;#39;)}}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">models/identifies&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>- &lt;span class="nt">entity_var&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">country&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">any_value(country)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">models/identifies&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>- &lt;span class="nt">entity_var&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">revenue&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sum(amount_spent)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/orderCompleted&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">default_value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;html lang="en">
&lt;blockquote class="info">
&lt;div class="tip-quote">
&lt;img src=https://www.rudderstack.com/docs/docs/images/info.svg loading="lazy" alt="info" decoding="async" class="img__small" style="margin-top: 3px; width: 20px;height: 16px;" />
&lt;div class="tip-text">&lt;p>Ensure that the &lt;code>entity_vars&lt;/code> for features and label originate from input tables with a defined &lt;code>occured_at_col&lt;/code> value.&lt;/p>
&lt;p>This enables Profiles to correctly materialize past data while considering specific timeframes. Without this, you might get overly optimistic models with misleading metrics.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-3-set-the-prediction-window" data-heading="Step 3: Set the prediction window" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h3 id="step-3-set-the-prediction-window">Step 3: Set the prediction window&lt;/h3>&lt;p>Define the time frame within which you want to predict the user behavior. The &lt;code>predict_window_days&lt;/code> setting determines this period, for example, you might want to predict churn within the next 30 days.&lt;/p>
&lt;p>The value for &lt;code>predict_window_days&lt;/code> is use case-dependent. For instance, a daily-use game might benefit from a 7-day churn prediction window, while a monthly subscription service might require a 3-month window.&lt;/p>
&lt;p>A sample &lt;code>profiles.yaml&lt;/code> with &lt;code>propensity&lt;/code> model type and &lt;code>predict_window_days&lt;/code> setting:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">models&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">payer_propensity_model&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">model_type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">propensity&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">model_spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">inputs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">entity/user/days_since_account_creation&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">entity/user/days_since_last_seen&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">entity/user/revenue&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">entity/user/is_payer&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">entity/user/country&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">entity/user/n_sessions&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">training&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">predict_var&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">entity/user/is_payer &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">label_value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">predict_window_days&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">30&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">eligible_users&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">days_since_account_creation &amp;lt;= 30 and country = &amp;#39;US&amp;#39; and revenue = 0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note that:&lt;/p>
&lt;ul>
&lt;li>All the features and label used by the model (defined as &lt;code>entity_vars&lt;/code>), are provided as a list in &lt;code>inputs&lt;/code>.&lt;/li>
&lt;li>RudderStack appends the value of &lt;code>eligible_users&lt;/code> key to an SQL query, forming a query like &lt;code>select * from user_var_table where &amp;lt;eligible_users&amp;gt;&lt;/code>. Hence, you must define all the columns used in &lt;code>eligible_users&lt;/code> key as &lt;code>entity_vars&lt;/code>.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-4-name-the-predictive-features" data-heading="Step 4: Name the predictive features" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h3 id="step-4-name-the-predictive-features">Step 4: Name the predictive features&lt;/h3>&lt;p>Specify the features you want to predict within the &lt;code>prediction&lt;/code> block. Here&amp;rsquo;s an example for predicting the payer propensity:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">prediction&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">output_columns&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">percentile&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">payer_propensity_percentile&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Percentile score of a user&amp;#39;s likelihood to pay in the next 30 days&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">score&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">payer_propensity_probability&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Probability score of a user&amp;#39;s likelihood to pay in the next 30 days&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="sample-yaml-for-a-predictive-feature" data-heading="Sample YAML for a predictive feature" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h4 id="sample-yaml-for-a-predictive-feature">Sample YAML for a predictive feature&lt;/h4>&lt;p>After completing the above steps, a complete sample &lt;code>profiles.yaml&lt;/code> file for a predictive feature will look as follows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">models&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">payer_propensity_model&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">model_type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">propensity&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">model_spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">entity_key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">training&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">predict_var&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">entity/user/is_payer&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">label_value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">predict_window_days&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">30&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">validity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">month &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">classification &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">eligible_users&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">days_since_account_creation &amp;lt;= 30 and country = &amp;#39;US&amp;#39; and revenue = 0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">max_row_count&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">50000&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">warehouse&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">snowpark_optimised_medium&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Optional, only for Snowflake. &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">recall_to_precision_importance&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">1.0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">new_materialisations_config&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">strategy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">auto&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">feature_data_min_date_diff&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">14&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">max_no_of_dates&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">dates&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s1">&amp;#39;2024-01-01,2024-01-08&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># (feature_date, label_date)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s1">&amp;#39;2024-02-01,2024-02-08&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s1">&amp;#39;2024-03-01,2024-03-08&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ignore_features&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">country &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">prediction&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">output_columns&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">percentile&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">payer_propensity_percentile&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Percentile score of a user&amp;#39;s likelihood to pay in the next 30 days&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">score&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">payer_propensity_probability&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Probability score of a user&amp;#39;s likelihood to pay in the next 30 days&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">is_feature&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">eligible_users&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;*&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># (Optional) Defaults to what&amp;#39;s in training.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">warehouse&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">snowpark_optimised_small&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Optional, only for Snowflake. &lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">inputs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">entity/user/days_since_account_creation&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">entity/user/days_since_last_seen&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">entity/user/revenue&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">entity/user/is_payer&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">entity/user/country&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">entity/user/n_sessions&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can setup multiple predictive features within the same Profiles project by repeating the whole block for each predictive feature.&lt;/p>
&lt;p>The following table explains the fields used in the above file:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Parameter&lt;/th>
&lt;th style="text-align:left">&lt;div style="width:325px">Description&lt;/div>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;code>name&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Name of the model.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>model_type&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Model type. Set this to &lt;code>propensity&lt;/code>.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>model_spec&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Detailed configuration specification for the model.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>entity_key&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Entity to be used.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>training&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Configuration used for training.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>predict_var&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">&lt;code>entity_var&lt;/code> for which you want make predictions.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>label_value&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Value of label column for which prediction needs to be generated.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>predict_window_days&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Time period within which you want to predict the user behavior.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>validity&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Time period to re-train the model. Allowed values are: &lt;code>day&lt;/code>, &lt;code>week&lt;/code>, &lt;code>month&lt;/code>. &lt;br/>&lt;br/>Re-training helps keep the model up-to-date with changing user behavior. But it comes with the cost of increased compute time and resource usage. So its preferable to keep the validity longer (for example, month) if you expect the user behavior doesn&amp;rsquo;t change too frequently.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>type&lt;/code>&lt;/td>
&lt;td style="text-align:left">Tells the model whether you are trying to predict a Boolean feature (for example, &lt;code>yes&lt;/code>/&lt;code>no&lt;/code>, &lt;code>churned&lt;/code>/&lt;code>not_churned&lt;/code>, &lt;code>converted&lt;/code>/&lt;code>not_converted&lt;/code>, etc.), or a numeric feature (for example, &lt;code>amount_spent&lt;/code>).&lt;br />&lt;br />Note that:&lt;br />&lt;br />&lt;ul>&lt;li>The type should be &lt;code>classification&lt;/code> if it is a Boolean feature and &lt;code>regression&lt;/code> if it is numeric.&lt;/li>&lt;li>If not specified, this parameter defaults to &lt;code>classification&lt;/code> - so you can skip this parameter if you are predicting churn, subscription, etc.&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>eligible_users&lt;/code>&lt;/td>
&lt;td style="text-align:left">User set for model training. RudderStack appends the value of &lt;code>eligible_users&lt;/code> key to an SQL query, forming a query like &lt;code>select * from user_var_table where &amp;lt;eligible_users&amp;gt;&lt;/code>. Hence, you must define all the columns used in &lt;code>eligible_users&lt;/code> key as &lt;code>entity_vars&lt;/code>. &lt;br/> &lt;br/>If not provided, it defaults to users who have &lt;code>predict_var != label_value&lt;/code> during feature generation period, that is, it generates propensity scores for all the users who have not yet converted in the feature generation period.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>max_row_count&lt;/code>&lt;/td>
&lt;td style="text-align:left">Maximum number of samples used for ML model training. Default value is 30,000. &lt;br />&lt;br />Note that:&lt;br />&lt;br />&lt;ul>&lt;li>This parameter only affects sampling when there are more eligible users than this limit. If the number of eligible users is below this threshold, all available samples are used.&lt;/li>&lt;li>This parameter is only an upper limit - the model can train with fewer samples and does not require this many samples to function.&lt;/li>&lt;li>You can use the &lt;code>new_materialisations_config&lt;/code> parameter to force the model to use more data points.&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>warehouse&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;strong>Optional parameter for Snowflake warehouses only.&lt;/strong> Specifies a dedicated compute warehouse for ML operations. &lt;br/>&lt;br/>Note that:&lt;br/>&lt;br/>&lt;ul>&lt;li>By default, propensity models use the same warehouse as the main Profiles run. However, since ML training and prediction are compute and memory-intensive processes, you may want to use a Snowpark-optimized warehouse for better performance.&lt;/li>&lt;li>You can configure this parameter independently for both &lt;code>training&lt;/code> and &lt;code>prediction&lt;/code> sections to use different warehouse sizes for each phase (for example, a larger warehouse for training and a smaller one for prediction).&lt;/li>&lt;li>If not specified, it defaults to the warehouse used by the parent Profiles run.&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>recall_to_precision_importance&lt;/code>&lt;/td>
&lt;td style="text-align:left">An advanced feature that adjusts the balance between false positives and false negatives in the model&amp;rsquo;s output. If reducing false positives is more important, set the value closer to 0 (for example, 0.3). &lt;br/> &lt;br/>If reducing false negatives is the priority, use a value greater than 1 (for example, 3.0). False positives are costly when it leads to unnecessary actions, such as sending a promo code to loyal users incorrectly identified as at risk of churning. On the other hand, false negatives are more problematic when missing out on targeting someone could lead to a permanent loss, such as a subscription customer who churns and never returns. &lt;br/> &lt;br/>If you&amp;rsquo;re unsure about which to prioritize, you can leave the value at the default of 1.0 (or simply omit the parameter, and the model will automatically set it to 1.0).&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>new_materialisations_config&lt;/code>&lt;/td>
&lt;td style="text-align:left">This block lets you configure the training data for model in case there is not enough data. See &lt;a href="#how-does-the-model-select-data-for-training" >FAQ&lt;/a> for more information.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>ignore_features&lt;/code>&lt;/td>
&lt;td style="text-align:left">List of &lt;code>entity_var&lt;/code> names that are a part of the inputs but should be ignored by the model. This usually happens when your input is a SQL model where there are too many defined features for purposes unrelated to the predictive features.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>prediction&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Configuration used for prediction. It mainly lists the names of output columns and eligible users for whom predictions are to be generated.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>output_columns&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Configuration for output columns to be generated.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>percentile&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Configuration of the column in output table having percentile score.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>name&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Name of the column in output table having percentile score.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>description&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Custom description for the percentile column.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>score&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Configuration of the column in output table having probabilistic score.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>name&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Name of the column in output table having probabilistic score.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>description&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">Custom description for the score column.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>is_feature&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">If set to &lt;code>False&lt;/code>, this feature won&amp;rsquo;t be available in final C360 table. Defaults to True.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>inputs&lt;/code> &lt;br/> &lt;span style="color: #4D4DFF;font-size:12px;">Required&lt;/span>&lt;/td>
&lt;td style="text-align:left">List of input models and &lt;code>entity_vars&lt;/code> used by the model. &lt;br/> &lt;br/> You must include the label column and vars used in the &lt;code>eligible_users&lt;/code> definition here, along with the list of features that the model uses to train. &lt;br/> &lt;br/> &lt;strong>Note&lt;/strong>: All inputs of the propensity model must be features.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-5-run-your-project" data-heading="Step 5: Run your project" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h3 id="step-5-run-your-project">Step 5: Run your project&lt;/h3>&lt;p>After configuring your project, you can run it using one of the following methods:&lt;/p>
&lt;p>&lt;strong>Using Profile CLI&lt;/strong>&lt;/p>
&lt;p>If you have created your Profiles project locally, run it using the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/run-project/" >&lt;code>pb run&lt;/code> CLI command&lt;/a> to generate the output tables.&lt;/p>
&lt;p>&lt;strong>Using Profiles UI&lt;/strong>&lt;/p>
&lt;p>Run your Profiles project by first uploading it to a Git repository and then &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/management/import-from-git/#steps" >importing it in the RudderStack dashboard&lt;/a>.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="output" data-heading="Output" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h2 id="output">Output&lt;/h2>&lt;p>Once your project run is complete, you can view the following outputs:&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="training-output" data-heading="Training output" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h3 id="training-output">Training output&lt;/h3>&lt;p>The model generates several outputs based on its &lt;code>training&lt;/code> parameters, including charts and a JSON file with metrics. RudderStack stores these artifacts in the outputs folder &lt;code>outputs/seq_no/&amp;lt;seq_no&amp;gt;/run/Material_&amp;lt;model_name&amp;gt;&amp;lt;hash&amp;gt;_&amp;lt;seq_no&amp;gt;_reports&lt;/code>, for example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">Material_payer_propensity_30_days_&amp;lt;hash&amp;gt;_&amp;lt;seq_no&amp;gt;_reports
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  ├── feature-importance-chart.png
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  ├── test-lift-chart.png
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  ├── test-pr-auc.png
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  ├── test-roc-auc.png
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">  └── training_summary.json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>Feature Importance Chart&lt;/strong>: Highlights the key features influencing predictions.&lt;/li>
&lt;li>&lt;strong>Cumulative Gain Chart&lt;/strong>: Provides a visual comparison between the model&amp;rsquo;s performance and random selection, helping to quantify the model&amp;rsquo;s ability to identify positive instances efficiently. This chart is particularly useful for optimizing resource allocation in scenarios like marketing campaigns or customer targeting.&lt;/li>
&lt;li>&lt;strong>Precision-Recall Curve&lt;/strong>: Assesses the trade-off between precision and recall at various probability thresholds. It is particularly useful for imbalanced datasets, highlighting the model&amp;rsquo;s ability to identify positive instances while minimizing false positives.&lt;/li>
&lt;li>&lt;strong>ROC Curve&lt;/strong>: Assesses the trade-off between true positives and false positives. It helps highlight the model&amp;rsquo;s ability to separate positive and negative labels.&lt;/li>
&lt;/ul>
&lt;p>Additionally, RudderStack writes the metrics from the &lt;code>training_summary.json&lt;/code> file to a new row in the &lt;strong>TRAINING_METRICS_v4&lt;/strong> table in your warehouse.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="prediction-output" data-heading="Prediction output" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h3 id="prediction-output">Prediction output&lt;/h3>&lt;p>Based on the &lt;code>prediction&lt;/code> parameters, Profiles creates a new table in your warehouse. The table&amp;rsquo;s name is the same as the model along with a hash and seqence number (for example, &lt;code>Material_payer_propensity_30_days_4dd846le_21&lt;/code>).&lt;/p>
&lt;p>The table contains the following columns, along with the &lt;code>user_main_id&lt;/code>:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Probability score&lt;/strong>: A value between 0 and 1 indicating the likelihood of a user action, like making a purchase.&lt;/li>
&lt;li>&lt;strong>Percentile score&lt;/strong>: A scaled version of the probability score useful for targeting specific user segments, for example, the top 10% for a campaign.&lt;/li>
&lt;li>&lt;strong>Boolean flag&lt;/strong>: A true/false indicator of whether a user is likely to perform the action, based on the model&amp;rsquo;s confidence.&lt;/li>
&lt;/ul>
&lt;p>The above columns are essentially the same, only represented in different forms. They represent the same prediction in different formats, catering to various use-cases/levels of granularity and interpretation preferences.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="view-output" data-heading="View output" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h3 id="view-output">View output&lt;/h3>&lt;p>You can either:&lt;/p>
&lt;ul>
&lt;li>View the output materials in your warehouse, OR&lt;/li>
&lt;li>If your Profiles project is in the RudderStack dashboard:
&lt;ul>
&lt;li>
&lt;p>Check the predicted value for any given user in the Profile Lookup section.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Explore predictive features in the &lt;strong>Entities&lt;/strong> tab of your Profiles project.&lt;/p>
&lt;figure class="image--main " >
&lt;a
data-lightbox="image-images/profiles/predictive-features-2.webp" href="https://www.rudderstack.com/docs/docs/images/profiles/predictive-features-2.webp"
>
&lt;img src="https://www.rudderstack.com/docs/docs/images/profiles/predictive-features-2.webp"
decoding="async" loading="lazy" class="img-shortcode"/>
&lt;/a>
&lt;/figure>
&lt;p>Click &lt;strong>Predictive features&lt;/strong> to see the following view:&lt;/p>
&lt;figure class="image--main " >
&lt;a
data-lightbox="image-images/profiles/predictive-features-1.webp" href="https://www.rudderstack.com/docs/docs/images/profiles/predictive-features-1.webp"
>
&lt;img src="https://www.rudderstack.com/docs/docs/images/profiles/predictive-features-1.webp"
decoding="async" loading="lazy" class="img-shortcode"/>
&lt;/a>
&lt;/figure>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="use-existing-feature-setup" data-heading="Use existing feature setup" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h2 id="use-existing-feature-setup">Use existing feature setup&lt;/h2>&lt;p>You can even use an existing feature table set up outside of Profiles (say, any dbt or SQL project) to generate propensity scores. To do so, you need to provide the existing features as inputs via SQL models. The SQL model serves as a wrapper for your feature table.&lt;/p>
&lt;p>Note the following specifications for using SQL models:&lt;/p>
&lt;ul>
&lt;li>Define the feature table where original features are defined as an input model. Ensure that the &lt;code>is_event_stream: true&lt;/code>, and &lt;code>occurred_at_col&lt;/code> is specified. This enables creating feature snapshots at different points in the past. To support this, the feature table should retain the output from old runs as well. As your external pipeline creates new feature table snapshots daily, they should not replace the old data. Ideally, a fresh run should append new data to the same table. But if each job creates a new table, you can union all such tables to create a view. Make sure you have a timestamp column that denotes when the job was run.&lt;/li>
&lt;li>The output of the SQL model should have a single row per user.&lt;/li>
&lt;li>Ensure that column names in the SQL model are unique even if the SQL models are combined with other input types, such as &lt;code>entity_var&lt;/code>.&lt;/li>
&lt;li>The SQL model table should already include the entity&amp;rsquo;s main id column, for example, &lt;code>user_main_id&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>An example for configure SQL models is shown below — it uses the built-in &lt;code>end_time_sql&lt;/code> macro (the preferred way to reference the run&amp;rsquo;s end time, available from Profiles &lt;strong>v0.25+&lt;/strong>):&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Define the dbt generated feature table in inputs.yaml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">inputs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">rsFeatureTable&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">contract&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">is_optional&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">is_event_stream&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with_entity_ids&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">user&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with_columns&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">timestamp&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user_id&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">app_defaults&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">table&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user_features&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">occurred_at_col&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">timestamp&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ids&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;user_id&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user_id&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">entity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># Define an id stitcher over this, so the table gets a user_main_id column attached&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">models&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">rs_id_stitcher&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">model_type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">id_stitcher&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">model_spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">entity_key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">edge_sources&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">from&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">inputs/rsFeatureTable&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="c"># Define an SQL model on top of this&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">models&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">rsFeatureTableSnapshot&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">model_type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">sql_template&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">model_spec&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">single_sql&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> {% with feature_table = this.DeRef(&amp;#34;inputs/rsFeatureTable/var_table&amp;#34;) entity_id = this.DeRef(&amp;#34;inputs/rsTracks/rsFeatureTable/user_main_id&amp;#34;) %}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> select a.{{entity_id}}, f1, f2, f3 from
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> (
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> select * from {{feature_table}} where
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> timestamp &amp;lt;= {{ end_time_sql }}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> ) a inner join
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> (select {{entity_id}}, max(timestamp) as max_timestamp from {{feature_table}} where
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> timestamp &amp;lt;= {{ end_time_sql }}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> group by {{entity_id}}) b on
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> a.{{entity_id}} = b.{{entity_id}} and a.timestamp = b.max_timestamp
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> {% endwith %}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ids&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;user_id&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user_id&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">entity&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">to_default_stitcher&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">contract&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">is_optional&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">is_event_stream&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with_entity_ids&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">user&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with_columns&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user_id&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="faq" data-heading="FAQ" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h2 id="faq">FAQ&lt;/h2>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="how-does-the-model-select-data-for-training" data-heading="How does the model select data for training?" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h4 id="how-does-the-model-select-data-for-training">How does the model select data for training?&lt;/h4>&lt;p>For training the ML models, RudderStack needs a minimum of 5000 samples. If the model finds that there fewer than 5000 samples, RudderStack materializes more training data by running the Profiles project at different timestamps in the past. There are two materialization strategies: &lt;code>auto&lt;/code> and &lt;code>manual&lt;/code>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>auto&lt;/code> strategy&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>The &lt;code>strategy&lt;/code> parameter in the &lt;code>new_materialisations_config&lt;/code> block specifies the strategy for generating new materials. It is set to &lt;code>auto&lt;/code> by default, where the model creates upto 3 pairs of materials (total 6) where each pair is 2 weeks (14 days) apart by default. RudderStack starts with the most recent data, and keeps going back 14 days, till there is enough training data (5000 samples).&lt;/p>
&lt;p>Additionally, you can use the below parameters to adjust the default behavior:&lt;/p>
&lt;ul>
&lt;li>&lt;code>max_no_of_dates&lt;/code>: Specifies the number of materials to be generated. The default value is 3 pairs.&lt;/li>
&lt;li>&lt;code>feature_data_min_date_diff&lt;/code>: Specifies the minimum number of days between newly generated materials and existing materials. The default value is 2 weeks (14 days).&lt;/li>
&lt;/ul>
&lt;p>Note that the &lt;code>auto&lt;/code> strategy may not be able to find enough training data when using the &lt;code>begin_time&lt;/code> flag in &lt;code>pb run&lt;/code>. If it throws an error saying the data is insufficient, use the &lt;code>manual&lt;/code> strategy.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>manual&lt;/code> strategy&lt;/strong>&lt;/li>
&lt;/ul>
&lt;p>In this case, you can mention the dates from where the training pairs should be generated using the following parameter:&lt;/p>
&lt;ul>
&lt;li>&lt;code>dates&lt;/code>: Uses exact dates to generate the feature and label pairs. Make sure these are apart by &lt;code>predict_window_days&lt;/code> number of days.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="how-do-i-select-the-eligible_users" data-heading="How do I select the eligible_users?" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h4 id="how-do-i-select-the-eligible_users">How do I select the eligible_users?&lt;/h4>&lt;p>&lt;code>eligible_users&lt;/code> is one of the most critical parameters in a propensity model after the label column itself. This parameter defines which users the model should train on. In theory, you could train a model on all users but this often leads to scenarios where stale users - those who haven&amp;rsquo;t been seen in the app for years - become a part of the training dataset. This causes a &amp;ldquo;class imbalance problem&amp;rdquo; in model training. For classification propensity models, the minority label &lt;strong>must&lt;/strong> represent at least 5% of the data.&lt;/p>
&lt;p>Without properly configuring the &lt;code>eligible_users&lt;/code> parameter, this requirement is likely to be violated, preventing the model from training effectively. Determining appropriate &lt;code>eligible_users&lt;/code> criteria depends on your specific use case. The goal is to exclude users who are unlikely to convert within the specified &lt;code>predict_window_days&lt;/code> while retaining those who might convert.&lt;/p>
&lt;p>For different models, this criteria varies significantly:&lt;/p>
&lt;ul>
&lt;li>For a churn model, you might exclude users who churned long ago and are no longer active.&lt;/li>
&lt;li>For a payer propensity model, you might also exclude users who have been active for years but have never made a purchase.&lt;/li>
&lt;/ul>
&lt;p>Some common &lt;code>eligible_users&lt;/code> conditions include:&lt;/p>
&lt;ul>
&lt;li>Users who have been active within the past few quarters.&lt;/li>
&lt;li>Users who signed up or were first seen on the app recently (for example, current month).&lt;/li>
&lt;li>Users who demonstrated intent (for example, added items to cart) but did not convert.&lt;/li>
&lt;/ul>
&lt;html lang="en">
&lt;blockquote class="info">
&lt;div class="tip-quote">
&lt;img src=https://www.rudderstack.com/docs/docs/images/info.svg loading="lazy" alt="info" decoding="async" class="img__small" style="margin-top: 3px; width: 20px;height: 16px;" />
&lt;div class="tip-text">Your specific business model and use case will determine the most effective criteria.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="which-features-should-i-use-as-inputs-to-the-model" data-heading="Which features should I use as inputs to the model?" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h4 id="which-features-should-i-use-as-inputs-to-the-model">Which features should I use as inputs to the model?&lt;/h4>&lt;p>RudderStack recommends selecting features that effectively capture user behaviors and characteristics relevant to your prediction target. Focus on including features that represent different aspects of user engagement:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Recency metrics&lt;/strong>: How recently has the user interacted with your product or service.&lt;/li>
&lt;li>&lt;strong>Frequency metrics&lt;/strong>: How often the user engages with key features.&lt;/li>
&lt;li>&lt;strong>Monetization metrics&lt;/strong>: Past spending patterns, subscription level, or monetization behaviors.&lt;/li>
&lt;/ul>
&lt;p>For specific use cases, consider the following:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>For subscription churn prediction&lt;/strong>: Include features like subscription tenure, feature usage frequency, subscription tier, payment history, and engagement with key product features.&lt;/li>
&lt;li>&lt;strong>For lead scoring&lt;/strong>: Focus on features like acquisition source, engagement with pricing or product pages, time spent on site, and interaction with marketing content.&lt;/li>
&lt;li>&lt;strong>For purchase propensity&lt;/strong>: Consider cart abandonment history, browsing patterns, past purchase behavior, and response to promotions.&lt;/li>
&lt;/ul>
&lt;html lang="en">
&lt;blockquote class="info">
&lt;div class="tip-quote">
&lt;img src=https://www.rudderstack.com/docs/docs/images/info.svg loading="lazy" alt="info" decoding="async" class="img__small" style="margin-top: 3px; width: 20px;height: 16px;" />
&lt;div class="tip-text">The most effective feature sets typically combine both behavioral data (what users do) and descriptive data (who users are). Experiment with different feature combinations while monitoring the feature importance metrics to refine your approach.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="how-can-i-know-if-the-trained-model-is-good" data-heading="How can I know if the trained model is good?" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/propensity/" data-title="Propensity Scores" -->
&lt;h4 id="how-can-i-know-if-the-trained-model-is-good">How can I know if the trained model is good?&lt;/h4>&lt;p>Although there is no universal &lt;em>good&lt;/em> score for model evaluation metrics, here are a few guidelines:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Feature importance&lt;/strong>: The top features in the feature importance chart should align with your business understanding. Features that unexpectedly appear at the top or important features that are missing might indicate issues with your model.&lt;/li>
&lt;li>&lt;strong>Cumulative Gain Chart&lt;/strong>: This chart compares your model&amp;rsquo;s performance to both a baseline (random selection) and a theoretical best case. If your model&amp;rsquo;s lift curve is close to the baseline, it indicates underperformance. Conversely, if it approaches the best case line, your model is likely performing well.&lt;/li>
&lt;li>&lt;strong>ROC-AUC&lt;/strong>: Scores range from 0.5 (random guessing) to 1.0 (perfect classification). While higher values generally indicate better performance, be cautious with highly imbalanced datasets, which can yield misleadingly high ROC-AUC scores. In these cases, precision metrics are more informative.&lt;/li>
&lt;li>&lt;strong>Train-Val-Test metrics&lt;/strong>: Training metrics should be higher than validation/test metrics, but a significant gap suggests overfitting. Ideally, validation and test metrics should be close to each other, indicating the model generalizes well to new data.&lt;/li>
&lt;/ul>
&lt;p>If your model&amp;rsquo;s performance is unsatisfactory, consider these improvement strategies:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Add relevant features&lt;/strong>: Introduce new features that capture behaviors not represented in your current feature set. The feature importance chart can help identify which types of features are most predictive. Focus on adding features that provide new information rather than those highly correlated with existing features.&lt;/li>
&lt;li>&lt;strong>Increase training data&lt;/strong>: If training metrics look promising but the validation metrics are poor, your model may benefit from more training samples. You can adjust the &lt;code>new_materialisations_config&lt;/code> to include additional materials by increasing the &lt;code>max_no_of_dates&lt;/code> parameter in the auto strategy. This allows the model to incorporate more historical data snapshots.&lt;/li>
&lt;/ol>
&lt;br /></description></item><item><title>Archive: Real-time Personalization</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/real-time-personalization/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/real-time-personalization/</guid><description>
&lt;p>RudderStack&amp;rsquo;s &lt;strong>Real-time Personalization App&lt;/strong> combines several of RudderStack&amp;rsquo;s API and integration features to make your customer 360 data available for personalization use cases. Instead of significant custom work, you can hand your website and app developers a ready-made endpoint with whatever customer 360 data your product or marketing team needs.&lt;/p>
&lt;p>The Real-time Personalization App leverages three components:&lt;/p>
&lt;ul>
&lt;li>Your customer 360 data set (generated through Profiles).&lt;/li>
&lt;li>A Redis cache, where you push your customer 360 data.&lt;/li>
&lt;li>RudderStack&amp;rsquo;s Activation API, which gives you real-time access to the data in your Redis cache.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="implement-real-time-personalization-with-rudderstack" data-heading="Implement real-time personalization with RudderStack" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/real-time-personalization/" data-title="Real-time Personalization" -->
&lt;h2 id="implement-real-time-personalization-with-rudderstack">Implement real-time personalization with RudderStack&lt;/h2>&lt;ol>
&lt;li>Set up and run a Profiles project to generate the data you want to make available in real-time.&lt;/li>
&lt;li>Turn on the Activation API and add your Redis credentials.&lt;/li>
&lt;li>Integrate the API into your website or app.&lt;/li>
&lt;/ol>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-1-build-a-profiles-project" data-heading="Step 1: Build a Profiles project" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/real-time-personalization/" data-title="Real-time Personalization" -->
&lt;h3 id="step-1-build-a-profiles-project">Step 1: Build a Profiles project&lt;/h3>&lt;p>If you aren&amp;rsquo;t already running Profiles, the first step is to &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/create-new-project/" >create a new Profiles Project&lt;/a> to resolve user identities, and build features that drive personalization logic and content.&lt;/p>
&lt;html lang="en">
&lt;blockquote class="info">
&lt;div class="tip-quote">
&lt;img src=https://www.rudderstack.com/docs/docs/images/info.svg loading="lazy" alt="info" decoding="async" class="img__small" style="margin-top: 3px; width: 20px;height: 16px;" />
&lt;div class="tip-text">Ensure that you have a &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/feature-views/" >feature view&lt;/a> for the ID you will be using in your website or app (for example,&lt;code>user_name&lt;/code> or &lt;code>anonymous_id&lt;/code>)&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-2-turn-on-activation-api" data-heading="Step 2: Turn on Activation API" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/real-time-personalization/" data-title="Real-time Personalization" -->
&lt;h3 id="step-2-turn-on-activation-api">Step 2: Turn on Activation API&lt;/h3>&lt;p>Once the Profiles project has been run in the RudderStack UI, turn on the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/activation-api/" >Activation API&lt;/a>.&lt;/p>
&lt;figure class="image--main " >
&lt;a
data-lightbox="image-images/profiles/activation-api-toggle-v2.webp" href="https://www.rudderstack.com/docs/docs/images/profiles/activation-api-toggle-v2.webp"
>
&lt;img src="https://www.rudderstack.com/docs/docs/images/profiles/activation-api-toggle-v2.webp"
alt="RudderStack Activation API"
decoding="async" loading="lazy" class="img-shortcode"/>
&lt;/a>
&lt;/figure>
&lt;p>This will sync your data with your Redis cache.&lt;/p>
&lt;figure class="image--main " >
&lt;a
data-lightbox="image-images/profiles/redis_cache.webp" href="https://www.rudderstack.com/docs/docs/images/profiles/redis_cache.webp"
>
&lt;img src="https://www.rudderstack.com/docs/docs/images/profiles/redis_cache.webp"
alt="Redis cache"
decoding="async" loading="lazy" class="img-shortcode"/>
&lt;/a>
&lt;/figure>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="step-3-integrate-activation-api-into-website-or-app" data-heading="Step 3: Integrate Activation API into website or app" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/real-time-personalization/" data-title="Real-time Personalization" -->
&lt;h3 id="step-3-integrate-activation-api-into-website-or-app">Step 3: Integrate Activation API into website or app&lt;/h3>&lt;html lang="en">
&lt;blockquote class="info">
&lt;div class="tip-quote">
&lt;img src=https://www.rudderstack.com/docs/docs/images/info.svg loading="lazy" alt="info" decoding="async" class="img__small" style="margin-top: 3px; width: 20px;height: 16px;" />
&lt;div class="tip-text">See &lt;a href="https://www.rudderstack.com/blog/how-we-built-rudderstacks-real-time-personalization-engine/" >How we built RudderStack&amp;rsquo;s real-time personalization engine&lt;/a> for a detailed example on integrating the Activation API with your website.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;p>Once you enable the Activation API, your frontend and mobile developers can integrate it into your websites and apps to deliver last-mile personalized experiences.&lt;/p>
&lt;p>At a high level, the implementation consists of:&lt;/p>
&lt;ul>
&lt;li>Accessing a unique identifier for the visitor or app user.&lt;/li>
&lt;li>Sending that ID to the API endpoint, looking up the user, and returning additional available data.&lt;/li>
&lt;li>Customizing the experience based on the features received from the endpoint.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="website-personalization-sample-code" data-heading="Website personalization sample code" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/real-time-personalization/" data-title="Real-time Personalization" -->
&lt;h2 id="website-personalization-sample-code">Website personalization sample code&lt;/h2>&lt;p>This section contains several code samples for implementing personalization on a website running Next.js.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="access-and-decrypt-users-unique-identifier" data-heading="Access and decrypt user&amp;rsquo;s unique identifier" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/real-time-personalization/" data-title="Real-time Personalization" -->
&lt;h3 id="access-and-decrypt-users-unique-identifier">Access and decrypt user&amp;rsquo;s unique identifier&lt;/h3>&lt;p>For website personalization, to minimize delay, you can intercept the server request and then decrypt the &lt;code>anonymousId&lt;/code> utilizing &lt;a href="https://www.npmjs.com/package/@rudderstack/analytics-js-cookies" >@rudderanalytics/analytics-js-cookies&lt;/a>.&lt;/p>
&lt;p>A sample code from a website built on Next.js:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">NextRequest&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">NextResponse&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;next/server&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">RequestCookies&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">ResponseCookies&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;@edge-runtime/cookies&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">getDecryptedValue&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">anonymousUserIdKey&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;@rudderstack/analytics-js-cookies&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="k">default&lt;/span> &lt;span class="kr">async&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">middleware&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">request&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">NextRequest&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">headers&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Headers&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">requestCookies&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">RequestCookies&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">request&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">headers&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">anonCookie&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">requestCookies&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">anonymousUserIdKey&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">anonCookie&lt;/span>&lt;span class="o">?&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">anonymousId&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">getDecryptedValue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">anonCookie&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// next step...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">NextResponse&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">next&lt;/span>&lt;span class="p">({&lt;/span> &lt;span class="nx">headers&lt;/span> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="make-an-async-request-to-activation-api" data-heading="Make an async request to Activation API" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/real-time-personalization/" data-title="Real-time Personalization" -->
&lt;h3 id="make-an-async-request-to-activation-api">Make an async request to Activation API&lt;/h3>&lt;p>Once you have the decrypted identifier, you can pass it to the Activation API endpoint to look up a user and pull down their data from Redis.&lt;/p>
&lt;p>A sample code from a website built on Next.js:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="k">default&lt;/span> &lt;span class="kr">async&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">middleware&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">request&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">NextRequest&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// previous code here
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">anonCookie&lt;/span>&lt;span class="o">?&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">anonymousId&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">getDecryptedValue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">anonCookie&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">profilesAPI&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;https://profiles.rudderstack.com/v1/activation&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">profilesRes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">await&lt;/span> &lt;span class="nx">fetch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">profilesAPI&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">method&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;POST&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">body&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">JSON&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">stringify&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">entity&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;user&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">destinationId&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="cm">/* YOUR DESTINATION ID HERE */&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">id&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">type&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;anonymous_id&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">value&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">anonymousId&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">headers&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Content-Type&amp;#39;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;application/json&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Authorization&amp;#39;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="sb">`Bearer &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">process&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">env&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">PROFILES_BEARER_TOKEN&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">`&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">cache&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;no-cache&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// next step...
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">NextResponse&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">next&lt;/span>&lt;span class="p">({&lt;/span> &lt;span class="nx">headers&lt;/span> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="set-responsecookies-with-values-required-for-personalization" data-heading="Set &lt;code>ResponseCookies&lt;/code> with values required for personalization" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/real-time-personalization/" data-title="Real-time Personalization" -->
&lt;h3 id="set-responsecookies-with-values-required-for-personalization">Set &lt;code>ResponseCookies&lt;/code> with values required for personalization&lt;/h3>&lt;p>Lastly, you can set a ResponseCookie with the values required for personalization.&lt;/p>
&lt;p>A sample code from a website built on Next.js:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="k">default&lt;/span> &lt;span class="kr">async&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">middleware&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">request&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">NextRequest&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// previous code here
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">anonCookie&lt;/span>&lt;span class="o">?&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// previous code here
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">let&lt;/span> &lt;span class="nx">userAppSignUp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">data&lt;/span> &lt;span class="p">}&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">ProfilesResponseType&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">await&lt;/span> &lt;span class="nx">profilesRes&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">json&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">Object&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">keys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">data&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">length&lt;/span> &lt;span class="o">!==&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">USER_APP_SIGN_UP&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">data&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;WEB_PERSONALIZATION:FEATURES_BY_ANON&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">USER_APP_SIGN_UP&lt;/span> &lt;span class="o">!==&lt;/span> &lt;span class="kc">null&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> &lt;span class="nb">Number&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">USER_APP_SIGN_UP&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">userAppSignUp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">signupValue&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">Boolean&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">userAppSignUp&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">toString&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">expiryDate&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nb">Date&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">Number&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">new&lt;/span> &lt;span class="nb">Date&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">cookieExpiry&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">responseCookies&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">set&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;rs_activation_signed_up&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">signupValue&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">expires&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">expiryDate&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">secure&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">path&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;/&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">NextResponse&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">next&lt;/span>&lt;span class="p">({&lt;/span> &lt;span class="nx">headers&lt;/span> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="access-responsecookie" data-heading="Access &lt;code>ResponseCookie&lt;/code>" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/real-time-personalization/" data-title="Real-time Personalization" -->
&lt;h3 id="access-responsecookie">Access &lt;code>ResponseCookie&lt;/code>&lt;/h3>&lt;p>Once you&amp;rsquo;ve added a new ResponseCookie to the headers, you&amp;rsquo;re able to receive that on the frontend and use it to trigger the personalized experience.&lt;/p>
&lt;p>A sample code from a website built on Next.js is shown below. Note that this example utilizes the &lt;code>universal-cookie&lt;/code> library.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cm">/* ~/utils/cookies */&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="nx">Cookies&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;universal-cookie&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">cookies&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Cookies&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">PROFILES_COOKIE&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;rs_activation_signed_up&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">getSignedUpFromCookie&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="k">typeof&lt;/span> &lt;span class="nb">window&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="s1">&amp;#39;undefined&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">cookie&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">cookies&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">PROFILES_COOKIE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="nx">cookie&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="deliver-the-last-mile-experience" data-heading="Deliver the last mile experience" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/data-apps/real-time-personalization/" data-title="Real-time Personalization" -->
&lt;h3 id="deliver-the-last-mile-experience">Deliver the last mile experience&lt;/h3>&lt;p>At this point, your developers can leverage the data to drive the logic (and content) of personalized experiences.&lt;/p>
&lt;p>A sample code from a website built on Next.js is shown below. In this example, the code changes a button based on a user&amp;rsquo;s signup status.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">getSignedUpFromCookie&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;~/utils/cookies&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">export&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">HeaderCTAButton&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">signedUp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">getSignedUpFromCookie&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">buttonClass&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">signedUp&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="s1">&amp;#39;signed-up&amp;#39;&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;default&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">buttonText&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">signedUp&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="s1">&amp;#39;Request Demo&amp;#39;&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;Try for free&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">buttonURL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">signedUp&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="s1">&amp;#39;/request-demo&amp;#39;&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;/try-for-free&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">&amp;lt;&lt;/span>&lt;span class="nx">a&lt;/span> &lt;span class="nx">className&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="sb">`button &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">buttonClass&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="p">}&lt;/span> &lt;span class="nx">href&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="nx">buttonURL&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="nx">buttonText&lt;/span>&lt;span class="p">}&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="err">/a&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>