diff --git a/greg/api/serializers/person.py b/greg/api/serializers/person.py
index b918ad26f8ace0a9f8515ddf2023460ac6988ad4..f5e946e98ead864cd98945d0f3e021ef2decbfa2 100644
--- a/greg/api/serializers/person.py
+++ b/greg/api/serializers/person.py
@@ -23,6 +23,7 @@ class PersonSerializer(serializers.ModelSerializer):
             "identities",
             "roles",
             "consents",
+            "meta",
         ]
 
 
diff --git a/greg/migrations/0028_person_meta_alter_invitation_role_and_more.py b/greg/migrations/0028_person_meta_alter_invitation_role_and_more.py
new file mode 100644
index 0000000000000000000000000000000000000000..eca548a0a4448aceb26164ff5b1ca9fde2d891ed
--- /dev/null
+++ b/greg/migrations/0028_person_meta_alter_invitation_role_and_more.py
@@ -0,0 +1,37 @@
+# Generated by Django 4.1.2 on 2023-01-23 15:47
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("greg", "0027_add_norwegian_national_id_card_identity_type"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="person",
+            name="meta",
+            field=models.JSONField(blank=True, null=True),
+        ),
+        migrations.AlterField(
+            model_name="invitation",
+            name="role",
+            field=models.ForeignKey(
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="invitations",
+                to="greg.role",
+            ),
+        ),
+        migrations.AlterField(
+            model_name="invitationlink",
+            name="invitation",
+            field=models.ForeignKey(
+                on_delete=django.db.models.deletion.CASCADE,
+                related_name="invitation_links",
+                to="greg.invitation",
+            ),
+        ),
+    ]
diff --git a/greg/models.py b/greg/models.py
index 1f3b6c4fb9ee2938067d992fda2cbb87f311e72f..2edb025079d9c646f14340f615957aeccac6d81d 100644
--- a/greg/models.py
+++ b/greg/models.py
@@ -44,6 +44,7 @@ class Person(BaseModel):
         null=True,
         blank=True,
     )
+    meta = models.JSONField(null=True, blank=True)
 
     objects = PersonManager()
 
diff --git a/greg/tests/api/test_person.py b/greg/tests/api/test_person.py
index 6d38d206532e70bc84ed27ccf92716f1829eae15..ee746b31db800cc538692740a69320ec7e21c396 100644
--- a/greg/tests/api/test_person.py
+++ b/greg/tests/api/test_person.py
@@ -132,6 +132,7 @@ def test_person_create(client):
         "identities": [],
         "roles": [],
         "consents": [],
+        "meta": None,
     }
 
 
@@ -711,3 +712,49 @@ def test_identity_post_fails_if_duplicate(client, person, person_foo):
     results = response.json()["results"]
     # No Norwegian national ID should have been added
     assert len(results) == 0
+
+
+@pytest.mark.django_db
+def test_meta_field_person(client):
+    url = reverse("v1:person-list")
+    data_bar = {"first_name": "Bar", "last_name": "Bar", "meta": {"likes": "math"}}
+    resp_post_bar = client.post(url, data=data_bar, format="json").json()
+    assert resp_post_bar.get("meta").get("likes") == data_bar["meta"]["likes"]
+
+    resp_get = client.get(url).json()["results"]
+    assert len(resp_get) == 1
+
+    data_foo = {"first_name": "Foo", "last_name": "Foo", "meta": {"likes": "fishing"}}
+    resp_post_foo = client.post(url, data=data_foo, format="json").json()
+    assert resp_post_foo.get("meta") == data_foo["meta"]
+
+    resp_all = client.get(url).json()["results"]
+    assert len(resp_all) == 2
+
+    resp_bar = resp_all[0]
+    resp_foo = resp_all[1]
+    assert resp_bar.get("meta") == data_bar["meta"]
+    assert resp_foo.get("meta") == data_foo["meta"]
+
+
+@pytest.mark.django_db
+def test_meta_field_person_id(client, person_foo):
+    url = reverse("v1:person-detail", kwargs={"id": person_foo.id})
+    resp = client.get(url).json()
+    assert resp.get("meta") is None
+
+    put_data = {"first_name": "Foo", "last_name": "Foo", "meta": {"likes": "math"}}
+    resp_put = client.put(url, data=put_data, format="json").json()
+    assert resp_put.get("meta").get("likes") == put_data["meta"]["likes"]
+
+    resp = client.get(url).json()
+    assert resp.get("meta").get("likes") == put_data["meta"]["likes"]
+
+    patch_data = {
+        "meta": {"likes": "math", "hobby": "eating"},
+    }
+    resp_patch = client.patch(url, data=patch_data, format="json").json()
+    assert resp_patch.get("meta") == patch_data["meta"]
+
+    resp = client.get(url).json()
+    assert resp.get("meta") == patch_data["meta"]