---
title: "Contacts"
description: "People and companies. One record for every person and organisation you deal with, shared by all other apps."
canonical: "https://obop.dev/apps/contacts/"
lang: "en"
---

# Contacts

## What it is for

One record for every person and organisation you deal with, shared by all other apps. Names and emails are personal data and are masked for agents; the tax identifier is withheld from them entirely. A dedicated, approval-gated erase action anonymises a contact in place.

## What the package does and does not do

People and organisations the business deals with: the shared party record that CRM, Sales and Invoicing refer to.

## Models

### `party`

A person or organisation the business deals with

Read group: `base.user`. Write group: `base.user`.

| Field | Kind | Data class | Personal data | Group | Agents see | Description |
|---|---|---|---|---|---|---|
| `name` | text | `public_directory` | yes | `base.user` | masked | Display name |
| `email` | text | `public_directory` | yes | `base.user` | masked | Work email address |
| `tax_id` | text | `financial` | yes | `base.user` | withheld | Tax identifier of a natural person |
| `notes` | longtext | `internal` | yes | `base.user` | masked | Free-text internal notes |

## Workflows

### `party`

| Action | Moves | Who may run it | Approval |
|---|---|---|---|
| `party.erase` | - | `privacy.officer` | yes |

## Permission groups

Groups used by this app:

- `base.user`
- `privacy.officer`

## Approval steps

Steps an agent can only propose:

- `party.erase`

## What agents can and cannot do

An agent can read, search, create and update records of this app, and run the actions that need no approval, within the permission groups of its token.

It can only propose these steps, and a person must approve them: `party.erase`, `party.delete`.

Personal data is masked as placeholder tokens: `party.name`, `party.email`, `party.notes`.

These fields are withheld from agents entirely: `party.tax_id`.

## Dependencies

None.

## Install

Built in. It is available in every instance and cannot be removed.

## Build your own

[The module guide shows how apps like this one are written](/docs/reference/module-manifest/)
