Project structure
To define an app event type, create anapp-events directory within src/app/. Then, add a configuration file to that directory for each event type you want to define, using the naming convention *-hsmeta.json.
project
src
app
app-hsmeta.json
app-events
my-event-type-hsmeta.json
- Your app must use OAuth authentication and be configured for HubSpot Marketplace distribution. In addition, the app must include
timelinein itsrequiredScopes. Learn more about app configuration. - Your project must successfully deploy before you can include an app event component.
Event type configuration
Below are the configuration options available for event type schemas (*-hsmeta.json). Note that objectType cannot be changed after the event type is created.
Event properties
Theproperties array of the schema contains the fields that you can send event occurrence data to. When HubSpot receives event occurrence data, it validates any properties included with it against the ones defined in the schema. Incoming occurrence properties must match these event type properties, otherwise HubSpot will reject the occurrence.
Property stamping
In some cases, you may want to modify the CRM record’s property values based on app event occurrence data. For example, you may want to update a contact’s first and last name with new values set by the occurrence (e.g., form submission). To update CRM record properties via event occurrences, you can link an event property to a CRM property within the event type schema. In the definition fields for a given event property, include theobjectProperty field and specify the CRM property to link. Once a property is linked, HubSpot will always update the property value on the CRM record using the value from the most recent occurrence based on the timestamp field.
For example, the event type schema below links the event property customerName with a custom contact property named custom_property_name. When event occurrence data includes a value for customerName, custom_property_name will be updated for the associated CRM record.
Rendering templates
Event type schemas can include theheaderTemplate and detailTemplate fields to configure how event occurrences renders on CRM record timelines.
headerTemplate: a one-line description of the event at the top of the activity card (up to 1,000 characters).detailTemplate: the details of the event in the body of the activity card (up to 10,000 characters).
- In both templates, you can access any
propertydata passed by the event occurrence using the syntax{{propertyName}}. - In the
detailTemplate, you can additionally accessextraDatavalues passed by the event occurrence using the syntax{{extraData.fieldName}}. You can access any tier of attribute inextraDatathrough dot notation, such as{{extraData.person1.preferredName}}.
customerName and loginLocation property data, along with the surveyData field from extraData sent via the event occurrence.

detailTemplate includes the #if helper to conditionally render content based on whether the event occurrence data includes the surveyData field in extraData.
- If
extraDatacontainssurveyData, show the post-login survey responses. - If no
surveyDatawas present in the event occurrence, renderNo additional information..

Using iframes
When event occurrence data contains thetimelineIFrame field, the timeline activity card will include a hyperlink that users can click to open the linked contents in an iframe.

Event occurrences
To send event occurrences for a given event type, make aPOST request to the endpoints below. The app events API includes endpoints for sending single event occurrences and batches of multiple event occurrences. For both endpoints, the event occurrence data will need to be validated against an existing event type schema, which you’ll specify with eventTypeName in the request body.
- Send a single occurrence
- Send a batch of occurrences
To send a single event occurrence, make a
POST request to /integrators/timeline/v4/events.In the request body, include the event occurrence data, adhering to the event type’s defined schema.eventTypeName, which can either be your app’s uid defined in the top-level *-hsmeta.json file, or fullyQualifiedName returned from the /integrators/timeline/v4/types/projects API.
If any occurrences fail to validate, successfully validated occurrences will still be accepted and persisted. The error messaging in the response will provide information about what you’ll need to fix.

CRM record association
Each event occurrence must be associated with a CRM record, with the CRM object type defined by the event type schema. The app events API includes multiple fields for associating event occurrence data with CRM records. For all supported CRM objects, it’s recommended to use theobjectId field. However, there are some situations where you may want to use the other fields.
utk/email: if you don’t know the contact’s ID, use theutkand/oremailfield for identification. Providing both of these identifiers also enables you to create and update contacts. For example:- If
utkmatches an existing contact but theemaildoesn’t match, HubSpot will update the contact with the new email address. - If no
objectIdis provided, the event occurrence will associate with an existing contact that matches theutk/email, or HubSpot will create a new contact if no match is found. - Note that the
utkalone cannot create new contacts. You should always includeemailwithutkto ensure proper association.
- If
domain: for company association, you must provide theobjectId, but you can also includedomainto update thedomainproperty of that company.