ProductService
Stored in the productservices collection. createdAt and updatedAt are maintained automatically.
Returned by GET /product-service, POST /product-service, GET /product-service/:id, PUT /product-service/:id.
Example
One real ProductService as returned by GET /product-service, taken from the data array. Recorded from a live response, so the defaults, denormalised snapshots and populated fields are the actual ones:
{
"_id": "6a957378859eafb47bf227d1",
"name": "Starter plan",
"type": "Service",
"company": "6a9572df859eafb47bf225d7",
"createdBy": {
"_id": "6a9572df859eafb47bf225d9",
"name": "Docs Test User",
"email": "test@test.test"
},
"createdBySnapshot": {
"member": "6a9572df859eafb47bf225d9",
"name": "Docs Test User",
"email": "test@test.test"
},
"updatedBy": {
"_id": "6a9572df859eafb47bf225d9",
"name": "Docs Test User",
"email": "test@test.test"
},
"updatedBySnapshot": {
"member": "6a9572df859eafb47bf225d9",
"name": "Docs Test User",
"email": "test@test.test"
},
"createdAt": "2026-08-31T12:28:40.355Z",
"updatedAt": "2026-08-31T12:28:40.355Z",
"searchText": "starter plan service docs test user test@test.test",
"__v": 0
}
:::note Trimmed for reading A populated reference is shown by the fields that identify it rather than in full — it arrives as the entire referenced document. Long arrays are cut to the first two entries and marked, long strings are truncated, and any field that could carry a credential is dropped rather than masked. :::
Fields
| Field | Type | Notes |
|---|---|---|
fields | object[] | default [] |
fields._id | ObjectId -> CustomField | required |
fields.value | any | |
customFieldsMap | map | default {} |
name | string | required |
description | string | |
type | string | required · one of Product, Service |
category | string | one of Service, Software, Hardware, Negotiation, Subscription, License, Consulting, Maintenance and 5 more |
price.currency | string | |
price.amount | number | |
skuNumber | string | |
image | ObjectId -> File | |
url | string | |
company | ObjectId -> Company | required |
createdBy | ObjectId -> Member | |
createdBySnapshot | object | |
createdBySnapshot.member | ObjectId | |
createdBySnapshot.name | string | |
createdBySnapshot.email | string | |
updatedBy | ObjectId -> Member | |
updatedBySnapshot | object | |
updatedBySnapshot.member | ObjectId | |
updatedBySnapshot.name | string | |
updatedBySnapshot.email | string | |
searchText | string | |
_id | ObjectId | |
createdAt | date | set once |
updatedAt | date |