{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"redocly_category":"Journeys","product":"Identity Management","type":"markdown"},"seo":{"title":"Custom provider for push notifications","description":"Everything about Mosaic Journeys, SDKs, and APIs","siteUrl":"https://developer.transmitsecurity.com/","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"custom-provider-for-push-notifications","__idx":0},"children":["Custom provider for push notifications"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This connector enables you to leverage a custom provider for sending push notifications. Custom connectors offers flexibility, allowing for customized requests and responses while integrating seamlessly with other systems."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Configuring a custom provider involves setting up request settings, SSL identities, HTTP connection settings, and logging options. You can also define how responses are handled, including applying transformations or setting fallback behaviors."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Mosaic's Journeys use custom providers for push notifications through the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/send_push"},"children":["Send push"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/generic_otp"},"children":["Generic OTP authentication"]}," steps. These steps let you configure an external service to handle parameters like notification content, and return a response indicating success or failure."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-it-works","__idx":1},"children":["How it works"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Configuring a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["custom provider"]}," for sending push notifications involves these steps:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Establishing the connection"]},": The connection to the external web service is set up by configuring connection parameters, such as the request URI, HTTP method, headers, and optional authentication details (",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Admin Portal"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Management"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Integration hub"]}," > ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Custom Push Notification Provider"]},")."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Defining request parameters"]},": Parameters like ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["user"]}," (recipient's user identifier), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["title"]}," (notification title), ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["body"]}," (notification body), etc., can be dynamically inserted into different parts of the HTTP request, depending on the use case. These include the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Request URI"]}," (as URL parameters), the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Request Body"]},", or even ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HTTP Headers"]},". These parameters are defined as variables in the external connection configuration, and their values are passed dynamically from the journey step that invokes this connection."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Enabling the connector"]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["At runtime, sending a push consists of:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Sending the request"]},": When the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Send push"]}," step executes, an HTTP request is sent to the configured web service."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response and handling"]},": The external web service processes the request and returns a response, which Mosaic uses to determine whether the operation succeeded or failed."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"configuration","__idx":2},"children":["Configuration"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"request","__idx":3},"children":["Request"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"table"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Name"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["A unique name for the external connection."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["FORMAT"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Request URI"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The endpoint of the web service that handles push sending (e.g., ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["http://push.service/send"]},"). This field supports expressions using the parameters:",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[" ",{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["user"]},": recipient's user identifier"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["title"]},": notification title"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["body"]},": notification body"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["apple_push_tokens"]},": Apple push tokens"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["google_push_tokens"]},": Google push tokens"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["data"]},": additional data"]}]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HTTP request method"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["The HTTP method used for the request (e.g., ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["POST"]},")."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Request Body"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Holds the body of the POST requests. Supports the following parameters:",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[" ",{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["user"]},": recipient's user identifier"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["title"]},": notification title"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["body"]},": notification body"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["apple_push_tokens"]},": Apple push tokens"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["google_push_tokens"]},": Google push tokens"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["data"]},": additional data"]}]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HTTP request headers"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Custom headers included in the request. Allows to set the name and value for the header: e.g., ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Content-type: application/json"]},". Supports the following parameters:",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[" ",{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["user"]},": recipient's user identifier"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["title"]},": notification title"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["body"]},": notification body"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["apple_push_tokens"]},": Apple push tokens"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["google_push_tokens"]},": Google push tokens"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["data"]},": additional data"]}]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["AUTHENTICATION"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Authentication type"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Specifies if the connection requires authentication. Supported options: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["None"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Basic"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Bearer"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OAuth"]},", etc."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["SSL IDENTITIES"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Client certificate local identity"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Enables the specification of a key for a client certificate used in secure communication. Options include key generation, keystore file upload, and PEM file upload. For each key, you can configure a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Key Alias"]},", ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Key Version"]},", and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["JWT Key ID"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Always send client certificate"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["If checked, sends the client certificate even if the server's trusted CA list does not include it."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Trusted identities"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Enables the specification of a client certificate for secure communication. Options include PEM file upload, keystore file upload, loading from a URL, or loading a public key from a JWKS URL. For each certificate, you can configure a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Certificate Alias"]}," and a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Certificate Version"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["HTTP CONNECTION SETTINGS"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Follow Redirect"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["If enabled, the system will automatically follow an HTTP redirect response (302/303) to the new URL provided by the API. Otherwise, the redirect response will be returned to the client without further action."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Request timeout"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Specifies the maximum time, in seconds, that the system will wait for a response before the request times out."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Connection timeout"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Specifies the maximum time, in seconds, that the system will wait to establish a connection to the server before timing out."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["LOGGING"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Report External Connection Data"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Enables additional event reporting for the connector."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Data Reported"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Determines whether the connector records ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["External Connect Request/Response"]}," or ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Custom"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Custom Data Reported"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Expression that defines the custom payload recorded for the connector. For syntax details, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/expressions/overview"},"children":["About expressions"]}," and ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/expressions/constructors"},"children":["Expressions: Constructors"]},"."]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"response","__idx":4},"children":["Response"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"table"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Return failure if response is invalid"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Enables the option to treat an invalid response as a failure (checkbox)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["FORMAT"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Response format"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Specifies the format of the expected response. Options: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["None"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["String"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["JSON Array"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["JSON Object"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["XML"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Specify JSON schema for response"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Allows you to define a JSON schema to validate the response content (checkbox)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Apply transformation on response received from the web service"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Enables transformations on the response data before further processing (checkbox)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["RESPONSE CLASSIFIERSs"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Add classifier"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Allows you to define conditions and values to classify responses (e.g., success or failure)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Fallback (for classifiers)"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Specifies the fallback response if no classifiers match. Options: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Success"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Error"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["RATE LIMIT"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Limit Rate of Requests"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Enables rate limiting for requests (checkbox), with the following configuration options: ",{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[" ",{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Span Period (Seconds)"]},": Specifies the time period for rate limiting."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Max. Requests per Period"]},": Specifies the maximum number of requests allowed in the defined time period."]}]}]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"example","__idx":5},"children":["Example"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When configuring the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Send push"]}," step, you define the parameters that Mosaic sends to the external web service. These parameters are dynamically mapped to the JSON request body using placeholders (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["${}"]},"), as shown below:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"table"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":""},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Step Parameter"]}]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":""},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Mapped to JSON Request Body"]}]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Title"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"title\": \"${title}\""]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Text"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"text\": \"${body}\""]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Custom fields"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"custom_fields\": \"${data}\""]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Push token"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"push_token\": \"${google_push_tokens}\""]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"push_token\": \"${apple_push_tokens}\""]}]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["At runtime, these placeholders are replaced with the actual values configured in the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Send push"]}," step parameters, and the request is built following the configuration of the web service. For example:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST http://push.service/send \\ Set in the web service configurations\n-H \"Content-Type: application/json\" \\ Set in the web service configurations\n-d '{\n   \"title\": \"${title}\",     \\ Replaced with the notification subject. E.g., Notice\n   \"text\": \"${body}\",       \\ Replaced with the notification content. E.g., Alert: a potential security threat has been detected in the ${data.appName} application. Please investigate immediately.\n   \"push_token\": \"${google_push_tokens}\" \\ Replaces with the Google push token of the device\n   }'\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The designated web service will then distribute the push notifications."]}]},"headings":[{"value":"Custom provider for push notifications","id":"custom-provider-for-push-notifications","depth":1},{"value":"How it works","id":"how-it-works","depth":2},{"value":"Configuration","id":"configuration","depth":2},{"value":"Request","id":"request","depth":3},{"value":"Response","id":"response","depth":3},{"value":"Example","id":"example","depth":2}],"frontmatter":{"markdown":{"toc":{"depth":2}},"seo":{"title":"Custom provider for push notifications"}},"lastModified":"2026-05-21T11:18:36.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/orchestration/external-connections/custom_web_service_push","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}