Add webhook functionality to your Medusa e-commerce server, allowing you to send real-time notifications to external services when specific events occur in your system. The plugin seamlessly integrates with Medusa's event system and provides a simple way to manage webhooks for various events.
- Event-Based Webhooks: Automatically trigger webhooks based on Medusa events like product creation, updates, and more
- Flexible Configuration: Easy setup and configuration through Medusa's plugin system
- Built-in Event Support: Pre-configured support for common Medusa events
- Workflow Integration: Seamlessly integrates with Medusa's workflow system for reliable webhook processing
- Install the plugin using your preferred package manager:
npm install @lambdacurry/medusa-webhooks
# or
yarn add @lambdacurry/medusa-webhooks
- Add the plugin to your
medusa-config.js
:
const plugins = [
// ... other plugins
{
resolve: "@lambdacurry/medusa-webhooks",
options: {
// Add here the subcribers you will define
subscriptions: ["product.created", "product.updated"],
},
},
];
- Run migrations:
yarn medusa db:migrate
The plugin provides three different workflows for handling webhooks:
-
getWebhooksSubscriptionsWorkflow
: Retrieves active webhook subscriptions for a specific event -
sendWebhooksEventsWorkflow
: Sends webhook events to the subscribed endpoints -
fullWebhooksSubscriptionsWorkflow
: Combines both workflows to handle the complete webhook process
Here's an example of how to use these workflows in your subscriber:
import {
SubscriberArgs,
SubscriberConfig,
} from "@medusajs/framework/subscribers";
import {
getWebhooksSubscriptionsWorkflow,
sendWebhooksEventsWorkflow,
fullWebhooksSubscriptionsWorkflow,
} from "@lambdacurry/medusa-webhooks/workflows";
export const config: SubscriberConfig = {
event: ["product.created", "product.updated"],
context: {
subscriberId: "product-added",
},
};
export default async function handleProductAdded({
event: { name },
container,
}: SubscriberArgs<{ id: string }>): Promise<void> {
const query = container.resolve("query");
const logger = container.resolve("logger");
// Fetch product data
const { data: productResult } = await query.graph({
entity: "product",
fields: ["*"],
});
const product = productResult[0];
if (!product) {
logger.error("Product not found");
return;
}
// Option 1: Use the full workflow (recommended for most cases)
const fullResult = await fullWebhooksSubscriptionsWorkflow(container).run({
input: {
eventName: name,
eventData: product,
},
});
// Option 2: Use separate workflows for more control
const { results: webhooks } = await getWebhooksSubscriptionsWorkflow(
container
).run({
input: {
eventName: name,
eventData: product,
},
});
const sendResult = await sendWebhooksEventsWorkflow(container).run({
input: {
webhooks,
eventData: product,
},
});
console.log(fullResult);
// or
console.log(sendResult);
}
To contribute to this plugin:
- Clone the repository
- Install dependencies:
yarn install
- Run the plugin:
yarn dev
Please read more about how to run the plugin in dev mode: https://docs.medusajs.com/learn/fundamentals/plugins/create
MIT License