<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RudderStack Docs – Concepts</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/</link><description>Recent content in Concepts on RudderStack Docs</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/index.xml" rel="self" type="application/rss+xml"/><item><title>Archive: Entities</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/entities/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/entities/</guid><description>
&lt;p>This guide introduces you to the concept of entities in Profiles and shows how to define &lt;code>entities&lt;/code> in your Profiles project.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="overview" data-heading="Overview" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/entities/" data-title="Entities" -->
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Every business has artifacts that are tracked across systems for creating a complete data picture of that artifact. In Profiles, these are called &lt;code>Entities&lt;/code>.&lt;/p>
&lt;p>&lt;code>Entities&lt;/code> can be as common as users, accounts, etc. It can also expand to be anything that you can track across systems and want a complete picture of, like campaigns, devices, or even month of the year.&lt;/p>
&lt;p>&lt;code>Entities&lt;/code> are the central concept that a Profiles project is built around. It is where you define what your identity graphs and C360 tables are built around.&lt;/p>
&lt;p>&lt;strong>SQL Keyword&lt;/strong>: &lt;code>GROUP BY&lt;/code>&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="requirements" data-heading="Requirements" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/entities/" data-title="Entities" -->
&lt;h2 id="requirements">Requirements&lt;/h2>&lt;ul>
&lt;li>An entity must have multiple IDs in the data sources, also called as &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/inputs/" >&lt;code>inputs&lt;/code>&lt;/a>.&lt;/li>
&lt;li>Each input must have at least one ID that is shared with another input.&lt;/li>
&lt;li>No ID can be shared across any member of an entity (that is, an ID cannot shared by multiple users).&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="usage" data-heading="Usage" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/entities/" data-title="Entities" -->
&lt;h2 id="usage">Usage&lt;/h2>&lt;p>You can use&lt;code>entities&lt;/code> in the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/pb-project-yaml/" >&lt;code>pb_project.yaml&lt;/code>&lt;/a> file present in the top level of every Profiles project, as 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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">profiles_project&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">schema_version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">85&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">connection&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">wh_connection_dev&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_folders&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">models&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">##########################################&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">entities&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&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">id_stitcher&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">models/user_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">id_types&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_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="l">anonymous_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">feature_views&lt;/span>&lt;span class="p">:&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;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">using_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">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">anonymous_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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">anonymous_id_360&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">##########################################&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">id_types&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;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">anonymous_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">filters&lt;/span>&lt;span class="p">:&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;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">exclude&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&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;&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">python_requirements&lt;/span>&lt;span class="p">:&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;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">profiles_mlcorelib==0.7.2&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="best-practices" data-heading="Best practices" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/entities/" data-title="Entities" -->
&lt;h2 id="best-practices">Best practices&lt;/h2>&lt;ul>
&lt;li>As &lt;code>entities&lt;/code> are the central building block of a Profiles project, you should define them &lt;strong>before&lt;/strong> building the rest of the project.&lt;/li>
&lt;li>Most common &lt;code>entities&lt;/code> include user, account, organization, and prospect. But you can define an entity for anything that you want to group and aggregate your data around, including marketing campaigns, business units, or even months of the year (for monthly reporting).&lt;/li>
&lt;li>When picking &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/pb-project-yaml/id-types/" >&lt;code>id_types&lt;/code>&lt;/a>, consider the granularity of the entity. At the user grain, you will want to pick unique &lt;code>id_types&lt;/code> of the same grain. For higher level grains like organization or account, you can include user level grain &lt;code>id_types&lt;/code> as well as org level &lt;code>id_types&lt;/code> as long each user only belongs to one org or account.&lt;/li>
&lt;/ul>
&lt;br /></description></item><item><title>Archive: IDs</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/id/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/id/</guid><description>
&lt;p>This guide introduces you to the concept of IDs in Profiles and shows how to define &lt;code>id_types&lt;/code> and &lt;code>ids&lt;/code> in your Profiles project.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="overview" data-heading="Overview" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/id/" data-title="IDs" -->
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Creating a Customer360 (C360) is primarily combining data from different sources, or &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/inputs/" >&lt;code>inputs&lt;/code>&lt;/a>. ID fields define how those tables are connected.&lt;/p>
&lt;p>You can create the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/features/" >&lt;code>features&lt;/code>&lt;/a> of a C360 by chaining these IDs from different inputs together. Note that IDs are not always consistent between &lt;code>inputs&lt;/code> in name or format.&lt;/p>
&lt;p>Profiles has two concepts related to IDs:&lt;/p>
&lt;ul>
&lt;li>&lt;code>id&lt;/code>: This is the field within &lt;code>inputs&lt;/code> that is an identifier for a given &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/entities/" >entity&lt;/a>. For example a user name, an email, or an anonymous ID.&lt;/li>
&lt;li>&lt;code>id_type&lt;/code>: These are the categories of an ID. ID fields that have the same &lt;code>id_type&lt;/code> mean those &lt;code>inputs&lt;/code> can be joined on those &lt;code>id&lt;/code>.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>SQL Keyword&lt;/strong>: &lt;code>JOIN ON&lt;/code>&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="requirements" data-heading="Requirements" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/id/" data-title="IDs" -->
&lt;h2 id="requirements">Requirements&lt;/h2>&lt;ul>
&lt;li>ID must be unique for the members of an entity.&lt;/li>
&lt;li>ID must exist in multiple &lt;code>inputs&lt;/code>.&lt;/li>
&lt;li>IDs must be strings.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="usage" data-heading="Usage" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/id/" data-title="IDs" -->
&lt;h2 id="usage">Usage&lt;/h2>&lt;p>You can define &lt;code>id_types&lt;/code> in the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/pb-project-yaml/" >&lt;code>pb_project.yaml&lt;/code>&lt;/a> file present in the top level of every Profiles project, as 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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">llm_sdr_email_content_generation&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">schema_version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">85&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">connection&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">llm-recommend-dev&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_folders&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">models&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">entities&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&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">id_stitcher&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">models/user_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="c">############### ID Types #################&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">id_types&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_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="l">anonymous_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="c">##########################################&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_views&lt;/span>&lt;span class="p">:&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;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">using_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">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">anonymous_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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">anonymous_id_360&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">############## ID Type Definitions #######&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">id_types&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;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">anonymous_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">filters&lt;/span>&lt;span class="p">:&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;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">exclude&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&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;&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="c">##########################################&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">python_requirements&lt;/span>&lt;span class="p">:&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;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">profiles_mlcorelib==0.7.2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can then define &lt;code>ids&lt;/code> with the ID types in the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/inputs-yaml/" >&lt;code>inputs.yaml&lt;/code>&lt;/a> file. Each &lt;code>inputs&lt;/code> ID is labeled with one of the &lt;code>id_type&lt;/code> defined in &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/pb-project-yaml/" >&lt;code>pb_project.yaml&lt;/code>&lt;/a>.&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">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">rsIdentifies&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">rudder_autotrack_data.autotrack.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">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="c">########## Map ID to ID Type #############&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;anonymous_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">anonymous_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">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;CAST(user_id AS VARCHAR)&amp;#34;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># If data type of user_id column is not a string, you need to cast it to VARCHAR, STRING, or TEXT type depending on your warehouse syntax.&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">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;lower(email)&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">email&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="c">##########################################&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="best-practices" data-heading="Best practices" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/id/" data-title="IDs" -->
&lt;h2 id="best-practices">Best practices&lt;/h2>&lt;ul>
&lt;li>You can define &lt;code>id_types&lt;/code> for the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" >&lt;code>id_graph&lt;/code>&lt;/a> or to connect additional tables for &lt;code>features&lt;/code>.&lt;/li>
&lt;li>&lt;code>id_types&lt;/code> should only be identifiers that are relevant to your entities and the features you are going to create. For example, if you are looking at customer support tickets, you do not need to include IDs related to your Customer Success systems.&lt;/li>
&lt;li>To use email address as an &lt;code>id_type&lt;/code>, remove the test and internal domains.&lt;/li>
&lt;li>Ensure the &lt;code>id_types&lt;/code> you choose are unique. For example, &lt;code>first_name&lt;/code>, &lt;code>last_name&lt;/code>, or &lt;code>cat(first_name, last_name)&lt;/code> would not reasonably be expected to be unique across all users, making them an unsuitable identifier for a user entity. But &lt;code>user_id&lt;/code> or &lt;code>email&lt;/code>could be depending on your product.&lt;/li>
&lt;li>When picking &lt;code>id_types&lt;/code>, consider the granularity of the &lt;code>entity&lt;/code>. At the user grain, you will want to pick unique &lt;code>id_types&lt;/code> of the same grain. For higher level grains like organization or account, you can include user level grain &lt;code>id_types&lt;/code> as well as org level &lt;code>id_types&lt;/code> as long each user only belongs to one org or account.&lt;/li>
&lt;li>If any of your ID columns are not of the string data type, then you must cast the columns to string in the &lt;code>select&lt;/code> statement.&lt;/li>
&lt;/ul>
&lt;br /></description></item><item><title>Archive: Identity Graph</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/</guid><description>
&lt;p>This guide introduces you to the concept of identity graphs in Profiles and shows how to use them in your Profiles project.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="overview" data-heading="Overview" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" data-title="Identity Graph" -->
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Multiple identities is the biggest obstacle to getting a full picture of your customers, user, or any other &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/entities/" >&lt;code>entity&lt;/code>&lt;/a>.&lt;/p>
&lt;p>Companies gather user data across digital touchpoints like websites, mobile apps, enterprise systems like CRMs, marketing platforms, etc. During this process, a single user is identified with multiple identifiers across your systems, like email address, phone number, device ID, anonymous ID, user name, etc. To create a unified user profile, it is vital to collect and stitch all of those different identifiers into one canonical identifier.&lt;/p>
&lt;p>You can leverage Profiles&amp;rsquo; &lt;code>id_stitcher&lt;/code> model to take your inputs and stitch all the identifiers together into an identity graph.&lt;/p>
&lt;p>An identity graph consists of two main components:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Nodes&lt;/strong>: Represent individual identifiers that belong to an entity.&lt;/li>
&lt;li>&lt;strong>Edges&lt;/strong>: Represent the relationships observed between these identifiers in your input data.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="requirements" data-heading="Requirements" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" data-title="Identity Graph" -->
&lt;h2 id="requirements">Requirements&lt;/h2>&lt;ul>
&lt;li>Defined &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/pb-project-yaml/id-types/" >&lt;code>id_types&lt;/code>&lt;/a> for your entity and mapped to your input sources.&lt;/li>
&lt;li>Identifiers from your inputs must be of the string data type. If the columns in your input sources are not of string types already, you must cast them explicitly.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="usage" data-heading="Usage" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" data-title="Identity Graph" -->
&lt;h2 id="usage">Usage&lt;/h2>&lt;p>The identity graph is located in the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/profiles-yaml/" >&lt;code>profiles.yaml&lt;/code>&lt;/a> file as an &lt;code>id_stitcher&lt;/code> model.&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">user_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/rsIdentifies&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;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="link-the-identity-graph-to-your-entity" data-heading="Link the identity graph to your entity" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" data-title="Identity Graph" -->
&lt;h3 id="link-the-identity-graph-to-your-entity">Link the identity graph to your entity&lt;/h3>&lt;p>After you define an &lt;code>id_stitcher&lt;/code> model in &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/profiles-yaml/" >&lt;code>profiles.yaml&lt;/code>&lt;/a>, you must reference it from the corresponding entity in your &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/pb-project-yaml/" >&lt;code>pb_project.yaml&lt;/code>&lt;/a> file. Set the &lt;code>id_stitcher&lt;/code> key on the entity to the model path (for example, &lt;code>models/user_id_stitcher&lt;/code> for a model named &lt;code>user_id_stitcher&lt;/code>).&lt;/p>
&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">&lt;p>&lt;strong>Always set &lt;code>id_stitcher&lt;/code> on each entity that has a custom ID stitcher model defined in &lt;code>profiles.yaml&lt;/code>.&lt;/strong>&lt;/p>
&lt;p>If the entity does not specify &lt;code>id_stitcher&lt;/code>, the intended id stitcher is not used and you may get unintended results.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;p>Example entity configuration in &lt;code>pb_project.yaml&lt;/code>:&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">entities&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&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">id_stitcher&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">models/user_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">id_types&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_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="l">anonymous_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>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">...&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Rest of the configuration&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>See &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/pb-project-yaml/entities/" >Entity&lt;/a> for full entity configuration options.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="metadata-and-observability" data-heading="Metadata and observability" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" data-title="Identity Graph" -->
&lt;h2 id="metadata-and-observability">Metadata and observability&lt;/h2>&lt;p>To provide transparency into the stitching process, you can enable metadata logging using the following flags in your &lt;code>id_stitcher&lt;/code> model specification. These flags control what metadata is logged for the identity graph components:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Flag&lt;/th>
&lt;th style="text-align:left">Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;code>log_direct_edge_info&lt;/code>&lt;/td>
&lt;td style="text-align:left">Logs metadata about the direct relationships (edges) between identifiers.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>log_node_metadata&lt;/code>&lt;/td>
&lt;td style="text-align:left">Logs metadata for each individual identifier (node).&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Both flags are supported on &lt;strong>Snowflake&lt;/strong> and &lt;strong>BigQuery&lt;/strong>. Other supported warehouses do not currently emit the &lt;code>METADATA&lt;/code> column.&lt;/p>
&lt;p>An example of how to enable these flags is shown below:&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">user_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">log_direct_edge_info&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">log_node_metadata&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">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/rsIdentifies&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;/code>&lt;/pre>&lt;/div>&lt;p>This metadata helps you understand how identifiers are connected and trace the lineage of your identity graph.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="metadata-structure" data-heading="Metadata structure" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" data-title="Identity Graph" -->
&lt;h3 id="metadata-structure">Metadata structure&lt;/h3>&lt;p>The generated metadata contains two main objects:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Object&lt;/th>
&lt;th style="text-align:left">Details&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;code>node_info&lt;/code>&lt;/td>
&lt;td style="text-align:left">Array of objects containing aggregated metadata for the node (identifier) itself. It includes the &lt;code>source_model&lt;/code> where the identifier was first seen and the &lt;code>first_seen_at&lt;/code> timestamp.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>direct_edge_info&lt;/code>&lt;/td>
&lt;td style="text-align:left">Object describing the direct relationships (edges) of a node. The &lt;code>edges_by_type&lt;/code> field is an &lt;strong>array&lt;/strong> of buckets — one bucket per identifier type. Each bucket contains a &lt;code>count&lt;/code> of edges and an &lt;code>edges&lt;/code> array of the connected nodes, with the per-source provenance of each edge.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The following example shows one node with a single email edge from one input model:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&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="nt">&amp;#34;direct_edge_info&amp;#34;&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="nt">&amp;#34;edges_by_type&amp;#34;&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="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;count&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;edges&amp;#34;&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="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;first_seen_at&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-01-01 10:00:00.000&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;s1_email@test.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;sources&amp;#34;&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="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;first_seen_at&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-01-01 10:00:00.000&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;source_model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;events_app&amp;#34;&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="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="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;email&amp;#34;&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="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;node_info&amp;#34;&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="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;first_seen_at&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-01-01 10:00:00.000&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;source_model&amp;#34;&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="s2">&amp;#34;events_app&amp;#34;&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="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;p>When the same edge is observed in more than one input model, each contributing model appears as a separate entry in the edge&amp;rsquo;s &lt;code>sources&lt;/code> array. The edge-level &lt;code>first_seen_at&lt;/code> is the earliest timestamp across all sources:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&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="nt">&amp;#34;direct_edge_info&amp;#34;&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="nt">&amp;#34;edges_by_type&amp;#34;&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="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;count&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;edges&amp;#34;&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="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;first_seen_at&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-02-10 08:00:00.000&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;id&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;ms_email@test.com&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;sources&amp;#34;&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="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;first_seen_at&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-02-15 10:00:00.000&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;source_model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;events_app&amp;#34;&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="nt">&amp;#34;first_seen_at&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-02-10 08:00:00.000&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;source_model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;events_web&amp;#34;&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="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="nt">&amp;#34;type&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;email&amp;#34;&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="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;node_info&amp;#34;&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="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;first_seen_at&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-02-15 10:00:00.000&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;source_model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;events_app&amp;#34;&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;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="nt">&amp;#34;first_seen_at&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2022-02-10 08:00:00.000&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;source_model&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;events_web&amp;#34;&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;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>&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>&lt;strong>Incremental runs do not merge metadata across runs&lt;/strong>&lt;/p>
&lt;p>On each incremental run, the per-node &lt;code>METADATA&lt;/code> column reflects only the source attribution observed during the current run&amp;rsquo;s data window. If a node was contributed by &lt;code>events_app&lt;/code> in a previous run and only by &lt;code>events_mobile&lt;/code> in the current run, the metadata column shows &lt;code>events_mobile&lt;/code> alone — the previous run&amp;rsquo;s source list is not carried forward.&lt;/p>
&lt;p>This applies to both &lt;code>node_info[].source_model&lt;/code> and &lt;code>direct_edge_info.edges_by_type[].edges[].sources[]&lt;/code>. The stitched ID graph itself (the &lt;code>id&lt;/code> and &lt;code>other_id&lt;/code> columns) does carry forward across incremental runs as expected; only the metadata column resets per run.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="reading-the-metadata-column" data-heading="Reading the metadata column" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" data-title="Identity Graph" -->
&lt;h3 id="reading-the-metadata-column">Reading the metadata column&lt;/h3>&lt;p>The &lt;code>METADATA&lt;/code> column is a per-row JSON document attached to every row of the ID stitcher output. Each row describes one identifier (&lt;code>other_id&lt;/code>) and how it was observed during the current run.&lt;/p>
&lt;p>The top-level structure is fixed:&lt;/p>
&lt;ul>
&lt;li>&lt;code>node_info&lt;/code> is a deduplicated array, one entry per input model that contributed the node. Each entry carries the &lt;code>first_seen_at&lt;/code> timestamp for that model and a one-element &lt;code>source_model&lt;/code> array.&lt;/li>
&lt;li>&lt;code>direct_edge_info.edges_by_type&lt;/code> is an array of buckets. Each bucket has a &lt;code>type&lt;/code> (the ID type of the connected nodes), a &lt;code>count&lt;/code>, and an &lt;code>edges&lt;/code> array.&lt;/li>
&lt;li>Each edge in &lt;code>edges&lt;/code> has the connected node&amp;rsquo;s &lt;code>id&lt;/code>, the edge-level &lt;code>first_seen_at&lt;/code>, and a &lt;code>sources&lt;/code> array. The &lt;code>sources&lt;/code> array carries one entry per contributing input model with that model&amp;rsquo;s own &lt;code>first_seen_at&lt;/code>.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="multi-source-edges" data-heading="Multi-source edges" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" data-title="Identity Graph" -->
&lt;h4 id="multi-source-edges">Multi-source edges&lt;/h4>&lt;p>The same edge can appear in multiple inputs. The number of entries in an edge&amp;rsquo;s &lt;code>sources&lt;/code> array shows how many inputs reported the edge in this run — the &lt;code>source_model&lt;/code> and &lt;code>first_seen_at&lt;/code> per entry trace the edge back to a specific table and time.&lt;/p>
&lt;p>A single entry in &lt;code>sources&lt;/code> means only one input model contributed the edge in this run — not that the edge is weaker.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="incremental-run-behavior" data-heading="Incremental run behavior" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" data-title="Identity Graph" -->
&lt;h4 id="incremental-run-behavior">Incremental run behavior&lt;/h4>&lt;p>Two incremental runs of the same project can produce different &lt;code>sources&lt;/code> arrays for the same edge, depending on which inputs landed new rows in each run.&lt;/p>
&lt;p>When you compare metadata across runs, treat the &lt;code>sources&lt;/code> array as a per-run snapshot, not as lifetime history. To preserve cross-run source history, snapshot the column into a downstream table on each run.&lt;/p>
&lt;p>For more information on how violator edges interact with the metadata column under cardinality rules, see &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/advanced-id-stitcher-features/id-graph-cardinality-rules/" >ID Graph Cardinality Rules&lt;/a>.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="metadata-size-and-limits" data-heading="Metadata size and limits" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" data-title="Identity Graph" -->
&lt;h3 id="metadata-size-and-limits">Metadata size and limits&lt;/h3>&lt;p>Each row&amp;rsquo;s &lt;code>METADATA&lt;/code> JSON is bounded by structure, not by data scale. Two internal caps keep each row&amp;rsquo;s JSON small even for highly-connected nodes:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Field&lt;/th>
&lt;th style="text-align:left">Limit&lt;/th>
&lt;th style="text-align:left">What it means&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;code>direct_edge_info.edges_by_type&lt;/code> length&lt;/td>
&lt;td style="text-align:left">&lt;strong>10 buckets&lt;/strong>&lt;/td>
&lt;td style="text-align:left">At most 10 distinct identifier types per node appear in the metadata.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>edges_by_type[].edges&lt;/code> length&lt;/td>
&lt;td style="text-align:left">&lt;strong>10 edges per bucket&lt;/strong>&lt;/td>
&lt;td style="text-align:left">At most 10 direct neighbors of a given type are listed per node.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>edges[].sources&lt;/code> length&lt;/td>
&lt;td style="text-align:left">Less than or equal to the number of &lt;code>edge_sources:&lt;/code> in your project YAML&lt;/td>
&lt;td style="text-align:left">One entry per contributing input model.&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;code>node_info&lt;/code> length&lt;/td>
&lt;td style="text-align:left">Less than or equal to the number of &lt;code>edge_sources:&lt;/code> in your project YAML&lt;/td>
&lt;td style="text-align:left">One entry per contributing input model.&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>The two hardcoded limits are not currently configurable from YAML. In practice, the defaults are large enough for almost all production identity graphs. If you lose meaningful detail, consider whether &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/advanced-id-stitcher-features/id-graph-cardinality-rules/" >ID Graph Cardinality Rules&lt;/a> on the entity can tighten the underlying graph rather than expanding the metadata caps.&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>&lt;strong>Detecting edges hidden by the cap&lt;/strong>&lt;/p>
&lt;p>Each &lt;code>edges_by_type[]&lt;/code> bucket reports the &lt;strong>uncapped&lt;/strong> total in its &lt;code>count&lt;/code> field, while the &lt;code>edges&lt;/code> array is capped at 10. A row where &lt;code>count&lt;/code> exceeds the length of &lt;code>edges&lt;/code> means the metadata column shows a truncated view of that node&amp;rsquo;s neighbors.&lt;/p>
&lt;p>You can run this check directly against the &lt;code>METADATA&lt;/code> column without consulting the cardinality audit table — it complements the &lt;code>cardinality_info&lt;/code> field used for rule-capped edges. See &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/advanced-id-stitcher-features/id-graph-cardinality-rules/" >ID Graph Cardinality Rules&lt;/a> for the rule-capped case.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="best-practices" data-heading="Best practices" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/identity-graph/" data-title="Identity Graph" -->
&lt;h2 id="best-practices">Best practices&lt;/h2>&lt;ul>
&lt;li>For the &lt;code>identity_stitcher&lt;/code> model, use &lt;strong>only&lt;/strong> the &lt;code>id_types&lt;/code> and &lt;code>inputs&lt;/code> necessary to stitch the identifiers relevant to an &lt;code>entity&lt;/code>. For example, if you don’t care about anonymous traffic, do not add &lt;code>anonymous_id&lt;/code> as an &lt;code>id_type&lt;/code> or any &lt;code>inputs&lt;/code> related to anonymous traffic.&lt;/li>
&lt;li>Conceptually, you can think of your &lt;code>identity_graph&lt;/code> table as a kind of fact table in star or Snowflake schema. All of your core identifiers are in the center table and are used to connect to your &lt;code>inputs&lt;/code>.&lt;/li>
&lt;li>Only include &lt;code>inputs&lt;/code> as edge sources that include &lt;code>id_types&lt;/code> directly related to the entity (the first level out from the fact table in a Snowflake schema). For example, you may need to include an &lt;code>id_type&lt;/code> for product names because they are in a separate table but you do not want to include them in the &lt;code>identity_graph&lt;/code>.&lt;/li>
&lt;/ul>
&lt;br /></description></item><item><title>Archive: Inputs</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/inputs/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/inputs/</guid><description>
&lt;p>This guide introduces you to the concept of inputs in Profiles and shows how to use them in your Profiles project.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="overview" data-heading="Overview" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/inputs/" data-title="Inputs" -->
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>The foundation of every companies data is the source files and data tables - these are the inputs that go into every data product a company produces.&lt;/p>
&lt;p>In Profiles, &lt;code>inputs&lt;/code> contain the IDs for identity graphs and the fields that build into a Customer360 (C360). They can be database tables or views, S3 buckets, and/or CSV files.&lt;/p>
&lt;p>&lt;strong>SQL Keyword&lt;/strong>: &lt;code>FROM&lt;/code>&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="usage" data-heading="Usage" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/inputs/" data-title="Inputs" -->
&lt;h2 id="usage">Usage&lt;/h2>&lt;p>You can define &lt;code>inputs&lt;/code> in the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/inputs-yaml/" >&lt;code>inputs.yaml&lt;/code>&lt;/a> file, as 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">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">rsIdentifies&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">autotrack_data.autotrack.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">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 class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;anonymous_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">anonymous_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">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;lower(email)&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">email&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">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">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">autotrack_data.autotrack.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">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 class="nt">select&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;anonymous_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">anonymous_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;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="best-practices" data-heading="Best practices" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/inputs/" data-title="Inputs" -->
&lt;h2 id="best-practices">Best practices&lt;/h2>&lt;ul>
&lt;li>Though it is possible to bring in data sources that only have one identifier column for your entity, it is best to have two or more columns, especially for &lt;code>inputs&lt;/code> that you want to use as a source for the &lt;code>id_stitcher&lt;/code> model.&lt;/li>
&lt;li>If any of your ID columns are not of the string data type, then you must case them explicitly, as shown below:&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="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;CAST(user_id AS VARCHAR)&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;/code>&lt;/pre>&lt;/div>&lt;br /></description></item><item><title>Archive: Features</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/features/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/features/</guid><description>
&lt;p>This guide introduces you to the concept of features in Profiles and explains how to define them in your Profiles project.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="overview" data-heading="Overview" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/features/" data-title="Features" -->
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>A Customer360 (C360) table contains various customer features. In Profiles, you can create these features using &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/profiles-yaml/var-groups/entity-var/" >&lt;code>entity_vars&lt;/code>&lt;/a> which, in turn, can be created using an &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/inputs/" >&lt;code>input&lt;/code>&lt;/a>, &lt;code>model&lt;/code> or other &lt;code>entity_vars&lt;/code>.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="usage" data-heading="Usage" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/features/" data-title="Features" -->
&lt;h2 id="usage">Usage&lt;/h2>&lt;p>You can define features in the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/profiles-yaml/" >&lt;code>profiles.yaml&lt;/code>&lt;/a> file, as 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">var_groups&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_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">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">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">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">first_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="l">min(cast(timestamp as 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">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">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">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">First seen 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">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">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="l">max(cast(timestamp as 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">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">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Last seen 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">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">user_lifespan&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="s1">&amp;#39;{{ user.last_seen }} - {{ user.first_seen }}&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">description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">User lifespan&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="incremental-features" data-heading="Incremental features" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/features/" data-title="Features" -->
&lt;h2 id="incremental-features">Incremental features&lt;/h2>&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">This is a beta feature.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;p>Profiles also supports &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/" >Incremental Features&lt;/a> to help reduce warehouse costs, especially in case of large datasets.&lt;/p>
&lt;p>By adding a &lt;code>merge:&lt;/code> clause to your &lt;code>entity_var&lt;/code> definitions and marking the input model as &lt;code>is_append_only: true&lt;/code>, you enable Profiles to process only new data and merge it with previously computed values — improving performance and reducing costs considerably.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="controlling-update-frequency" data-heading="Controlling update frequency" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/features/" data-title="Features" -->
&lt;h2 id="controlling-update-frequency">Controlling update frequency&lt;/h2>&lt;p>Not all features need to be computed on every run — use &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/timegrains/" >Timegrains&lt;/a> to control how often features are updated:&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">var_groups&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">realtime_signals&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">time_grain&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 class="c"># 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">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">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">last_active_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">max(timestamp::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">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>&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">monthly_aggregates&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">time_grain&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 class="c"># Computed monthly&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">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">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">favorite_category&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">mode(category)&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/orders&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>This helps reduce compute costs for features that don&amp;rsquo;t need frequent updates.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="best-practices" data-heading="Best practices" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/features/" data-title="Features" -->
&lt;h2 id="best-practices">Best practices&lt;/h2>&lt;ul>
&lt;li>An &lt;code>entity_var&lt;/code> will automatically group records from a source &lt;code>input&lt;/code> or &lt;code>model&lt;/code> by customer, so you need only to specify an aggregate function in the &lt;code>select&lt;/code> field.&lt;/li>
&lt;li>Every &lt;code>entity_var&lt;/code> is included in &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/feature-views/" >&lt;code>feature_views&lt;/code>&lt;/a> by default.&lt;/li>
&lt;li>To use an &lt;code>entity_var&lt;/code> to create another &lt;code>entity_var&lt;/code> but &lt;strong>not include&lt;/strong> it as a feature, add &lt;code>is_feature: false&lt;/code> to the &lt;code>entity_var&lt;/code> definition.&lt;/li>
&lt;li>For large datasets, consider making features incremental to improve performance.&lt;/li>
&lt;li>Group features by update frequency using &lt;code>time_grain&lt;/code> on &lt;code>var_group&lt;/code> to optimize compute costs.&lt;/li>
&lt;/ul>
&lt;br /></description></item><item><title>Archive: Incremental Features</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/</guid><description>
&lt;p>This guide introduces you to the concept of incremental features in Profiles and explains how they improve performance when processing large datasets.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="overview" data-heading="Overview" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/" data-title="Incremental Features" -->
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Incremental features update existing feature values with newly arrived event data instead of recalculating from the entire historical dataset.&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">Instead of scanning billions of rows on every run, incremental features reuse previously computed results and only process new data that has arrived since the last run.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="how-incremental-features-work" data-heading="How incremental features work" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/" data-title="Incremental Features" -->
&lt;h2 id="how-incremental-features-work">How incremental features work&lt;/h2>&lt;p>When you define an incremental feature, Profiles stores previous results in a &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/checkpoints-and-baselines/" >checkpoint&lt;/a>, identifies new data since the last checkpoint, merges previous values with new calculations using your merge logic, and produces updated feature values.&lt;/p>
&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">&lt;p>&lt;strong>Mandatory requirement&lt;/strong>:&lt;/p>
&lt;p>Inputs used by incremental features require &lt;code>contract.is_append_only: true&lt;/code> to be configured. Without this configuration, the project may throw an error.&lt;/p>
&lt;p>See &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/incremental-features/make-features-incremental/" >Make Features Incremental&lt;/a> for configuration details.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/blockquote>
&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">Features built incrementally may drift slightly with every run due to late-landing data.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="when-to-use-incremental-features" data-heading="When to use incremental features" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/" data-title="Incremental Features" -->
&lt;h2 id="when-to-use-incremental-features">When to use incremental features&lt;/h2>&lt;p>Use incremental features when:&lt;/p>
&lt;ul>
&lt;li>You want to reduce warehouse costs when processing large historical datasets (millions or billions of rows)&lt;/li>
&lt;li>New data arrives regularly (daily, hourly, or more frequently)&lt;/li>
&lt;li>The volume of new data is significantly smaller than your total dataset&lt;/li>
&lt;li>Your features can be expressed using supported incremental patterns&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">&lt;p>&lt;strong>Not all features can be computed incrementally.&lt;/strong>&lt;/p>
&lt;p>Features that require scanning all historical data (such as median or percentile calculations) &lt;strong>cannot&lt;/strong> use incremental computation. For such cases, consider using &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/timegrains/" >Timegrains&lt;/a> and &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/optimizations/" >bundling&lt;/a>.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="relationship-to-other-profiles-features" data-heading="Relationship to other Profiles features" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/" data-title="Incremental Features" -->
&lt;h2 id="relationship-to-other-profiles-features">Relationship to other Profiles features&lt;/h2>&lt;p>Incremental features work alongside other Profiles capabilities:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Incremental ID stitching&lt;/strong>: The identity graph can also run incrementally, processing only new identity relationships.&lt;/li>
&lt;li>&lt;strong>Timegrains&lt;/strong>: For features that cannot be incremental, timegrains control how frequently they recompute.&lt;/li>
&lt;li>&lt;strong>Entity Var Bundling&lt;/strong>: Groups the execution of &lt;code>entity_vars&lt;/code> based on their definitions to improve efficiency. This optimization complements incremental features and can help optimize performance for features that cannot be incremental.&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">Incremental entity vars do not support entity var bundling yet. The bundling algorithm will only bundle non incremental entity vars. Incremental entity vars will run one at a time.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!DOCTYPE html>
&lt;html lang="en">
&lt;blockquote class="tip">
&lt;div class="tip-quote">
&lt;img src=https://www.rudderstack.com/docs/docs/images/tip.svg loading="lazy" alt="tip" decoding="async" class="img__small" style="margin-top: 3px; width: 20px;height: 16px;" />
&lt;div class="tip-text">&lt;p>&lt;strong>Tip:&lt;/strong>
Input vars are generally discouraged due to performance considerations. For incremental processing, consider using entity_vars with &lt;code>merge&lt;/code> property or incremental SQL models.&lt;/p>
&lt;p>Contact &lt;a href="mailto:support@rudderstack.com" >RudderStack Support&lt;/a> to discuss specific use cases that may require input vars.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="understanding-composable-functions" data-heading="Understanding composable functions" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/" data-title="Incremental Features" -->
&lt;h2 id="understanding-composable-functions">Understanding composable functions&lt;/h2>&lt;p>&lt;strong>Composable functions&lt;/strong> are functions that can be merged incrementally by combining results from different time periods:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Simple composable&lt;/strong>: &lt;code>SUM&lt;/code>, &lt;code>MIN&lt;/code>, &lt;code>MAX&lt;/code>, &lt;code>COUNT&lt;/code> - can be merged directly (e.g., &lt;code>SUM(period1) + SUM(period2) = SUM(all)&lt;/code>)&lt;/li>
&lt;li>&lt;strong>Compound composable&lt;/strong>: &lt;code>AVG&lt;/code>, &lt;code>WEIGHTED_AVG&lt;/code> - require breaking into multiple simple composable functions (e.g., &lt;code>AVG = SUM / COUNT&lt;/code>)&lt;/li>
&lt;/ul>
&lt;p>Note that &lt;strong>non-composable&lt;/strong> functions (e.g., Median, percentiles, &lt;code>DISTINCT COUNT&lt;/code> (in most warehouses)) cannot be computed incrementally and require full scans.&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;strong>AVG is not composable directly&lt;/strong>: You cannot average two averages correctly without knowing the counts. For example, averaging 10 (from 5 values) and 20 (from 3 values) doesn&amp;rsquo;t give you the correct overall average. You need: &lt;code>(SUM1 + SUM2) / (COUNT1 + COUNT2)&lt;/code>.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="supported-patterns" data-heading="Supported patterns" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/" data-title="Incremental Features" -->
&lt;h2 id="supported-patterns">Supported patterns&lt;/h2>&lt;p>Profiles supports incremental computation through three main pattern categories:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">Pattern&lt;/th>
&lt;th style="text-align:left">Description&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/incremental-features/simple-aggregations/" >Simple aggregations&lt;/a>&lt;/td>
&lt;td style="text-align:left">Direct composable aggregations using &lt;code>SUM&lt;/code>, &lt;code>MIN&lt;/code>, &lt;code>MAX&lt;/code>, &lt;code>COUNT&lt;/code> with merge property&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/incremental-features/compound-aggregations/" >Compound aggregations&lt;/a>&lt;/td>
&lt;td style="text-align:left">Aggregations requiring multiple intermediate simple composable aggregations, such as: &lt;br />&lt;br />&lt;ul>&lt;li>&lt;code>AVG(=SUM/COUNT)&lt;/code>&lt;/li>&lt;li>&lt;code>WEIGHTED_AVG(=SUM_OF_WEIGHTED_VALUES/SUM_OF_WEIGHTS)&lt;/code>&lt;/li>&lt;li>&lt;code>LAST_KNOWN_LOCATION(=MAX_BY(location update, update timestamp))&lt;/code>&lt;/li>&lt;li>arrays(e.g. &lt;code>LAST_10_TOUCHPOINTS&lt;/code>)&lt;/li>&lt;/ul>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">&lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/incremental-features/incremental-sql-models/" >Patterns requiring input pre-processing before aggregation&lt;/a>&lt;/td>
&lt;td style="text-align:left">An incremental SQL model maintains a running snapshot of input dataset. Non-incremental entity vars are then defined on top of this processed input.&lt;br />&lt;br />For example, window function cases can be made incremental using an intermediate incremental input window model, like &lt;code>user_touchpoints_in_last_30_days&lt;/code>, to subsequently define &lt;code>is_daily_active_user&lt;/code> and &lt;code>is_monthly_active_user&lt;/code> over it&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="see-also" data-heading="See also" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/" data-title="Incremental Features" -->
&lt;h2 id="see-also">See also&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/incremental-features/" >Incremental Features Developer Documentation&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/incremental-features/make-features-incremental/" >Make Features Incremental&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/checkpoints-and-baselines/" >Checkpoints and Baselines&lt;/a>: Point-in-time snapshots that enable incremental computation&lt;/li>
&lt;/ul></description></item><item><title>Archive: Feature Views</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/feature-views/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/feature-views/</guid><description>
&lt;p>This guide introduces you to the concept of feature views in Profiles and shows how to use them in your Profiles project.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="video-walkthrough" data-heading="Video walkthrough" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/feature-views/" data-title="Feature Views" -->
&lt;h2 id="video-walkthrough">Video walkthrough&lt;/h2>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://www.youtube.com/embed/Prr6glFjR_c" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" allowfullscreen title="YouTube Video">&lt;/iframe>
&lt;/div>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="overview" data-heading="Overview" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/feature-views/" data-title="Feature Views" -->
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Profiles adds a unique ID when you create a Customer360 (C360) table. But for most activation use cases, you need to use a specific ID from your data warehouse, like user_name, email, or anonymous ID. You can achieve this using SQL, the ID graph table, and the C360 table, but it is complicated and can be difficult to maintain.&lt;/p>
&lt;p>Profiles can create these pivots automatically with &lt;code>feature views&lt;/code>. They include the same &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/profiles-yaml/var-groups/entity-var/" >&lt;code>entity_vars&lt;/code>&lt;/a> as the C360 table but with the chosen ID as the primary key.&lt;/p>
&lt;p>&lt;strong>SQL Keyword&lt;/strong>: &lt;code>VIEW&lt;/code>&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="requirements" data-heading="Requirements" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/feature-views/" data-title="Feature Views" -->
&lt;h2 id="requirements">Requirements&lt;/h2>&lt;ul>
&lt;li>&lt;code>entity_vars&lt;/code> where &lt;code>is_feature&lt;/code> is set to &lt;code>true&lt;/code>.&lt;/li>
&lt;li>View primary ID is included in ID graph.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="usage" data-heading="Usage" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/feature-views/" data-title="Feature Views" -->
&lt;h2 id="usage">Usage&lt;/h2>&lt;p>Feature views (&lt;code>feature_views&lt;/code>) are in the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/pb-project-yaml/" >&lt;code>pb_project.yaml&lt;/code>&lt;/a> file within the &lt;code>entities&lt;/code> block, as 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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">llm_sdr_email_content_generation&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">schema_version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">85&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">connection&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">llm-recommend-dev&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_folders&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">models&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">entities&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&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">id_stitcher&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">models/user_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">id_types&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_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="l">anonymous_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="c">###########################################&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_views&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">using_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">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">anonymous_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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">anonymous_id_360&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">###########################################&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">id_types&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;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">anonymous_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">filters&lt;/span>&lt;span class="p">:&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;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">exclude&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&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;&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">python_requirements&lt;/span>&lt;span class="p">:&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;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="l">profiles_mlcorelib==0.7.2&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="best-practices" data-heading="Best practices" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/feature-views/" data-title="Feature Views" -->
&lt;h2 id="best-practices">Best practices&lt;/h2>&lt;ul>
&lt;li>Profiles automatically creates a feature view where the &lt;code>main_id&lt;/code> is the primary key, called &lt;code>{entity_name}_feature_view&lt;/code>. It is a best practice to create another &lt;code>feature view&lt;/code> using a desired ID type as the primary key for data activation.&lt;/li>
&lt;li>All features will be included in all feature views for an entity, unless you set &lt;code>is_feature&lt;/code> to &lt;code>false&lt;/code> for a specific &lt;code>entity_var&lt;/code>.&lt;/li>
&lt;li>Feature views are defined in &lt;code>pb_project.yaml&lt;/code> for the &lt;code>user/all&lt;/code> &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cohort/" >cohort&lt;/a>. For individual cohorts, they are defined in the cohort definition in &lt;code>profiles.yaml&lt;/code>.&lt;/li>
&lt;li>&lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cohort/" >&lt;code>Cohorts&lt;/code>&lt;/a> inherit the features from their parent, so you do not need to define them at the cohort level.&lt;/li>
&lt;/ul>
&lt;br /></description></item><item><title>Archive: Cohorts</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cohort/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cohort/</guid><description>
&lt;p>This guide introduces you to the concept of cohorts in Profiles and shows how to use them in your Profiles project.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="overview" data-heading="Overview" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cohort/" data-title="Cohorts" -->
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>All businesses have core entities like customers. Within those entities, there are core segments that are tracked and interacted with across the business, for example, high value customers, brands, business segments, regions, etc.&lt;/p>
&lt;p>In Profiles, you can create these enduring subsets by leveraging &lt;strong>cohorts&lt;/strong>. You use the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/features/" >features&lt;/a> of your Customer360 (C360) to filter &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/profiles-yaml/var-groups/entity-var/" >entities&lt;/a> into these cohorts. This gives you a stable definition for these important segments within the warehouse that you can leverage across the business.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="requirements" data-heading="Requirements" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cohort/" data-title="Cohorts" -->
&lt;h2 id="requirements">Requirements&lt;/h2>&lt;ul>
&lt;li>Features used for filtering must be defined in the &lt;code>entity/all&lt;/code> &lt;code>cohort&lt;/code> or other parent &lt;code>cohort&lt;/code> &lt;code>var_group&lt;/code>.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="usage" data-heading="Usage" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cohort/" data-title="Cohorts" -->
&lt;h2 id="usage">Usage&lt;/h2>&lt;p>You can define cohorts in the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/profiles-yaml/" >&lt;code>profiles.yaml&lt;/code>&lt;/a> file, as 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="c"># Cohort definition&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">credit_card_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">model_type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">entity_cohort&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">extends&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">customers/all&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">materialization&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_type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">view&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">filter_expression&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">AND&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="s2">&amp;#34;{{ customers.has_credit_card }} = 1&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">feature_views&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">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">email&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">credit_card_user_by_email&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"># Cohort Feature Definition&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">var_groups&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">credit_card_user_vars&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_cohort&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">models/credit_card_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">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">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">total_sales&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)&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/orders&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">total_orders&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(order_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/orders&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="best-practices" data-heading="Best practices" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cohort/" data-title="Cohorts" -->
&lt;h2 id="best-practices">Best practices&lt;/h2>&lt;ul>
&lt;li>Use cohorts as sub-groups that require a standard definition, can be used across teams, and are needed to exist for a long period of time. For example, key customer segments, brands, or business units, but not a campaign audience.&lt;/li>
&lt;li>Cohorts can also be a subset of another cohort. For example, you can create a cohort named &lt;code>known_mobile_users&lt;/code> by filtering the &lt;code>known_users&lt;/code> cohort.&lt;/li>
&lt;li>A child cohort inherits all the features from their parent and can have features and &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/feature-views/" >feature views&lt;/a> defined at the individual cohort level.&lt;/li>
&lt;/ul>
&lt;br /></description></item><item><title>Archive: Timegrains</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/timegrains/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/timegrains/</guid><description>
&lt;p>This guide introduces you to the concept of Timegrains in Profiles and shows how to define them in your Profiles project.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="overview" data-heading="Overview" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/timegrains/" data-title="Timegrains" -->
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Timegrains gives you the ability to control the frequency at which certain models run irrespective of the frequency at which you trigger the project runs. This is useful for:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Reducing compute costs&lt;/strong>: Features that don&amp;rsquo;t need real-time updates can be computed less frequently.&lt;/li>
&lt;li>&lt;strong>Organizing features by freshness&lt;/strong>: Group real-time signals separately from slow-changing attributes.&lt;/li>
&lt;li>&lt;strong>Managing non-composable functions&lt;/strong>: Features like percentiles or distinct counts that can&amp;rsquo;t be computed incrementally can use longer time grains.&lt;/li>
&lt;/ul>
&lt;p>You can &lt;a href="#usage" >define&lt;/a> the following timegrains in your model&amp;rsquo;s &lt;code>model_spec&lt;/code> file:&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="l">tick, 10minutes, hour, day, week, month, year&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For example, suppose you have defined a feature for which you do not need the most updated data, for example, computing a feature for each user every month. You can then set the &lt;code>time_grain&lt;/code> : &lt;code>month&lt;/code> and run the project. Profiles Builder ensures that this feature is computed only once a month. The computed values from the month boundary are used in all the subsequent &lt;code>feature_views&lt;/code>. Any new identified user identified after the start of the month boundary will have the value of that feature set to &lt;code>null&lt;/code>.&lt;/p>
&lt;p>Note that:&lt;/p>
&lt;ul>
&lt;li>You will get the same output if you specify a model’s &lt;code>time_grain&lt;/code> to be &lt;code>day&lt;/code> and you run this model multiple times a day.&lt;/li>
&lt;li>If a model’s &lt;code>time_grain&lt;/code> is specified to be &lt;code>day&lt;/code>, it will only consider input data until that day’s boundary (&lt;code>00:00 UTC&lt;/code>). Any data ingested after this timestamp is not considered in the computation.&lt;/li>
&lt;li>The boundary for a particular month is the first Monday of that month. For example, if March 1 is a Friday, then it&amp;rsquo;s boundary will be March 4th. Similarly, the boundary for the year is the first Monday of that year.&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="usage" data-heading="Usage" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/timegrains/" data-title="Timegrains" -->
&lt;h2 id="usage">Usage&lt;/h2>&lt;p>You can specify the timegrain in model_spec of any model. An example is shown below:&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">users_with_valid_email&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">entity_cohort&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">extends&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">user/all&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">time_grain&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;day&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">filter_expression&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">AND&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="s2">&amp;#34;NOT {{ user.Var(&amp;#39;id_type_email_count&amp;#39;) }} = 0&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">feature_views&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">users_with_valid_email_feature_view&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can also specify it at &lt;code>var_group&lt;/code> level. For 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">weekly_user_vars&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_cohort&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">models/new_users&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">time_grain&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;week&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">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">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">campaign_sources&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;{{list_agg(&amp;#39;context_campaign_source&amp;#39;, &amp;#39;,&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">inputs/rsTracks&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Note if you have specified &lt;code>time_grain&lt;/code> on any of the model, PB will need you to specify a &lt;code>default_time_grain&lt;/code> in your &lt;code>pb_project.yaml&lt;/code> file. Its value should be equal to or lower than the finest &lt;code>time_grain&lt;/code> you have used in any of the models. This &lt;code>default_time_grain&lt;/code> will be applied to all the models which don&amp;rsquo;t have a specified &lt;code>time_grain&lt;/code>.&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">default_time_grain&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;/code>&lt;/pre>&lt;/div>&lt;p>For example, if you have specified &lt;code>day&lt;/code>, &lt;code>week&lt;/code>, and &lt;code>month&lt;/code> as your timegrains for all your models, you will need to specify &lt;code>default_time_grain: day&lt;/code> . You can also set &lt;code>default_time_grain&lt;/code> to &lt;code>tick&lt;/code>, &lt;code>10minutes&lt;/code>, or &lt;code>hour&lt;/code> - however, this is &lt;strong>not&lt;/strong> recommended as it may negatively impact the performance.&lt;/p>
&lt;p>As a general rule, note that you should specify the &lt;code>default_time_grain&lt;/code> to match with your run schedule. If you are scheduling PB to run daily, its best to keep &lt;code>default_time_grain: day&lt;/code>. You can then accordingly schedule the run at &lt;code>00:00 UTC&lt;/code> so that the latest data is considered in the run.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="related-resources" data-heading="Related resources" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/timegrains/" data-title="Timegrains" -->
&lt;h2 id="related-resources">Related resources&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/features/" >Features&lt;/a>: Learn about defining features in Profiles.&lt;/li>
&lt;li>&lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/profiles-yaml/var-groups/" >Var Groups&lt;/a>: Reference for &lt;code>var_group&lt;/code> configuration including &lt;code>time_grain&lt;/code>.&lt;/li>
&lt;li>&lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/" >Incremental Features&lt;/a>: Optimize feature computation for large datasets.&lt;/li>
&lt;/ul>
&lt;br /></description></item><item><title>Archive: SQL Models</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/sql-models/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/sql-models/</guid><description>
&lt;p>This guide introduces you to the concept of SQL models in Profiles and shows how to use them in your Profiles project.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="overview" data-heading="Overview" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/sql-models/" data-title="SQL Models" -->
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>Profiles projects allows for the importing and transformation of almost any source. However, there are edge cases that cannot be completed, or are overly onerous in case of Profiles. You can use SQL models in such cases.&lt;/p>
&lt;p>SQL models allow you to model data using plain or templated SQL. This is useful for complex use cases where you need to join, union, or intermediately transform data.&lt;/p>
&lt;p>You can use a SQL model as an ephemeral source for ID stitcher and feature creation models, materialize it as a table or view.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="usage" data-heading="Usage" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/sql-models/" data-title="SQL Models" -->
&lt;h2 id="usage">Usage&lt;/h2>&lt;p>You can define SQL models in the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/sql-model-yaml/" >&lt;code>sql_model.yaml&lt;/code>&lt;/a> file, as 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">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">tracks_union_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">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">materialization&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_type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">view&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">run_type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">discrete&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 tracks = this.DeRef(&amp;#34;inputs/tracks&amp;#34;) pages = this.DeRef(&amp;#34;inputs/pages&amp;#34;) %}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> SELECT
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> anonymous_id,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> event,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> timestamp
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> FROM {{ tracks }}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> UNION
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> SELECT
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> anonymous_id,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> &amp;#39;page_viewed&amp;#39; AS event,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> timestamp
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> FROM {{ pages }}
&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;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="relationship-to-other-profiles-features" data-heading="Relationship to other Profiles features" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/sql-models/" data-title="SQL Models" -->
&lt;h2 id="relationship-to-other-profiles-features">Relationship to other Profiles features&lt;/h2>&lt;p>SQL models integrate with other Profiles capabilities:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Incremental SQL Models&lt;/strong>: Regular SQL models can be made incremental by dereferencing their own previous materialization. See &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/incremental-features/incremental-sql-models/" >Incremental SQL Models&lt;/a> for details on enabling incremental processing for complex stateful patterns.&lt;/li>
&lt;li>&lt;strong>ID Stitcher&lt;/strong>: SQL models can serve as ephemeral sources for ID stitcher, providing transformed data for identity resolution.&lt;/li>
&lt;li>&lt;strong>Feature Creation&lt;/strong>: SQL models can be used as intermediate data sources for entity vars and feature creation, enabling complex data transformations before aggregation.&lt;/li>
&lt;li>&lt;strong>Materialization Options&lt;/strong>: SQL models can be materialized as tables (persistent storage), views (virtual tables), or ephemeral sources (temporary computation).&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="best-practices" data-heading="Best practices" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/sql-models/" data-title="SQL Models" -->
&lt;h2 id="best-practices">Best practices&lt;/h2>&lt;ul>
&lt;li>Verify the outputs of any SQL model in your warehouse before adding to a Profiles project.&lt;/li>
&lt;/ul>
&lt;br /></description></item><item><title>Archive: Cleanup</title><link>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cleanup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cleanup/</guid><description>
&lt;p>This guide introduces you to the concept of cleanup in Profiles.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="overview" data-heading="Overview" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cleanup/" data-title="Cleanup" -->
&lt;h2 id="overview">Overview&lt;/h2>&lt;p>You can use the &lt;code>pb cleanup materials&lt;/code> command in RudderStack Profiles to remove any outdated materials (tables, views) from the data warehouse - thereby optimizing storage and ensuring that unnecessary historical materials do not accumulate over time.&lt;/p>
&lt;p>There are two ways to perform a material cleanup - &lt;a href="#old-version" >old&lt;/a> and &lt;a href="#new-version" >new&lt;/a>.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="old-version" data-heading="Old version" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cleanup/" data-title="Cleanup" -->
&lt;h2 id="old-version">Old version&lt;/h2>&lt;p>This version of cleanup decides which materials to delete depending on the time when PB last accessed it.&lt;/p>
&lt;p>This is the default mode now, meaning running &lt;code>pb cleanup materials&lt;/code> triggers this mode automatically.&lt;/p>
&lt;p>You can also specify a retention period in the above command by adding any of the following three flags:&lt;/p>
&lt;ul>
&lt;li>&lt;code>-r&lt;/code>&lt;/li>
&lt;li>&lt;code>--retention_time_in_ms&lt;/code>&lt;/li>
&lt;li>&lt;code>--retention_time_in_hours&lt;/code>&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">If no flag is passed, RudderStack considers a default retention period of 180 days.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;/html>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="usage" data-heading="Usage" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cleanup/" data-title="Cleanup" -->
&lt;h3 id="usage">Usage&lt;/h3>&lt;p>Some examples of using the cleanup command are shown:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nv">$pb&lt;/span> cleanup materials &lt;span class="c1"># Deletes materials whose last access time is greater than 30 days.&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="nv">$pb&lt;/span> cleanup materials -r &lt;span class="m">1&lt;/span> &lt;span class="c1"># Deletes materials whose last access time is greater than 1 day.&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="nv">$pb&lt;/span> cleanup materials --retention_time_in_ms &lt;span class="m">5&lt;/span> &lt;span class="c1"># Deletes materials whose last access time is greater than 5 milliseconds.&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="nv">$pb&lt;/span> cleanup materials --retention_time_in_hours &lt;span class="m">3&lt;/span> &lt;span class="c1"># Deletes materials whose last access time is greater than 3 hours.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="limitations" data-heading="Limitations" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cleanup/" data-title="Cleanup" -->
&lt;h3 id="limitations">Limitations&lt;/h3>&lt;p>Note that the old version create issues while performing cleanups in cases where you are using timegrains.&lt;/p>
&lt;p>Suppose you have a Profiles project which has:&lt;/p>
&lt;ul>
&lt;li>A weekly timegrain model that runs once per week and no other models of a finer timegrain depend on it.&lt;/li>
&lt;li>An hourly timegrain model that runs more frequently.&lt;/li>
&lt;li>Some models with a default timegrain of tick.&lt;/li>
&lt;/ul>
&lt;p>When you run this project daily, models only with timegrain finer than or equal to a day run everyday. However, the weekly model runs only once per week.&lt;/p>
&lt;p>If you run the cleanup on the fourth day after the weekly model was run with a retention period of 3 days, then the cleanup will delete its materials, even though the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/additional-resources/glossary/#frontier-views" >frontier views&lt;/a> still need them.&lt;/p>
&lt;p>A project run after this incident will again run the weekly timegrain model because it is deleted - this is inefficient. Also, the frontier views become useless as underlying materials are deleted.&lt;/p>
&lt;p>A new version of cleanup is available to overcome the above limitations.&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="new-version" data-heading="New version" data-level="2" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cleanup/" data-title="Cleanup" -->
&lt;h2 id="new-version">New version&lt;/h2>&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">Use this mode if you are using timegrains in your Profiles project.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;p>When PB runs, the &lt;code>retention_period&lt;/code> parameter defined in the &lt;code>pb_project.yaml&lt;/code> is recorded in the material registry against the models. The new cleanup version uses this value and also does dependency tracking when deciding which materials to delete.&lt;/p>
&lt;p>You can specify the &lt;code>retention_period&lt;/code> in the project as follows:&lt;/p>
&lt;ul>
&lt;li>In the &lt;a href="https://www.rudderstack.com/docs/archive/profiles/0.25/dev-docs/pb-project-yaml/" >&lt;code>pb_project.yaml&lt;/code>&lt;/a>:&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">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">profiles_project&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">schema_version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">85&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">connection&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">wh_connection_dev&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">retention_period&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">24h&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># 1 day&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>You can also specify &lt;code>retention_peroid&lt;/code> at the model level as well:&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">user_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">retention_period&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">24h&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/rsIdentifies&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;/code>&lt;/pre>&lt;/div>&lt;p>Note that:&lt;/p>
&lt;ul>
&lt;li>&lt;code>retention_period&lt;/code> should be strictly a non-zero positive value.&lt;/li>
&lt;li>RudderStack considers a default retention period of 30 days if not explicitly defined in the YAML using the &lt;code>retention_period&lt;/code> key.&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">If you have set up the Profiles project in the RudderStack dashboard, then the retention period specified in the project&amp;rsquo;s settings will be used during cleanup.&lt;/div>
&lt;/div>
&lt;/blockquote>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="usage-1" data-heading="Usage" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cleanup/" data-title="Cleanup" -->
&lt;h3 id="usage-1">Usage&lt;/h3>&lt;p>Pass the &lt;code>--expired&lt;/code> flag in the &lt;code>pb cleanup materials&lt;/code> command to trigger this mode.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pb cleanup materials --expired
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="deletion-criteria" data-heading="Deletion criteria" data-level="3" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cleanup/" data-title="Cleanup" -->
&lt;h3 id="deletion-criteria">Deletion criteria&lt;/h3>&lt;p>The criteria this cleanup mode uses to determine which materials to delete is explained below:&lt;/p>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="expiration-criteria" data-heading="Expiration criteria" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cleanup/" data-title="Cleanup" -->
&lt;h4 id="expiration-criteria">Expiration criteria&lt;/h4>&lt;ul>
&lt;li>
&lt;p>Every model has a &lt;strong>retention period&lt;/strong>, which you can set at the &lt;strong>model level&lt;/strong> or for the &lt;strong>entire project&lt;/strong>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>A material is considered &lt;strong>expired&lt;/strong> if all of the below conditions are met:&lt;/p>
&lt;ul>
&lt;li>Its &lt;strong>last access/reference time&lt;/strong> is before the current time - retention period.&lt;/li>
&lt;li>There exists a &lt;strong>newer run of the same model&lt;/strong>.&lt;/li>
&lt;li>No other &lt;strong>non-expired material depends on this material&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;!-- end-chunk -->
&lt;!-- begin-chunk data-anchor="preventing-accidental-deletion" data-heading="Preventing accidental deletion" data-level="4" data-permalink="https://www.rudderstack.com/docs/archive/profiles/0.25/concepts/cleanup/" data-title="Cleanup" -->
&lt;h4 id="preventing-accidental-deletion">Preventing accidental deletion&lt;/h4>&lt;p>This mode ensures that cleanup happens safely without unintentionally deleting materials that are still in use.&lt;/p></description></item></channel></rss>