> For the complete documentation index, see [llms.txt](https://codifi-fdm.gitbook.io/codifi-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://codifi-fdm.gitbook.io/codifi-docs/cross-platform-features/ripple/examples.md).

# Real-World Examples

Full Ripple configurations for common Cultural Resource Management (CRM) and field-survey workflows. Each example includes the scenario, the Ripple solution, and what users see.

***

## Prehistoric vs. Historic Workflows

**The challenge:** In CRM, sites and features can be prehistoric, historic, or multi-component. Each temporal affiliation requires different recording fields. Showing all fields at once makes the form overwhelming and error-prone.

**The Ripple solution:** Use a single *Temporal Affiliation* dropdown to control the visibility of entire sections.

| User selects…      | Sections shown                                             | Sections hidden                                            |
| ------------------ | ---------------------------------------------------------- | ---------------------------------------------------------- |
| Prehistoric        | Prehistoric Culture, Prehistoric Features, Lithic Analysis | Historic Period, Historic Function, Architectural Details  |
| Historic           | Historic Period, Historic Function, Architectural Details  | Prehistoric Culture, Prehistoric Features, Lithic Analysis |
| Multi-component    | All sections shown                                         | None hidden                                                |
| (not yet selected) | None of the above                                          | All conditional sections hidden                            |

**What the user experiences:** They select "Historic" from the dropdown, and the form instantly reshapes itself — historic-specific fields appear, prehistoric fields disappear. The form stays clean, focused, and impossible to fill out incorrectly.

***

## Status-Driven Data Triggers

**The challenge:** When a Record's status changes (e.g., from "In Progress" to "Complete" or "Needs Review"), you want certain fields to appear and certain defaults to fill in.

**The Ripple solution:** Combine [visibility formulas](/codifi-docs/cross-platform-features/ripple/visibility-formulas.md) and [value formulas](/codifi-docs/cross-platform-features/ripple/value-formulas.md) that react to status changes.

| When Status changes to… | What happens automatically                                                                                                                          |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| **In Progress**         | <p><em>Date Started</em> defaults to today's date<br><em>Assigned To</em> field becomes visible</p>                                                 |
| **Needs Review**        | <p><em>Review Notes</em> section appears<br><em>Reviewer</em> field becomes visible<br><em>Date Submitted</em> defaults to today</p>                |
| **Complete**            | <p><em>Completion Date</em> defaults to today<br><em>Completion Summary</em> auto-generates<br>All editing sections become read-only indicators</p> |
| **Rejected**            | <p><em>Rejection Reason</em> section appears<br><em>Rework Required</em> checkbox shown</p>                                                         |

#### Auto-Completion Summary on Status Change

When status is set to "Complete", a summary field auto-populates.

**Visibility:** show when `Status = "Complete"`

**Value formula** for *Completion Summary*:

```
concat(
  "Completed on ", formatDate(today(), "MM/DD/YYYY"),
  " by ", assigneeName, ". ",
  completedFieldCount, " of ", requiredFieldCount,
  " required fields recorded."
)
```

**Result:**

> "Completed on 04/10/2026 by John Smith. 20 of 20 required fields recorded."

***

## Spatial QC: Point-to-Line Distance

**The challenge:** During pedestrian survey, artifacts and features are recorded as points along a transect line. Sometimes GPS drift or recording errors place a point far from where it should be. You need to automatically flag these for QC review.

**The Ripple solution:** Calculate the distance from each child point to its parent transect line. Display the distance and show a warning when it exceeds a threshold.

| Record          | Geometry | Distance to Transect | QC Flag?                |
| --------------- | -------- | -------------------- | ----------------------- |
| Artifact IF-001 | Point    | 3.2 m                | —                       |
| Artifact IF-002 | Point    | 1.8 m                | —                       |
| Artifact IF-003 | Point    | 67.4 m               | ⚠ Over 50 m — check GPS |
| Feature F-001   | Point    | 12.1 m               | —                       |
| Artifact IF-004 | Point    | 0.5 m                | —                       |

#### Configuration

Three formulas working together on each child Record.

**Field:&#x20;*****Distance from Transect (m)***

```
Value: round(pointToLineDistance(this, parent line), 1)
```

**Field:&#x20;*****QC Warning***

```
Visibility: SHOW when "Distance from Transect" > 50

Value: concat(
  "⚠ This record is ",
  round("Distance from Transect", 0),
  "m from the transect. Please verify GPS coordinates."
)
```

**Result:** `"⚠ This record is 67m from the transect. Please verify GPS coordinates."`

***

## Concatenated Record Summaries

**The challenge:** Managers and PIs need quick, at-a-glance summaries of Records. Instead of opening each Record to check details, they want a single text field that tells them everything important.

**The Ripple solution:** Build a concatenated summary field that pulls from multiple sources.

#### Site Summary Paragraph

Automatically generated on a Site Record using child aggregation and spatial data.

```
concat(
  titleFieldValue, " is a ", "Site Type",
  " site recorded on ", formatDate(startDate, "MM/DD/YYYY"),
  " by ", assigneeName, ". ",
  "It has ", count(childrenOfType("Feature")), " features containing ",
  sumChildren("Feature", "Artifact Count"), " artifacts. ",
  "The site boundary encompasses ",
  round(polygonArea() / 4046.86, 2), " acres ",
  "with a perimeter of ",
  round(polygonPerimeter(), 0), " meters."
)
```

**Result:**

> "LA 12345 is a Habitation site recorded on 03/15/2026 by Maria Garcia. It has 32 features containing 324 artifacts. The site boundary encompasses 2.34 acres with a perimeter of 612 meters."

#### Transect Summary

Summary for a pedestrian survey transect.

```
concat(
  "Transect ", titleFieldValue,
  " is ", round(lineLength(), 0), " meters long. ",
  count(childrenOfType("Isolate")), " isolates and ",
  count(childrenOfType("Site")), " sites were recorded. ",
  "Visibility: ", "Ground Visibility", ". ",
  "Vegetation: ", "Vegetation Type", "."
)
```

**Result:**

> "Transect T-014 is 1,247 meters long. 3 isolates and 1 site were recorded. Visibility: 75-100%. Vegetation: Mixed Grassland."

***

## Survey Area & Length Calculations

**The challenge:** Projects need to track how much area has been surveyed, how many linear meters of transect have been walked, and acreage for reporting to clients and agencies.

**The Ripple solution:** Use spatial operators on each Record, then aggregate up to the Project level.

| Level                      | Formula                                                                                                                          | Result                                        |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- |
| **Survey Block** (polygon) | <p><code>Area = polygonArea() / 4046.86</code><br><code>Perimeter = polygonPerimeter()</code></p>                                | <p>Area: 12.5 acres<br>Perimeter: 1,423 m</p> |
| **Transect** (line)        | <p><code>Length = lineLength()</code><br><code>Track = totalTrackLength()</code></p>                                             | <p>Length: 1,247 m<br>Track: 1,312 m</p>      |
| **Site** (polygon)         | <p><code>Area = polygonArea()</code><br><code>Acres = Area / 4046.86</code></p>                                                  | <p>Area: 2,340 m²<br>Acres: 0.58</p>          |
| **Project** (roll-up)      | <p><code>Total Area = sumChildren("Block", "Area")</code><br><code>Total Transect = sumChildren("Transect", "Length")</code></p> | <p>Total: 487 acres<br>Transect: 52.3 km</p>  |

***

## See Also

* [Value Formulas](/codifi-docs/cross-platform-features/ripple/value-formulas.md) — math, text, dates, and lookups
* [Visibility Formulas](/codifi-docs/cross-platform-features/ripple/visibility-formulas.md) — show/hide rules
* [Spatial Formulas](/codifi-docs/cross-platform-features/ripple/spatial-formulas.md) — distance, area, perimeter, and coordinate operators
* [Aggregation Formulas](/codifi-docs/cross-platform-features/ripple/aggregation-formulas.md) — sum, count, and concat across rows or children
