{
  "application": {
    "universalIdentifier": "66a504cc-0a75-410e-a43f-cdeae1db1522",
    "author": "Twenty",
    "category": "Productivity",
    "displayName": "Last contact",
    "description": "Know where every relationship stands. Adds Last contact, Last outbound, Last inbound, Last contact by, and the last email and meeting to People, plus Last contact on Companies and Opportunities, kept up to date automatically from your synced emails and meetings.",
    "serverVariables": {
      "LAST_CONTACT_BACKFILL_BATCH_SIZE": {
        "description": "How many records each last-contact backfill job processes. Also sets how many batch jobs are enqueued (record count divided by this). Defaults to 200 when unset.",
        "isSecret": false,
        "type": "NUMBER"
      },
      "LAST_CONTACT_BACKFILL_SLEEP_MS": {
        "description": "How many milliseconds to stagger consecutive backfill jobs by, so they do not all run at once and hit the API rate limiting. Defaults to 1000 when unset.",
        "isSecret": false,
        "type": "NUMBER"
      }
    },
    "logo": "public/logo.png",
    "galleryImages": [
      "public/gallery/cover.png"
    ],
    "defaultRoleUniversalIdentifier": "34187abe-1b98-4153-85cd-4808e0aebf30",
    "aboutDescription": "# Last Contact\n\n**Always know where every relationship stands — live on your People list, straight from your synced email and calendar.**\n\n## ✨ What you get\n\n- **Live columns on People, Companies and Opportunities** — last contact, who reached out (you or them), the owning teammate, and the exact email or meeting behind it\n- **Zero upkeep** — updates in real time from every synced email and meeting, with your full history backfilled the moment you install\n- **Follow-ups made obvious** — sort by recency to catch cold relationships and see who owes whom a reply\n\n## 📊 The columns\n\nOn **People** you get:\n- **Last contact** — the most recent touch, either direction\n- **Last outbound** / **Last inbound** — when you last reached out vs. when they last did\n- **Last contact by** — the teammate connected to this person\n- **Last contact item** / **Last email** / **Last meeting** — one click to the actual record\n\nOn **Companies** and **Opportunities** you also get **Last contact** and **Last contact item** columns.\n\n## 💳 Billing\n\n**Free** — no credits, no metering.\n\n## 📌 Heads up\n\nNeeds a synced inbox or calendar (Google, Outlook, or CalDAV). Direction is inferred from the email's sender and the meeting's organizer; a meeting counts as both.\n",
    "yarnLockChecksum": "ca621ac21da5e1a26954b3163f916f18",
    "packageJsonChecksum": "327b2aa9c7b6be949616e85c94659395",
    "requiredServerVersionRange": ">=2.40.0",
    "postInstallLogicFunction": {
      "universalIdentifier": "c94f671f-b3fa-47a2-8de6-dde94d13f8d1",
      "shouldRunOnVersionUpgrade": true,
      "shouldRunSynchronously": false
    }
  },
  "objects": [],
  "fields": [
    {
      "universalIdentifier": "0b34dd29-35e7-4082-bfd1-551513132ba1",
      "objectUniversalIdentifier": "20202020-9549-49dd-b2b2-883999db8938",
      "type": "MORPH_RELATION",
      "name": "lastContactItemMessage",
      "label": "Last contact item",
      "description": "The email or meeting that was the most recent contact with a person related to this opportunity.",
      "icon": "IconMessage",
      "isNullable": true,
      "morphId": "9199fef1-06e3-4024-8a4a-b4eee554418e",
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-3f6b-4425-80ab-e468899ab4b2",
      "relationTargetFieldMetadataUniversalIdentifier": "1ccff5c2-44c3-4a7d-847f-c74440fe56a9",
      "universalSettings": {
        "relationType": "MANY_TO_ONE",
        "onDelete": "SET_NULL",
        "joinColumnName": "lastContactItemMessageId"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "11ee7749-735d-4fcf-b127-fa6856de7ee0",
      "objectUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "name": "lastInboundAt",
      "type": "DATE_TIME",
      "label": "Last inbound",
      "description": "When this person last reached out to you (an inbound email, or a meeting they organized).",
      "icon": "IconMessageDown",
      "isNullable": true,
      "isUIEditable": false
    },
    {
      "universalIdentifier": "1ccff5c2-44c3-4a7d-847f-c74440fe56a9",
      "objectUniversalIdentifier": "20202020-3f6b-4425-80ab-e468899ab4b2",
      "type": "RELATION",
      "name": "lastContactForOpportunities",
      "label": "Last contact for opportunities",
      "description": "Opportunities whose most recent contact was this email.",
      "icon": "IconTargetArrow",
      "isNullable": true,
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-9549-49dd-b2b2-883999db8938",
      "relationTargetFieldMetadataUniversalIdentifier": "0b34dd29-35e7-4082-bfd1-551513132ba1",
      "universalSettings": {
        "relationType": "ONE_TO_MANY"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "1f1645d4-d141-413b-a07d-c428240eed2f",
      "objectUniversalIdentifier": "20202020-9549-49dd-b2b2-883999db8938",
      "type": "MORPH_RELATION",
      "name": "lastContactItemCalendarEvent",
      "label": "Last contact item",
      "description": "The email or meeting that was the most recent contact with a person related to this opportunity.",
      "icon": "IconCalendarEvent",
      "isNullable": true,
      "morphId": "9199fef1-06e3-4024-8a4a-b4eee554418e",
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-8f1d-4eef-9f85-0d1965e27221",
      "relationTargetFieldMetadataUniversalIdentifier": "db36a44e-a6dc-4bec-a23e-3b27f63d1629",
      "universalSettings": {
        "relationType": "MANY_TO_ONE",
        "onDelete": "SET_NULL",
        "joinColumnName": "lastContactItemCalendarEventId"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "257dd874-d834-403d-9cb8-f3db7e587d02",
      "objectUniversalIdentifier": "20202020-8f1d-4eef-9f85-0d1965e27221",
      "type": "RELATION",
      "name": "lastMeetingForPeople",
      "label": "Last meeting for",
      "description": "People whose most recent meeting is this one.",
      "icon": "IconUser",
      "isNullable": true,
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "relationTargetFieldMetadataUniversalIdentifier": "c8882287-f638-4a96-a235-1819e793e373",
      "universalSettings": {
        "relationType": "ONE_TO_MANY"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "4d84b45d-128d-460f-858a-f877bf6e58ac",
      "objectUniversalIdentifier": "20202020-b374-4779-a561-80086cb2e17f",
      "name": "lastContactAt",
      "type": "DATE_TIME",
      "label": "Last contact",
      "description": "When the most recent contact (email or meeting) with a person from this company occurred, in either direction.",
      "icon": "IconClock",
      "isNullable": true,
      "isUIEditable": false
    },
    {
      "universalIdentifier": "4dea9957-ff7d-46b8-988f-cc72f187d4b5",
      "objectUniversalIdentifier": "20202020-3f6b-4425-80ab-e468899ab4b2",
      "type": "RELATION",
      "name": "lastContactForPeople",
      "label": "Last contact for",
      "description": "People whose most recent contact was this email.",
      "icon": "IconUser",
      "isNullable": true,
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "relationTargetFieldMetadataUniversalIdentifier": "e4abd1da-32f4-4025-8908-e7834e85b8e2",
      "universalSettings": {
        "relationType": "ONE_TO_MANY"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "4e0fd7ff-0bbc-47b2-baab-5fe2c0d12557",
      "objectUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "name": "lastContactAt",
      "type": "DATE_TIME",
      "label": "Last contact",
      "description": "When the most recent contact (email or meeting) with this person occurred, in either direction.",
      "icon": "IconClock",
      "isNullable": true,
      "isUIEditable": false
    },
    {
      "universalIdentifier": "4ef5546f-97e3-4eff-8090-91b5c6400ac9",
      "objectUniversalIdentifier": "20202020-b374-4779-a561-80086cb2e17f",
      "type": "MORPH_RELATION",
      "name": "lastContactItemCalendarEvent",
      "label": "Last contact item",
      "description": "The email or meeting that was the most recent contact with a person from this company.",
      "icon": "IconCalendarEvent",
      "isNullable": true,
      "morphId": "64a265e9-c597-4ca4-a5f2-570d9661eea7",
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-8f1d-4eef-9f85-0d1965e27221",
      "relationTargetFieldMetadataUniversalIdentifier": "79103905-cfdb-413a-b964-8f347332ef3c",
      "universalSettings": {
        "relationType": "MANY_TO_ONE",
        "onDelete": "SET_NULL",
        "joinColumnName": "lastContactItemCalendarEventId"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "69225d61-0efb-4959-af6d-566caba58412",
      "objectUniversalIdentifier": "20202020-9549-49dd-b2b2-883999db8938",
      "name": "lastContactAt",
      "type": "DATE_TIME",
      "label": "Last contact",
      "description": "When the most recent contact (email or meeting) with a person related to this opportunity occurred, in either direction.",
      "icon": "IconClock",
      "isNullable": true,
      "isUIEditable": false
    },
    {
      "universalIdentifier": "79103905-cfdb-413a-b964-8f347332ef3c",
      "objectUniversalIdentifier": "20202020-8f1d-4eef-9f85-0d1965e27221",
      "type": "RELATION",
      "name": "lastContactForCompanies",
      "label": "Last contact for companies",
      "description": "Companies whose most recent contact was this meeting.",
      "icon": "IconBuildingSkyscraper",
      "isNullable": true,
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-b374-4779-a561-80086cb2e17f",
      "relationTargetFieldMetadataUniversalIdentifier": "4ef5546f-97e3-4eff-8090-91b5c6400ac9",
      "universalSettings": {
        "relationType": "ONE_TO_MANY"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "7a3dcccb-d4fd-4839-971a-775ca7bd897f",
      "objectUniversalIdentifier": "20202020-3f6b-4425-80ab-e468899ab4b2",
      "type": "RELATION",
      "name": "lastEmailForPeople",
      "label": "Last email for",
      "description": "People whose most recent email is this one.",
      "icon": "IconUser",
      "isNullable": true,
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "relationTargetFieldMetadataUniversalIdentifier": "fd705b81-c6c6-45d3-9777-818956b7627b",
      "universalSettings": {
        "relationType": "ONE_TO_MANY"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "9f08c2e0-23ba-413c-94c8-04ba828586a3",
      "objectUniversalIdentifier": "20202020-3f6b-4425-80ab-e468899ab4b2",
      "type": "RELATION",
      "name": "lastContactForCompanies",
      "label": "Last contact for companies",
      "description": "Companies whose most recent contact was this email.",
      "icon": "IconBuildingSkyscraper",
      "isNullable": true,
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-b374-4779-a561-80086cb2e17f",
      "relationTargetFieldMetadataUniversalIdentifier": "f43de098-74a9-491c-b718-2e132332c722",
      "universalSettings": {
        "relationType": "ONE_TO_MANY"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "bec41e57-6b6f-4bb2-90cc-4030384dd8f6",
      "objectUniversalIdentifier": "20202020-3319-4234-a34c-82d5c0e881a6",
      "type": "RELATION",
      "name": "lastContactForPeople",
      "label": "Last contact for",
      "description": "People whose most recent contact was through this member.",
      "icon": "IconUser",
      "isNullable": true,
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "relationTargetFieldMetadataUniversalIdentifier": "cfdee7bd-8d41-41e6-a888-512705e75d7b",
      "universalSettings": {
        "relationType": "ONE_TO_MANY"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "c8882287-f638-4a96-a235-1819e793e373",
      "objectUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "type": "RELATION",
      "name": "lastMeeting",
      "label": "Last meeting",
      "description": "The most recent meeting with this person.",
      "icon": "IconCalendarEvent",
      "isNullable": true,
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-8f1d-4eef-9f85-0d1965e27221",
      "relationTargetFieldMetadataUniversalIdentifier": "257dd874-d834-403d-9cb8-f3db7e587d02",
      "universalSettings": {
        "relationType": "MANY_TO_ONE",
        "onDelete": "SET_NULL",
        "joinColumnName": "lastMeetingId"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "cceb21fe-1422-40d4-bc8b-44c12c79c452",
      "objectUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "type": "MORPH_RELATION",
      "name": "lastContactItemCalendarEvent",
      "label": "Last contact item",
      "description": "The email or meeting that was the most recent contact.",
      "icon": "IconCalendarEvent",
      "isNullable": true,
      "morphId": "97eafe97-0ee1-4857-b233-fec855f6bf1a",
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-8f1d-4eef-9f85-0d1965e27221",
      "relationTargetFieldMetadataUniversalIdentifier": "f49ce9ca-5aab-445d-9749-db256aaf74b7",
      "universalSettings": {
        "relationType": "MANY_TO_ONE",
        "onDelete": "SET_NULL",
        "joinColumnName": "lastContactItemCalendarEventId"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "cfdee7bd-8d41-41e6-a888-512705e75d7b",
      "objectUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "type": "RELATION",
      "name": "lastContactBy",
      "label": "Last contact by",
      "description": "The team member whose synced email or meeting was the most recent interaction with this person.",
      "icon": "IconUser",
      "isNullable": true,
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-3319-4234-a34c-82d5c0e881a6",
      "relationTargetFieldMetadataUniversalIdentifier": "bec41e57-6b6f-4bb2-90cc-4030384dd8f6",
      "universalSettings": {
        "relationType": "MANY_TO_ONE",
        "onDelete": "SET_NULL",
        "joinColumnName": "lastContactById"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "db36a44e-a6dc-4bec-a23e-3b27f63d1629",
      "objectUniversalIdentifier": "20202020-8f1d-4eef-9f85-0d1965e27221",
      "type": "RELATION",
      "name": "lastContactForOpportunities",
      "label": "Last contact for opportunities",
      "description": "Opportunities whose most recent contact was this meeting.",
      "icon": "IconTargetArrow",
      "isNullable": true,
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-9549-49dd-b2b2-883999db8938",
      "relationTargetFieldMetadataUniversalIdentifier": "1f1645d4-d141-413b-a07d-c428240eed2f",
      "universalSettings": {
        "relationType": "ONE_TO_MANY"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "e4abd1da-32f4-4025-8908-e7834e85b8e2",
      "objectUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "type": "MORPH_RELATION",
      "name": "lastContactItemMessage",
      "label": "Last contact item",
      "description": "The email or meeting that was the most recent contact.",
      "icon": "IconMessage",
      "isNullable": true,
      "morphId": "97eafe97-0ee1-4857-b233-fec855f6bf1a",
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-3f6b-4425-80ab-e468899ab4b2",
      "relationTargetFieldMetadataUniversalIdentifier": "4dea9957-ff7d-46b8-988f-cc72f187d4b5",
      "universalSettings": {
        "relationType": "MANY_TO_ONE",
        "onDelete": "SET_NULL",
        "joinColumnName": "lastContactItemMessageId"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "f43de098-74a9-491c-b718-2e132332c722",
      "objectUniversalIdentifier": "20202020-b374-4779-a561-80086cb2e17f",
      "type": "MORPH_RELATION",
      "name": "lastContactItemMessage",
      "label": "Last contact item",
      "description": "The email or meeting that was the most recent contact with a person from this company.",
      "icon": "IconMessage",
      "isNullable": true,
      "morphId": "64a265e9-c597-4ca4-a5f2-570d9661eea7",
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-3f6b-4425-80ab-e468899ab4b2",
      "relationTargetFieldMetadataUniversalIdentifier": "9f08c2e0-23ba-413c-94c8-04ba828586a3",
      "universalSettings": {
        "relationType": "MANY_TO_ONE",
        "onDelete": "SET_NULL",
        "joinColumnName": "lastContactItemMessageId"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "f49ce9ca-5aab-445d-9749-db256aaf74b7",
      "objectUniversalIdentifier": "20202020-8f1d-4eef-9f85-0d1965e27221",
      "type": "RELATION",
      "name": "lastContactForPeople",
      "label": "Last contact for",
      "description": "People whose most recent contact was this meeting.",
      "icon": "IconUser",
      "isNullable": true,
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "relationTargetFieldMetadataUniversalIdentifier": "cceb21fe-1422-40d4-bc8b-44c12c79c452",
      "universalSettings": {
        "relationType": "ONE_TO_MANY"
      },
      "isUIEditable": false
    },
    {
      "universalIdentifier": "f4bbac22-8a3d-44c2-bbf2-7e28237252e1",
      "objectUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "name": "lastOutboundAt",
      "type": "DATE_TIME",
      "label": "Last outbound",
      "description": "When your team last reached out to this person (an outbound email, or a meeting your team organized).",
      "icon": "IconMessageUp",
      "isNullable": true,
      "isUIEditable": false
    },
    {
      "universalIdentifier": "fd705b81-c6c6-45d3-9777-818956b7627b",
      "objectUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
      "type": "RELATION",
      "name": "lastEmail",
      "label": "Last email",
      "description": "The most recent email exchanged with this person.",
      "icon": "IconMail",
      "isNullable": true,
      "relationTargetObjectMetadataUniversalIdentifier": "20202020-3f6b-4425-80ab-e468899ab4b2",
      "relationTargetFieldMetadataUniversalIdentifier": "7a3dcccb-d4fd-4839-971a-775ca7bd897f",
      "universalSettings": {
        "relationType": "MANY_TO_ONE",
        "onDelete": "SET_NULL",
        "joinColumnName": "lastEmailId"
      },
      "isUIEditable": false
    }
  ],
  "indexes": [],
  "permissionFlags": [],
  "roles": [
    {
      "universalIdentifier": "34187abe-1b98-4153-85cd-4808e0aebf30",
      "label": "Last contact function role",
      "description": "Reads synced email and calendar interactions, then updates last-contact fields on people, companies, and opportunities.",
      "canReadAllObjectRecords": false,
      "canUpdateAllObjectRecords": false,
      "canSoftDeleteAllObjectRecords": false,
      "canDestroyAllObjectRecords": false,
      "canUpdateAllSettings": false,
      "canBeAssignedToAgents": false,
      "canBeAssignedToUsers": false,
      "canBeAssignedToApiKeys": false,
      "objectPermissions": [
        {
          "objectUniversalIdentifier": "20202020-e674-48e5-a542-72570eee7213",
          "canReadObjectRecords": true,
          "canUpdateObjectRecords": true,
          "canSoftDeleteObjectRecords": false,
          "canDestroyObjectRecords": false,
          "universalIdentifier": "914ce7bf-0dc2-557a-9595-368f1674f52a"
        },
        {
          "objectUniversalIdentifier": "20202020-b374-4779-a561-80086cb2e17f",
          "canReadObjectRecords": true,
          "canUpdateObjectRecords": true,
          "canSoftDeleteObjectRecords": false,
          "canDestroyObjectRecords": false,
          "universalIdentifier": "0c546e54-c01a-57cb-8d5d-a97c9634fcf6"
        },
        {
          "objectUniversalIdentifier": "20202020-9549-49dd-b2b2-883999db8938",
          "canReadObjectRecords": true,
          "canUpdateObjectRecords": true,
          "canSoftDeleteObjectRecords": false,
          "canDestroyObjectRecords": false,
          "universalIdentifier": "f2b52544-054a-5d36-ae26-9c2960149d1b"
        },
        {
          "objectUniversalIdentifier": "20202020-3f6b-4425-80ab-e468899ab4b2",
          "canReadObjectRecords": true,
          "canUpdateObjectRecords": false,
          "canSoftDeleteObjectRecords": false,
          "canDestroyObjectRecords": false,
          "universalIdentifier": "87b2f248-566a-5d0d-9f57-d4bee6d1577f"
        },
        {
          "objectUniversalIdentifier": "20202020-a433-4456-aa2d-fd9cb26b774a",
          "canReadObjectRecords": true,
          "canUpdateObjectRecords": false,
          "canSoftDeleteObjectRecords": false,
          "canDestroyObjectRecords": false,
          "universalIdentifier": "2624e91c-9f12-56ab-a4dd-69fd8d62ed23"
        },
        {
          "objectUniversalIdentifier": "20202020-8f1d-4eef-9f85-0d1965e27221",
          "canReadObjectRecords": true,
          "canUpdateObjectRecords": false,
          "canSoftDeleteObjectRecords": false,
          "canDestroyObjectRecords": false,
          "universalIdentifier": "5debf12e-ba3a-52f6-86de-0ef30f8d059e"
        },
        {
          "objectUniversalIdentifier": "20202020-a1c3-47a6-9732-27e5b1e8436d",
          "canReadObjectRecords": true,
          "canUpdateObjectRecords": false,
          "canSoftDeleteObjectRecords": false,
          "canDestroyObjectRecords": false,
          "universalIdentifier": "bd109aae-9b22-5515-ac7b-700be6df5079"
        }
      ],
      "fieldPermissions": [],
      "permissionFlagUniversalIdentifiers": [],
      "rowLevelPermissionPredicateGroups": [],
      "rowLevelPermissionPredicates": []
    }
  ],
  "skills": [],
  "agents": [],
  "connectionProviders": [],
  "logicFunctions": [
    {
      "universalIdentifier": "071a1c3e-b580-4312-806d-ff27287292ae",
      "name": "on-opportunity-updated",
      "description": "Recomputes an opportunity's last contact from its point of contact when the point of contact changes.",
      "timeoutSeconds": 300,
      "databaseEventTriggerSettings": {
        "eventName": "opportunity.updated",
        "updatedFields": [
          "pointOfContactId"
        ],
        "batchMode": true
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/on-opportunity-updated.ts",
      "builtHandlerPath": "src/logic-functions/on-opportunity-updated.mjs",
      "builtHandlerChecksum": "d639643e6de52df915c407ff0cd0f3de"
    },
    {
      "universalIdentifier": "086d247f-28da-41be-8edd-e6c58592d666",
      "name": "backfill-companies-last-contact",
      "description": "Backfills last-contact fields for one batch of companies from the most recent contact of their people, resolved from the batch id in its payload.",
      "timeoutSeconds": 120,
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/backfill-companies-last-contact.ts",
      "builtHandlerPath": "src/logic-functions/backfill-companies-last-contact.mjs",
      "builtHandlerChecksum": "426c6b095e016c0d6b827b592bfe2b81"
    },
    {
      "universalIdentifier": "6659b54f-2f46-412b-aa7d-03aa9f1c5133",
      "name": "on-opportunity-created",
      "description": "Computes an opportunity's last contact from its point of contact when the opportunity is created.",
      "timeoutSeconds": 300,
      "databaseEventTriggerSettings": {
        "eventName": "opportunity.created",
        "batchMode": true
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/on-opportunity-created.ts",
      "builtHandlerPath": "src/logic-functions/on-opportunity-created.mjs",
      "builtHandlerChecksum": "84390cbef88b4e549591a748f89cc1f1"
    },
    {
      "universalIdentifier": "87c8926b-15e3-43ed-a303-60f6d072f351",
      "name": "on-email-interaction",
      "description": "Updates a person's last-contacted fields, and the last contact on their company and opportunities, when a new email participant is created.",
      "timeoutSeconds": 300,
      "databaseEventTriggerSettings": {
        "eventName": "messageParticipant.updated",
        "updatedFields": [
          "personId"
        ],
        "batchMode": true
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/on-email-interaction.ts",
      "builtHandlerPath": "src/logic-functions/on-email-interaction.mjs",
      "builtHandlerChecksum": "cfd5453ed74b4342c8a08f9f194e7497"
    },
    {
      "universalIdentifier": "a1e15917-86d6-49a4-90d5-6a2555abc6f5",
      "name": "backfill-people-last-contact",
      "description": "Backfills last-contact fields for one batch of people, resolved from the batch id in its payload.",
      "timeoutSeconds": 120,
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/backfill-people-last-contact.ts",
      "builtHandlerPath": "src/logic-functions/backfill-people-last-contact.mjs",
      "builtHandlerChecksum": "9884b01530c56a7b74974b6052e27b3a"
    },
    {
      "universalIdentifier": "a967064f-f440-43cd-bfbe-907c95d4563f",
      "name": "on-person-updated",
      "description": "Recomputes the former and current company's last contact when a person's company changes.",
      "timeoutSeconds": 300,
      "databaseEventTriggerSettings": {
        "eventName": "person.updated",
        "updatedFields": [
          "companyId"
        ],
        "batchMode": true
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/on-person-updated.ts",
      "builtHandlerPath": "src/logic-functions/on-person-updated.mjs",
      "builtHandlerChecksum": "6a18941a944fb5c4bf6131ebd11eb08a"
    },
    {
      "universalIdentifier": "af176746-4334-47f8-a017-88a474a03fa3",
      "name": "backfill-opportunities-last-contact",
      "description": "Backfills last-contact fields for one batch of opportunities from their point of contact, resolved from the batch id in its payload.",
      "timeoutSeconds": 120,
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/backfill-opportunities-last-contact.ts",
      "builtHandlerPath": "src/logic-functions/backfill-opportunities-last-contact.mjs",
      "builtHandlerChecksum": "6831ff0b75a53c9f2a4a051d4b3f3cd6"
    },
    {
      "universalIdentifier": "c56013d7-208b-46e2-a91f-27f481645591",
      "name": "on-calendar-event-started",
      "description": "Updates last-contacted fields for participants of calendar events whose start time just passed.",
      "timeoutSeconds": 300,
      "cronTriggerSettings": {
        "pattern": "*/5 * * * *"
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/on-calendar-event-started.ts",
      "builtHandlerPath": "src/logic-functions/on-calendar-event-started.mjs",
      "builtHandlerChecksum": "75277aa2cd19d402f4f4928c98ac4a68"
    },
    {
      "universalIdentifier": "c94f671f-b3fa-47a2-8de6-dde94d13f8d1",
      "name": "backfill-last-contact",
      "description": "Counts people, opportunities and companies after installation and enqueues one backfill job per record batch.",
      "timeoutSeconds": 300,
      "shouldRunOnVersionUpgrade": true,
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/backfill-last-contact.ts",
      "builtHandlerPath": "src/logic-functions/backfill-last-contact.mjs",
      "builtHandlerChecksum": "2e68020dc813647b5c735a7a55bb30f6"
    },
    {
      "universalIdentifier": "cf7460cc-4c48-4412-9a1a-0c30e4960fce",
      "name": "on-person-created",
      "description": "Recomputes the company's last contact when a person is created with a company.",
      "timeoutSeconds": 300,
      "databaseEventTriggerSettings": {
        "eventName": "person.created",
        "batchMode": true
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/on-person-created.ts",
      "builtHandlerPath": "src/logic-functions/on-person-created.mjs",
      "builtHandlerChecksum": "a765993c2e49782833b79313bada727e"
    },
    {
      "universalIdentifier": "d0631934-2f06-4799-9b33-6937f78e16ff",
      "name": "on-company-created",
      "description": "Computes a company's last contact from its people when the company is created.",
      "timeoutSeconds": 300,
      "databaseEventTriggerSettings": {
        "eventName": "company.created",
        "batchMode": true
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/on-company-created.ts",
      "builtHandlerPath": "src/logic-functions/on-company-created.mjs",
      "builtHandlerChecksum": "d9a088a0c07364336af6f6077b13cbe7"
    },
    {
      "universalIdentifier": "ff4e9fc0-a5d3-4a3d-87f9-81c23598589e",
      "name": "on-calendar-interaction",
      "description": "Updates a person's last-contacted fields, and the last contact on their company and opportunities, when a new calendar event participant is created (past events only).",
      "timeoutSeconds": 300,
      "databaseEventTriggerSettings": {
        "eventName": "calendarEventParticipant.updated",
        "updatedFields": [
          "personId"
        ],
        "batchMode": true
      },
      "handlerName": "default.config.handler",
      "sourceHandlerPath": "src/logic-functions/on-calendar-interaction.ts",
      "builtHandlerPath": "src/logic-functions/on-calendar-interaction.mjs",
      "builtHandlerChecksum": "96b43e7b2f84bd5a02f9cfb5ed1425a7"
    }
  ],
  "frontComponents": [],
  "publicAssets": [
    {
      "filePath": "public/gallery/cover.png",
      "fileName": "cover.png",
      "fileType": "png",
      "checksum": "8b4df6889e4da73ef0197d49b673fd03"
    },
    {
      "filePath": "public/logo.png",
      "fileName": "logo.png",
      "fileType": "png",
      "checksum": "bdca61cbe8ae8e5b943420d03172ff76"
    }
  ],
  "views": [],
  "viewFields": [],
  "navigationMenuItems": [],
  "pageLayouts": [],
  "pageLayoutTabs": [],
  "pageLayoutWidgets": [],
  "commandMenuItems": [],
  "timelineActivityTypes": []
}
