Implementing Activity Feeds

Last edit: Oct 26, 2022

This guide will help you create and publish an activity, and then display the activity feed.

You'll follow the sample scenario described in the Activity Feeds topic: A user joins a private group by sending a membership request to the group moderator. Later the moderator reviews and accepts the user's request. The user becomes a group member.

This guide shows how to implement the following sample process: After the user clicks the Join button, you create the group-membership record [group_id, user_id, approved_at]. Group membership is approved by setting the approved_at property to the current time.


This is an advanced tutorial. To follow it, you should be familiar with basic platformOS concepts, the topics in the Get Started section, and activity feeds.


Implementing activity feeds is a four-step process:

Step 1: Create activity

Prepare an activity payload (hash).


The activity payload can have any structure, but it is recommended to follow the W3C Recommendation for Activity Streams 2.0.

{% capture payload %}
  "actor": {
    "type": "Person",
    "id": "{{ user_id }}",
    "name": "Sally Smith"
  "type": "Create",
  "object": {
    "type": "Relationship",
    "id": "{{ record.id }}",
    "name": "GroupMembership"
  "target": {
    "type": "Group",
    "id": "{{ group.id }}"
{% endcapture %}
{% assign payload = payload | to_hash %}

Then use a GraphQL mutation

mutation activity_create($payload: ActivityStreamsPayload!) {
  activity: activity_create(payload: $payload) {

to add activity to database by executing:

{% graphql ga = 'activity_create', payload: payload %}

Under ga.activity.uuid you have the UUID of your new activity.

Step 2: Publish activity

Each Feed has type and ID (both are required).
Each Feed (if does not exist) is created on the fly when an activity publishes to it. You don't have to create it manually - just start publishing to it.

Once the activity is saved you can publish it to some activity feeds.

Create a GraphQL query

mutation activity_publish($feed_ids: [ID]!, $uuid: ID!, $feed_type: String!) {
  activity_publish(ids: $feed_ids, uuid: $uuid, feed_type: $feed_type)

and use it in Liquid like

{% liquid
  assign user_id = 1
  assign recipients = "" | split: "|"
  assign recipients = recipients | add_to_array: user_id
  graphql gp = 'activity_publish', uuid: ga.activity.uuid, feed_ids: recipients, feed_type: 'UserNotifications'

Your activity has been published to UserNotifications[user_id] feed.

Step 3: Display feed

To read the content of your feed, you have to provide feed_name and feed_id:

query activities($type: String!, $id: ID!, $per_page: Int, $page: Int) {
  streams(feed_id: $id, feed_type: $type, per_page: $per_page, page: $page) {
    results {

{% graphql g = 'activities', type: 'UserNotifications', id: user_id %}

total entries: {{ g.streams.total_entries }}

{% for activity in g.streams.results %} {{ activity.payload }} {% endfor %}

Step 4: Get all feed names

You can list all created feed types with ids by using:

query {
  feeds {


We are always happy to help with any questions you may have.

contact us