Write complex expressions using FEEL (Friendly Enough Expression Language)

Use Advanced rules in APD to define complex, edition-aware validation and availability logic using FEEL expressions, enabling cross-field and cross-coverage rules beyond the capabilities of Basic mode. For information about FEEL, see the DMN FEEL handbook.

Note: Use Advanced rules when you need logic that would previously have required custom scripting. Continue to use Basic mode for straightforward, single-field constraints. Advanced rules are disabled by default, but can be enabled on a per tenant basis. Contact Guidewire to enable Advanced rules.

APD supports an Advanced rules mode, allowing you to define complex validation and availability logic using FEEL expressions. In the Rules dialog, you can choose between:

  • Basic – A guided condition builder for simple field-level rules, such as required fields, minimum and maximum values, and availability.
  • Advanced (Field Expression) – A FEEL editor for defining cross-field, cross-coverage, and collection or aggregation logic that exceeds the capabilities of Basic mode.

With Advanced rules, you can:

  • Express rich validation rules, such as "If coverage A limit is changed, adjust or validate coverage B limit" or "Require at least one item in a schedule to meet a condition."
  • Implement advanced availability logic that depends on multiple coverages, terms, or risk attributes, including rules that traverse schedules and nested structures.
  • Use APD as the single source of truth for product rules, with FEEL-based expressions stored with editions and executed at runtime by the Guidewire rules infrastructure.

Advanced mode provides a FEEL text editor with awareness of APD product model fields. Existing rules remain fully compatible, and there is no forced migration of current configurations.

For example, you can write the following FEEL expression in APD:
(some risk in TSTLine.RulesTestCoverable satisfies
  risk.IntegerField between 1 and 7 and date(risk.DateTimeField) >= today() - duration("P6M") and 
  some childRisk in risk.RulesTestGCCoverables satisfies
    starts with(childRisk.name, "TargetName")) and count(TSTLine.ConfiguredCoverable) > 0 and 
every risk in TSTLine.ConfiguredCoverable satisfies count(risk.ConfiguredOneToOnes) = 1