Create timeline comment for discounts, products, etc

I’ve noticed that some graphql resources return timeline comments, if you query for connected events, for example this will return up to 10 messages:

query DiscountWithComments {
    discountNodes(first: 5) {
        edges {
            node {
                metafield(key: "key", namespace: "$app:namespace") {
                    id
                }
                events(first: 10) {
                    __typename
                    nodes {
                        __typename
                        message
                        id
                    }
                }
                discount {
                    __typename
                    ... on DiscountAutomaticApp {
                        title
                        discountId
                    }
                }
            }
        }
    }
}

However I didn’t find any way for apps to write comments, it seems that the admin dashboard uses this for creating comments:

mutation TimelineCommentCreate($input: TimelineCommentCreateInput!) {
  timelineCommentCreate(input: $input) {
    event {
      ...TimelineEvent
      __typename
    }
    userErrors {
      field
      message
      __typename
    }
    __typename
  }
}

fragment TimelineEvent on Event {
  id
  createdAt
  criticalAlert
  merchantVisible
  message
  eventLabel
  ... on BasicEvent {
    id
    attributeToApp
    attributeToUser
    additionalContent
    secondaryMessage
    appIcon {
      id
      altText
      imgSrc: url(transform: {maxWidth: 50, maxHeight: 50})
      __typename
    }
    __typename
  }
  ... on NotificationSentEvent {
    id
    createdAt
    deliveryStatus
    deliveryStatusDescription
    merchantVisible
    message
    method
    resendable
    subject
    appIcon {
      id
      altText
      imgSrc: url(transform: {maxWidth: 50, maxHeight: 50})
      __typename
    }
    __typename
  }
  ... on CommentEvent {
    id
    rawMessage
    edited
    author {
      id
      name
      initials
      avatar(fallback: NOT_FOUND) {
        id
        transformedSrc: url(transform: {maxWidth: 50, maxHeight: 50, scale: 3})
        __typename
      }
      __typename
    }
    attachments {
      id
      image {
        id
        transformedSrc: url(transform: {maxWidth: 50, maxHeight: 54, scale: 3})
        __typename
      }
      fileExtension
      size
      name
      url
      __typename
    }
    embed {
      ... on Product {
        id
        title
        featuredImage {
          id
          altText
          transformedSrc: url(transform: {maxWidth: 50, maxHeight: 50, scale: 3})
          __typename
        }
        tracksInventory
        totalInventory
        variants(first: 1) {
          edges {
            node {
              id
              price
              __typename
            }
            __typename
          }
          __typename
        }
        __typename
      }
      ... on ProductVariant {
        id
        title
        image {
          id
          altText
          transformedSrc: url(transform: {maxWidth: 50, maxHeight: 50, scale: 3})
          __typename
        }
        product {
          id
          title
          __typename
        }
        inventoryQuantity
        inventoryItem {
          id
          tracked
          __typename
        }
        __typename
      }
      ... on Customer {
        id
        displayName
        email
        ordersCount
        totalSpentV2: amountSpent {
          amount
          currencyCode
          __typename
        }
        phone
        note
        __typename
      }
      ... on Order {
        id
        name
        createdAt
        totalPriceSet {
          shopMoney {
            amount
            currencyCode
            __typename
          }
          __typename
        }
        customer {
          id
          displayName
          __typename
        }
        lineItems(first: 250) {
          edges {
            node {
              id
              title
              product {
                id
                __typename
              }
              variant {
                id
                __typename
              }
              __typename
            }
            __typename
          }
          __typename
        }
        displayFinancialStatus
        displayFulfillmentStatus
        __typename
      }
      ... on DraftOrder {
        id
        name
        createdAt
        totalPrice
        customer {
          id
          displayName
          __typename
        }
        lineItems(first: 250) {
          edges {
            node {
              id
              title
              product {
                id
                __typename
              }
              variant {
                id
                __typename
              }
              __typename
            }
            __typename
          }
          __typename
        }
        __typename
      }
      ... on PurchaseOrder {
        acceptedQuantity
        destinationTarget {
          id
          name
          __typename
        }
        id
        name
        placedAt
        referenceNumber
        rejectedQuantity
        shipNotices {
          id
          arrivesAt
          __typename
        }
        status
        supplierTarget {
          id
          name
          __typename
        }
        totalQuantity
        __typename
      }
      ... on InventoryMovement {
        id
        name
        transferStatus: status
        origin: source {
          id
          name
          __typename
        }
        transferDestination: destination {
          id
          name
          __typename
        }
        totalQuantity
        acceptedQuantity
        rejectedQuantity
        referenceNumber: externalReferenceId
        transferShipNotices: shipNotices(first: 1) {
          edges {
            node {
              id
              arrivesAt
              __typename
            }
            __typename
          }
          __typename
        }
        __typename
      }
      __typename
    }
    __typename
  }
  __typename
}

Is writing comments a planned feature, or is just because DiscountNodeConnection returns app and store owned discouns that this is present?

Recently, I have been clamouring for a feature like that as well.
It started with wanting Shopify Flow to have that as an action, and then realizing it is not even possible via the API.

Unfortunately, people have been asking for this for over 5 years and I didn’t see and progress on this.

Similar topics:

It seems they have another issue that is even worse.

If you try to use the timeline design, the people who review “Built for Shopify” requirements will say your app doesn’t follow the design rules because the content should have white background LOL.

Well, that is frustrating. I think you should try to fight it and convince them otherwise, instead of changing your design.
In one of our apps, we incorporated the timeline view as well and had no issues in the review.