Skip to main content

Push feed.

How to sync event information to your website.

Updated this week

The push feed is a powerful tool that automatically syncs data from your Stager backstage directly to your website. It is event-driven. The moment you make a change in Stager, the updated data is pushed to your site instantly.

Because Stager proactively sends data when a change occurs, a push feed is much faster than a pull feed. You eliminate the wait times caused by your website having to "ask" for updates, ensuring your visitors always see the most current information. Let the feed do the heavy lifting!

Creating a custom publication channel

If you are building a custom integration for your own website, you will use My publication channels. This gives you or your web developer full control over the webhook and the data level provided.

To create a new channel:

  1. Go to Settings - Integrations - My publication channels.

  2. Click the + New publication channel button.

  3. Give your channel a clear name.

  4. Enter the webhook URL and the email address of the developer managing the link. This helps us communicate technical details to the right people.

  5. Select the permission level for your data (Limited or Extended).

Data permission levels:

  • Limited: Sends all event information entered in the Publicity tab, plus basic ticket info (ticket prices and which tickets are for sale). It includes the sold out status for online and door tickets.

  • Extended: Sends all event information from the Publicity tab, the project type, member links, and detailed ticket counts. This includes total ticket amounts, available amounts, reserved amounts, the sold out status, and the sold out override (controlled by the "Sold out" checkbox in your ticket settings).

After saving, you will see a push feed block on the channel overview page. Here you can sync all published data and view the latest endpoint errors to help you troubleshoot.

Syncing event data to your website

To push an event to your new channel, navigate to the calendar and open the event. Go to the Publicity tab, scroll to the bottom, and check the box next to your channel under the "Publication" section.

The push feed and the Jeero Wordpress plugin

Jeero offers seamless integration with Stager and all popular WordPress calendar plugins. To change to the push feed with Jeero, follow these few steps.

If you’re using a different plugin to connect your website’s CMS to the feed, please reach out to your web developer.

Troubleshooting: Why is my event not on the website?

Even after linking your push feed, Stager does not automatically publish every piece of data you enter to the outside world. If an event is missing from your website, check the following settings.

To successfully push publicity and ticketing information, make sure:

  • You have entered the relevant information in the event's Publicity and Tickets tabs.

  • The event status is set to Confirmed or Cancelled in the Main tab of the event. Events marked as Option are not sent to the feed.

  • You have checked the box for your specific publication channel in the event's Publicity tab.

  • The 'Publish on' date is not set in the future. If it is, the information will only be pushed to your website once that date arrives.

Test if the feed works correctly

If you have checked the steps above and the event is still not appearing, you can check the push feed logs yourself.

Go to Settings - Integrations - My publication channels and select your channel. Click the "View logs" button to see a complete request log. You can open each log entry to check the payload and see if an error was received from your endpoint.

If you are publishing to a third-party partner channel and the logs show the event was successfully pushed, please contact the relevant partner. Stager only facilitates the data transfer and has no control over how external platforms display it.

Still stuck? Please contact Stager support.

Developer Guide: Implementing the push feed

Unfold

If you have a custom integration, your web developer will need to adjust it to handle the push feed.

For a complete overview of the data fields and schemas used, please refer to our push feed documentation with the button below:

1. Set up your webhook and queue

Create an endpoint (URL) that accepts HTTP POST requests with large payloads. Because Stager can send a high volume of messages during peak sales, we highly recommend setting up a queue system (like Redis, Amazon SQS, or RabbitMQ). This processes messages asynchronously, preventing server timeouts and keeping your platform fast.

2. Message processing and schemas

Every message includes a messageType and messageContent. Always parse the message type first, then deserialize the content based on our JSON schemas. For a complete overview of the schemas, please refer to our feed documentation.

3. Response requirements

The push feed expects a 2XX HTTP response back within a strict time limit. For a standard message, the limit is 10 seconds. For an ORGANIZATION_SYNC message, it is 30 seconds. If no response is received, the connection is terminated and logged as a timeout error in the Stager backstage.

4. Triggers

Messages are pushed immediately in a "fire and forget" mechanism. Stager pushes updates when:

  • An event passes its scheduled publication time.

  • A manual change is made in Stager (e.g., updates to the Main, Program, Publicity, or Tickets tabs, or changes to locations and event types).

  • Ticket actions occur (e.g., successful orders, refunds, deleted ticket groups).

  • Every night around 2:00 AM CET, a full SYNC_ORGANIZATION message is sent as a fallback to ensure all data remains perfectly synchronized.

Other message types include DELETE_ORGANIZATION, UPDATE_EVENTS, DELETE_EVENTS, UPDATE_TICKET_GROUPS, and DELETE_TICKET_GROUP.

5. Verifying webhook signatures

To prevent fake data from reaching your website, Stager signs all outgoing requests with an X-Signature HTTP header. This signature uses the HMAC-SHA256 hashing algorithm and your channel's authentication token as the secret key. Verify this signature using the request body and your preferred cryptography library.

Here are two code samples to guide you:

Node.js / Express

import express from "express";
import bodyParser from "body-parser";
import crypto from "crypto";

const HMAC_ALGORITHM = "sha256";
const HMAC_ENCODING = "hex";

// The authenticity token, found on the selected channel page.
// Assumed that it is set as an enviroment variable,
// which is recommended, as the token is considered a secret.
const HMAC_SECRET = process.env.SECRET_TOKEN;

// Recommended as messages can get quite large
// (Especially the nightly full sync message)
app.use(bodyParser.json({ limit: "50mb" }));

// Webhook endpoint - receives push feed requests from Stager
app.post("/stager-feed", (req, res) => {
// Prepare required data
const body = req.body;
const bodyString = JSON.stringify(body);
const stagerSignature = req.header("X-Signature");

// Create Hmac object, generate control signature
hmacObject = crypto.createHmac(HMAC_ALGORITHM, HMAC_SECRET);
hmacObject.update(bodyString);
const controlSignature = hmacObject.digest(HMAC_ENCODING);

// Verify signature provided by Stager
if (stagerSignature === controlSignature) {
// Signature valid, message is safe to process

// ...

// Close connection with a 200 response
res.status(200).send("Request received and message processed!");
} else {
// Signature invalid, message ignored
// Close connection with a 401 response
res.status(401).send("Request validation failed!");
}
});

Kotlin / Play

package controllers

import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import org.apache.commons.codec.binary.Hex
import play.mvc.Controller
import play.mvc.NoAuthenticityToken
import play.mvc.results.Forbidden
import play.mvc.results.Ok
import play.mvc.results.Result

// The authentication token, found in the Stager Backstage
// Assumed that it is set as an environment variable
// named "authenticationToken"
// This is recommended, as the token is considered a secret
const val AUTHENTICATION_TOKEN_NAME = "authenticationToken"

const val HMAC_ALGORITHM = "HmacSHA256"
const val SIGNATURE_HEADER = "X-Signature"

class StagerFeedRequestHandler : Controller() {
@NoAuthenticityToken
fun handle(): Result {
val body = request.body
val bodyBytes = body.readAllBytes()

val headers = request.headers
val stagerSignature = headers[SIGNATURE_HEADER]?.value()

// Verify signature provided by Stager
return if (validateSignature(bodyBytes, stagerSignature)) {
// Signature valid, message is safe to process

// ...

Ok() // Close connection with a 200 response
} else {
// Signature invalid, message ignored
// Close connection with a 403 response
Forbidden("Request validation failed!")
}
}

private fun validateSignature(
body: ByteArray,
signature: String?
): Boolean {
// Check whether signature is present
return signature?.let { // Signature present, verify

// Construct SecretKeySpec object from the authentication token
val secretKeyEnvVar = System.getenv(AUTHENTICATION_TOKEN_NAME)
val secretKeyBytes = Hex.decodeHex(secretKeyEnvVar.toCharArray())
val secretKey = SecretKeySpec(secretKeyBytes, HMAC_ALGORITHM)

// Create and initiate the Mac instance
val hmacInstance = Mac.getInstance(HMAC_ALGORITHM)
hmacInstance.init(secretKey)

// Generate control signature and the Stager signature against it
val controlSignature = hmacInstance.doFinal(body)
return controlSignature.contentEquals(secretKeyBytes)
} ?: run {
false // Signature missing, default to invalid
}
}
}

Did this answer your question?