Notifications on self hosted squidex instance

Hi,
I’ve been trying to implement notifications on a self-hosted instance but without success.
I feel that the available documentation is not enough.
So far, I’ve added the notifo required settings on appsettings.json and the notifo icon appears now, but only for non admin users. Is this supposed to be like this?
Also, as editor I’ve made a few (push) notification subscriptions but I don’t get any notification. I see on the notifo dashboard the users have been automatically added there. What am I missing. Regards

here is an example of my config with docker-compose

  • NOTIFO__APPID=2e461f1d-fb5b-4f21-b633-8f4f3c43dbss
  • NOTIFO__APIKEY=q7cd2p774dbclqqsuytsblwwxileh9dorfx15iqndwas
  • NOTIFO__APIURL=https://app.notifo.io

I think users have to login again to get a token. In notifo you then have to go to templates and add the necessary texts. Only subject is really needed

Thank you for your response, but still not able to make it work (except the notifo icon, already appears to all users).
Sorry, but I’m very confused about the status of it. Is this (notifo) something that we can already use? Where can I find documentation? I can’t even seem to make a simple test to work. I’m completely lost.
I’ve tried to create topics (not sure if it’s required or not), but when I try to subscribe I get a “message”: “Topic is not whitelisted.” on the API call.
It seems to be a paid feature, but I can’t find the pricing anywhere.
Now I’ve found on github repo that this is not used on production yet. If not, what are the alternatives? Do we have some sort of notifications system on squidex?

Can you explain what is the general status of this? There was some other solution before Notifo?

Regards,
Hugo Mota

No, it is not paid, but just very badly documented. It is Open Source: GitHub - notifo-io/notifo: Multi channel notification service for collaboration tools, e-commerce, news service and more.

Notifo was built for Squidex. there was no other notification solution.

Thats wrong, I have to update the Readme, but it was only about Email and Mobile Push.

What exactly have you done? It is not necessary to create topics.

I think I can write documentation next week for that. Or we can schedule a call to solve the problem together.

Hi Sebastian, thanks again for your response.
I have a few more questions if you can help.
On the documentation I’ve found:
-“At the time of writing this article, email notifications are not operational.” - Is this still true?

Also:
- This notification service only works in Squidex Cloud (i.e. cloud.squidex.io) by default. To use this service in a self-hosted installation, you must separately install and run the Notifo service. Click here for installation instructions (coming soon). - What do you mean by “must separatelly install and run Notifo” ?? Isn’t this a matter of just setting the right config on appsettings.json on my self hosted instance? Or you mean that I have to self host notifo app also?

Also, on the design>>templates (notifo) page, while I’m designing the page, I see that I can use some variables {{ myVariable }}, but what will be the payload for this? how can I see the variables that I have available?

Regrads, Thank you for your help

Yes. Notifo is mainly used by me and a few enterprise customers. Therefore there are no installation instructions. The general principles are the same as Squidex. Because both share the tech stack.

I can export my templates and provide a list. It really depends on the use case, except a few temporary variables.

I think you forgot the answer -“At the time of writing this article, email notifications are not operational.” is this true? Do emails still not working?

About the variables, can you share with me the available variables?? It has something to do with the payload of the edited schema? Similar to what we have on squidex rules?? Still not clear about this. If you can share some examples it would be great.

Than you!

No, they work fine now. I use them in production.

Sure. There are 2 levels of formatting:

Notification formatting

  • When a system wants to send notifications, it sends events to notifo. These events can have custom properties. At the moment only these properties are available:
  1. SquidexApp: The name of your app. {{SquidexApp}}
  2. SquidexUrl: The URL to a content item: {{SquidexUrl}}
  3. Name: The name of the schema.
  4. Status: The status of the content.

Channel formatting

Each channel has its own formatting and most of them use liquid. A notification is then embedded into the channel template. Here a wide range of variables are available:

{
    "items": [
        {
            "path": "app",
            "type": "Object",
            "description": "The current app."
        },
        {
            "path": "app.name",
            "type": "String",
            "description": "The name of the app. Cannot be null or undefined."
        },
        {
            "path": "notification",
            "type": "Object",
            "description": "The first and usually single notifications. For emails multiple notifications can be grouped in one template."
        },
        {
            "path": "notification.body",
            "type": "String",
            "description": "The notification body. Can be null or undefined."
        },
        {
            "path": "notification.children",
            "type": "Array",
            "description": "The child notifications if the notifications have been grouped together."
        },
        {
            "path": "notification.confirmText",
            "type": "String",
            "description": "The text for confirmation buttons."
        },
        {
            "path": "notification.confirmUrl",
            "type": "String",
            "description": "The tracking URL to mark the notification as confirmed."
        },
        {
            "path": "notification.imageLarge",
            "type": "String",
            "description": "The URL to the large image. Optimized for the current use case (e.g. emails). Can be null or undefined."
        },
        {
            "path": "notification.imageSmall",
            "type": "String",
            "description": "The URL to the small image. Optimized for the current use case (e.g. emails). Can be null or undefined."
        },
        {
            "path": "notification.linkText",
            "type": "String",
            "description": "The link text that can be set when a linkUrl is set. Can be null or undefined."
        },
        {
            "path": "notification.linkUrl",
            "type": "String",
            "description": "The link URL. Can be null or undefined."
        },
        {
            "path": "notification.subject",
            "type": "String",
            "description": "The notification subject. Cannot be null or undefined."
        },
        {
            "path": "notification.trackDeliveredUrl",
            "type": "String",
            "description": "The tracking URL to mark the notification as delivered."
        },
        {
            "path": "notification.trackSeenUrl",
            "type": "String",
            "description": "The tracking URL to mark the notification as seen."
        },
        {
            "path": "notifications",
            "type": "Array",
            "description": "The list of notifications. Usually it is only one, but for emails multiple notifications can be grouped in one template."
        },
        {
            "path": "user",
            "type": "Object",
            "description": "The current user."
        },
        {
            "path": "user.emailAddress",
            "type": "String",
            "description": "The email address of the user. Can be null or undefined."
        },
        {
            "path": "user.fullName",
            "type": "String",
            "description": "The full name of the user. Can be null or undefined."
        },
        {
            "path": "user.phoneNumber",
            "type": "String",
            "description": "The phone number of the user. Can be null or undefined."
        }
    ],
    "total": 0
}

Here are the templates that I use for the squidex cloud:

{
    "items": [
        {
            "code": "AppContributorAssignedEventV2",
            "created": "1970-01-01T00:00:00Z",
            "lastUpdate": "1970-01-01T00:00:00Z",
            "formatting": {
                "subject": {
                    "en": "{{ squidexApp }}: A contributor has been assigned."
                },
                "body": {},
                "confirmText": {},
                "imageSmall": {},
                "imageLarge": {},
                "linkUrl": {},
                "linkText": {},
                "confirmMode": "None"
            },
            "settings": {}
        },
        {
            "code": "AppContributorRemovedEvent",
            "created": "1970-01-01T00:00:00Z",
            "lastUpdate": "1970-01-01T00:00:00Z",
            "formatting": {
                "subject": {
                    "en": "{{ squidexApp }}: A contributor has been removed."
                },
                "body": {},
                "confirmText": {},
                "imageSmall": {},
                "imageLarge": {},
                "linkUrl": {},
                "linkText": {},
                "confirmMode": "None"
            },
            "settings": {}
        },
        {
            "code": "AppPlanChangedEvent",
            "created": "1970-01-01T00:00:00Z",
            "lastUpdate": "1970-01-01T00:00:00Z",
            "formatting": {},
            "settings": {}
        },
        {
            "code": "AppPlanResetEvent",
            "created": "1970-01-01T00:00:00Z",
            "lastUpdate": "1970-01-01T00:00:00Z",
            "formatting": {},
            "settings": {}
        },
        {
            "code": "ContentCreatedEventV2",
            "created": "1970-01-01T00:00:00Z",
            "lastUpdate": "1970-01-01T00:00:00Z",
            "formatting": {
                "subject": {
                    "en": "{{ squidexApp }}: A {{ name }} content has been created."
                },
                "body": {},
                "confirmText": {},
                "imageSmall": {},
                "imageLarge": {},
                "linkUrl": {},
                "linkText": {},
                "confirmMode": "None"
            },
            "settings": {}
        },
        {
            "code": "ContentDeletedEvent",
            "created": "1970-01-01T00:00:00Z",
            "lastUpdate": "1970-01-01T00:00:00Z",
            "formatting": {
                "subject": {
                    "en": "{{ squidexApp }}: A {{ name }} content has been deleted."
                },
                "body": {},
                "confirmText": {},
                "imageSmall": {},
                "imageLarge": {},
                "linkUrl": {},
                "linkText": {},
                "confirmMode": "None"
            },
            "settings": {}
        },
        {
            "code": "ContentDraftCreatedEvent",
            "created": "1970-01-01T00:00:00Z",
            "lastUpdate": "1970-01-01T00:00:00Z",
            "formatting": {},
            "settings": {}
        },
        {
            "code": "ContentDraftDeletedEvent",
            "created": "1970-01-01T00:00:00Z",
            "lastUpdate": "1970-01-01T00:00:00Z",
            "formatting": {},
            "settings": {}
        },
        {
            "code": "ContentStatusChangedEventV2",
            "created": "1970-01-01T00:00:00Z",
            "lastUpdate": "1970-01-01T00:00:00Z",
            "formatting": {
                "subject": {
                    "en": "{{ squidexApp }}: A {{ name }} content has been set to {{ status }}."
                },
                "body": {},
                "confirmText": {},
                "imageSmall": {},
                "imageLarge": {},
                "linkUrl": {},
                "linkText": {},
                "confirmMode": "None"
            },
            "settings": {}
        },
        {
            "code": "ContentStatusScheduledEvent",
            "created": "1970-01-01T00:00:00Z",
            "lastUpdate": "1970-01-01T00:00:00Z",
            "formatting": {},
            "settings": {}
        },
        {
            "code": "ContentUpdatedEvent",
            "created": "1970-01-01T00:00:00Z",
            "lastUpdate": "1970-01-01T00:00:00Z",
            "formatting": {
                "subject": {
                    "en": "{{ squidexApp }}: A {{ name }} content has been updated."
                },
                "body": {},
                "confirmText": {},
                "imageSmall": {},
                "imageLarge": {},
                "linkUrl": {},
                "linkText": {},
                "confirmMode": "None"
            },
            "settings": {}
        }
    ],
    "total": 11
}

The templates are created the first time a notification arrives´, but if they have no subject the notification just gets ignored.

After additional testing and configuration, I believe I have a clearer idea of what can be done with Notifo. However, I occasionally see references to user ‘comments,’ but I’m unsure where or how to access that functionality. Was this feature implemented?

Thanks again for the support

You are probably referring to the content sidebar where you have a comments section.

Yeah, don’t know how I’ve missed that! But I’m seeing UI issues with that, making it very difficult to use… not just on my current version but on the cloud version:


Is there a plan to solve this?

Also, as alternative I’m trying a rule for email sending but on the " To Address*" field I think I’m only able to specify an email address. Is this correct? Is there a way for me to specify multiple email adresses on this field? Thank you!

Sure, I fix bugs usually asap. But nobody has reported that yet…

Yes, it happens just when you want to mention a user and the autocomplete seems to have like a z-index issue. Do you want me to open an issue on GitHub? Thanks

it is not a z-index problem. The container is scrollable, so it does not showing overflowing elements. The solution would be to position this on the root level. I have a quick fix for that, which is a little bit ugly for long email addresses and I am planning a better fix, but I have to provide a PR to the library for that.

@Sebastian_Stehle can you also answer this " Is there a way for me to specify multiple email adresses on this field" Thank you!

Have you tried to mention several people? I am not sure actually, but from what I remember it should work. Because the logic just uses a regex to detect mentions.

No, sorry, this is kind of unrelated.
I’m talking about email sending on a rule.

Not on commentaries section(for this specific question).

Apologies for combining several topics here. I’m working on a solution to ensure my client receives the right notifications. Currently, the goal is to notify content reviewers whenever an editor marks a page as “Ready for Review.” However, I haven’t found enough filtering options in Notifo to set this up effectively, so I’m exploring alternative approaches. Do you have any suggestions? Here are my ideas so far:
• I could use a contentChanged rule to trigger an email, but it appears this option only supports sending to a single email address.
• Alternatively, I could use a webhook that includes all email addresses in the payload. Although this might be excessive, it could work if no other options are available.

So what you would do in notifo:

  • Create a topic e.g. contents/ready/{schema}
  • Subscribe the users to the right topic, e.g. contents/ready for all schemas or contents/ready/schema for a particular schema.

Per subscription, you can define custom settings, e.g. how a user should be notified, this usually gives enough flexibility.

This should be easy to change.

This is always the most flexible solution, but I think I can implement the email change for you.

Thank you, Sebastian, for your support—much appreciated! :pray: I ended up implementing an endpoint in our application to handle a triggered rule from Squidex and created a new custom topic on Notifo for it. Thanks again for pointing me in the right direction! But I’m still having an issue: When I press the “Bell” icon trying to subscribe a some schemas update, I get a forbidden response:


Any Idea of what can be causing this? I can’t see nothing on the logs.

There is another security feature that I have forgotten to mention.

Imagine you have the following structure in Squidex for topics

<APP_ID>/topic

Because users can be in multiple apps, they could just subscribe to apps they don’t belong to. Therefore you have to whitelist topics and allow users to subscribe to that:

See this endpoint:
https://app.notifo.io/api/docs/index.html?url=/api/openapi.json#tag/Users/operation/Users_PostAllowedTopic