Files
twenty/packages/twenty-apps/internal/twenty-last-contact
Raphaël Bosi c52c983b90 Source app About description from README and improve internal app READMEs (#22012)
## What

- The SDK manifest build now sources an app's `aboutDescription` (the
long-form "About" tab content) from its `README.md`. An explicit
`aboutDescription` in the config still wins, matching the existing
marketplace CDN fallback.
- Removed the now-duplicated `aboutDescription` from internal app
configs and deleted the standalone `ABOUT_DESCRIPTION` constant files.
- Rewrote internal app READMEs to read as user-facing About content:
stripped developer/build/source-path noise, and expanded the thin ones.
`call-recording` and `self-hosting` (one-liners over substantial apps)
and `people-data-labs` were rewritten from a close reading of the code;
`twenty-exa` was verified for accuracy.
- Added a unit test (and a fixture README) covering README →
`aboutDescription` in the build.

## Why

The README and the About description were maintained separately and
drifted. Making the README the single source keeps the About tab
accurate and removes duplicated copy.

## Notes for reviewers

- Internal apps depend on the published `twenty-sdk`, so the build
change takes effect for them after an SDK release + dependency bump.
Until then, published apps still get README → `aboutDescription` via the
marketplace CDN sync.
- Standard/Custom app descriptions are unchanged (they are resolved in
the frontend, not via the manifest).

<!-- This is an auto-generated description by cubic. -->
<a
href="https://cubic.dev/pr/twentyhq/twenty/pull/22012?utm_source=github"
target="_blank" rel="noopener noreferrer"
data-no-image-dialog="true"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"><source
media="(prefers-color-scheme: light)"
srcset="https://www.cubic.dev/buttons/review-in-cubic-light.svg"><img
alt="Review in cubic"
src="https://www.cubic.dev/buttons/review-in-cubic-dark.svg"></picture></a>
<!-- End of auto-generated description by cubic. -->
2026-06-23 15:27:52 +02:00
..
2026-06-12 13:42:18 +00:00
2026-06-12 13:42:18 +00:00
2026-06-12 13:42:18 +00:00

Last contacted at

A Twenty official application that adds a lastContactAt field to the standard Person object and keeps it in sync with email and calendar activity — answering the question every CRM should answer instantly: when did we last talk to this person?

Why teams install it

  • Zero manual logging — every synced email and calendar meeting updates the field automatically, in real time.
  • Useful from minute one — on install, your entire email and meeting history is backfilled. No empty columns, no waiting.
  • Spot cold relationships instantly — sort or filter any People view by Last Contact to build follow-up lists in seconds.
  • Meeting-aware — a meeting counts as contact the moment it starts, not whenever someone remembers to update the CRM.

What it does

  • Adds a Last Contact (lastContactAt, DATE_TIME) field on Person, visible in the All People view.
  • Sets the field to the most recent interaction whenever a synced email or calendar event is linked to a person.
  • Counts a meeting as contact when it starts, via a cron-triggered logic function.
  • Backfills the field from existing message and calendar history right after install.

No setup, no configuration — install it, open People, and you immediately know who needs a follow-up.

Application variables

Variable Default Description
CALENDAR_CRON_INTERVAL_MINUTES 5 Interval between runs of on-calendar-event-started. The cron scans events that started within the last interval plus a 5-minute safety overlap.