# Conditional Validation Support in Rudder CLI

<p>
    <div>
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bwxpUz9Q4r8?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" title="YouTube video"></iframe>
    </div>
<br/></p>
<p>RudderStack&rsquo;s <a href="https://www.rudderstack.com/docs/data-governance/tracking-plans/" >Tracking Plans</a> enable data teams to apply type-safe governance to event schemas. While our governance features ensure consistency and predictability, real-world applications often require schemas to adapt based on business context.</p>
<p>With the release of <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/data-catalog-and-tracking-plans/conditional-validation/" >Conditional Validation</a>, you can now define validation rules that dynamically adjust based on discriminator properties. This powerful capability addresses a common challenge — maintaining strict data quality standards while accommodating legitimate variations in your event data structure.</p>
<p>With conditional validation, you can:</p>
<ul>
<li>Define context-aware validation rules that adapt based on specific property values</li>
<li>Prevent event proliferation by consolidating similar events with varied requirements</li>
<li>Enforce granular validation on custom types that need to behave differently in different scenarios</li>
<li>Maintain data quality without sacrificing flexibility for legitimate business variations</li>
</ul>
<p>You can leverage conditional validation both on the event schema level and within custom types, and manage everything via <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/data-catalog-and-tracking-plans/" >workspace configuration files</a> using <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/" >Rudder CLI</a>.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="use-cases">Use cases</h2><p>This section provides some examples of using the conditional validation feature.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="event-level-conditional-validation">Event-level conditional validation</h3><ul>
<li><strong>Adaptive page tracking</strong>: Single <code>Page Viewed</code> event with different required properties based on page type — for example, search term for search pages, product details for product pages, checkout step for checkout pages</li>
<li><strong>Context-aware form submissions</strong>: Different required fields based on form type or user journey stage</li>
<li><strong>Dynamic feature usage tracking</strong>: Varying property requirements based on feature context or user role</li>
</ul>
<p>See <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/data-catalog-and-tracking-plans/conditional-validation/event-rules/" >Event Rule Variants</a> for more details on creating and managing event rule variants in your Tracking Plans using Rudder CLI.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h3 id="custom-type-conditional-validation">Custom type conditional validation</h3><ul>
<li><strong>Regional address formats</strong>: Different required fields for US addresses (state + ZIP) vs. UK addresses (postcode) vs. Japanese addresses (prefecture + district)</li>
<li><strong>Manufacturer vs. marketplace products</strong>: Require MSRP and Manufacturer ID for direct products, and require Seller ID for marketplace items</li>
<li><strong>Account tier-specific profiles</strong>: Different required profile fields for individual vs. business vs. enterprise accounts</li>
</ul>
<p>See <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/data-catalog-and-tracking-plans/conditional-validation/custom-type-rules/" >Custom Type Variants</a> for more details on creating and managing custom type variants using Rudder CLI.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="how-it-works">How it works</h2><p>Conditional validation uses discriminator properties to determine which validation rules apply. A discriminator is a required property whose value triggers specific validation cases.</p>
<p>For example, in an ecommerce tracking scenario:</p>
<ol>
<li>
<p><strong>Discriminator property</strong>: <code>page_type</code> (enumerated list defined in Data Catalog)</p>
</li>
<li>
<p><strong>Variant cases</strong>:</p>
<ul>
<li>When <code>page_type</code> = <code>search_page</code>: Require the <code>search_term</code> property</li>
<li>When <code>page_type</code> = <code>product</code>: Require the <code>product</code> object property</li>
</ul>
</li>
</ol>
<p><strong>Result</strong>: Same event handles both scenarios with appropriate validation.</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h2 id="implementation">Implementation</h2><p>Conditional validation works at two levels:</p>
<!-- end-chunk -->
<!-- begin-chunk -->
<h4 id="event-rule-variants">Event rule variants</h4><p>Define variants within your <code>tracking-plans.yaml</code> to create context-aware event validation:</p>
<div class="rs-code">
  <div class="rs-code__head">yaml<button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-yaml" data-lang="yaml">version: &#34;rudder/v0.1&#34;
kind: &#34;tp&#34;
metadata:
  name: &#34;ecommerce_tracking_plan&#34;
spec:
  id: &#34;ecommerce_tracking_plan&#34;
  display_name: &#34;Ecommerce Store - Tracking Plan&#34;
  description: &#34;Comprehensive tracking plan for the casual apparel e-commerce demo site built with React TypeScript. Captures user behavior across product discovery, cart interactions, and purchase completion for analytics and optimization.&#34;
  rules:
    - type: &#34;event_rule&#34;
      id: &#34;page_viewed_rule&#34;
      event:
        $ref: &#34;#/events/ecommerce_events/page_viewed&#34;
        allow_unplanned: false
      properties: 
        # Base properties required for all page views
        - $ref: &#34;#/properties/ecommerce_properties/page_type&#34;
          required: true
        - $ref: &#34;#/properties/ecommerce_properties/page_name&#34;
          required: false
        - $ref: &#34;#/properties/ecommerce_properties/page_url&#34;
          required: false
      
      # Conditional Validation Variants
      variants:
        - type: discriminator
          discriminator: &#34;#/properties/ecommerce_properties/page_type&#34;
          cases:
            - display_name: &#34;Product Detail Page&#34;
              match: 
                - &#34;product&#34;
              description: &#34;When user is viewing a specific product page&#34;
              properties:
                - $ref: &#34;#/properties/ecommerce_properties/product&#34;
                  required: true
                  
            - display_name: &#34;Search Results Page&#34;
              match: 
                - &#34;search&#34;
              description: &#34;When user is on search or category pages&#34;
              properties:
                - $ref: &#34;#/properties/ecommerce_properties/search_term&#34;
                  required: true 
          
          # Default case for home and other pages (only page_url required)
          default:
            - $ref: &#34;#/properties/ecommerce_properties/page_url&#34;
              required: true%</code></pre></div>
</div>
<!-- end-chunk -->
<!-- begin-chunk -->
<h4 id="custom-type-variants">Custom type variants</h4><p>Define variants within your <code>custom-types.yaml</code> to create reusable, context-aware object types:</p>
<div class="rs-code">
  <div class="rs-code__head">yaml<button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-yaml" data-lang="yaml">version: &#34;rudder/v0.1&#34;
kind: &#34;custom-types&#34;
metadata:
  name: &#34;ecommerce_types&#34;
spec:
  types:
    # Product Type - Consolidates all product-related properties with conditional MSRP validation
    - id: Product_Object
      name: &#34;Product_Object&#34;
      description: &#34;Custom type for product information with conditional manufacturer pricing validation&#34;
      type: &#34;object&#34;
      properties:
        - $ref: &#34;#/properties/ecommerce_properties/product_id&#34;
          required: true
        - $ref: &#34;#/properties/ecommerce_properties/product_sku&#34;
          required: true
        - $ref: &#34;#/properties/ecommerce_properties/product_name&#34;
          required: true
        - $ref: &#34;#/properties/ecommerce_properties/product_category&#34;
          required: true
        - $ref: &#34;#/properties/ecommerce_properties/product_price&#34;
          required: true
        - $ref: &#34;#/properties/ecommerce_properties/manufacturer_pricing&#34;
          required: false      
      # Conditional Validation Variants for Product Object
      variants:
        - type: discriminator
          discriminator: &#34;#/properties/ecommerce_properties/manufacturer_pricing&#34;
          cases:
            - display_name: &#34;Product with Manufacturer Pricing&#34;
              match:
                - true
              description: &#34;Products that have manufacturer suggested retail price (MSRP)&#34;
              properties:
                - $ref: &#34;#/properties/ecommerce_properties/product_msrp&#34;
                  required: true</code></pre></div>
</div>
<!-- end-chunk -->
<!-- begin-chunk -->
<h4 id="deploy-the-changes-to-your-workspace">Deploy the changes to your workspace</h4><div class="rs-code">
  <div class="rs-code__head">bash<button class="rs-code__copy" type="button">
      
      Copy
    </button>
  </div>
  <div class="highlight"><pre class="chroma"><code class="language-bash" data-lang="bash">rudder-cli apply -l ~/path_to_tracking_plan_dir</code></pre></div>
</div>
<p>See the <a href="https://www.rudderstack.com/docs/dev-tools/rudder-cli/data-catalog-and-tracking-plans/conditional-validation/" >Conditional Validation</a> documentation for more details.</p>
<br />
