Create a blank project by installing the NestJS CLI in your terminal:

npm i -g @nestjs/cli

Then, create an empty project with:

nest new project-name

Installing Required Packages

To begin, install the necessary packages in your NestJS project directory. You can choose one of the following package managers:

npm i @nestjs/config

Ensure that you execute this command within a NestJS project.

Obtaining the Development API Key

To locate your development API key, login to the dashboard and select the Project you want to connect to. Then click on the Environments & API Keys tab in the left menu. You can copy your development API Key from the field at the top of this page. (Your development key will start with tr_dev_).

Adding Environment Variables

Create a .env file at the root of your project and include your Trigger API key and URL like this:

TRIGGER_API_URL= # this line is only necessary if you are self-hosting Trigger

Replace ENTER_YOUR_DEVELOPMENT_API_KEY_HERE with the actual API key obtained from the previous step.

This configuration only will be loaded if you use NestJS Config or dotenv.

Adding TriggerDev Module

Open your app.module.ts, and add the following inside your imports:

import { TriggerDevModule } from "";
import { Module } from "@nestjs/common";

//you need to load the environment variables from .env, this is one way to do it
import "dotenv/config";

  imports: [
      id: "my-app",
      apiKey: process.env.TRIGGER_API_KEY,
      apiUrl: process.env.TRIGGER_API_URL,
    // if you use NestJS Config, you can do like this:
    // TriggerDevModule.registerAsync({
    //   useFactory: (configService: ConfigService) => ({
    //     id: 'my-app',
    //     apiKey: configService.get<string>("TRIGGER_API_KEY"),
    //     apiUrl: configService.get<string>("TRIGGER_API_URL"),
    //   }),
    //   inject: [ConfigService],
    // }),
export class AppModule {

Replace "my-app" with an appropriate identifier for your project. The apiKey and apiUrl are obtained from the environment variables you set earlier.

By following these steps, you'll configure the Trigger Client to work with your project.

Creating the Example Job

When you add TriggerDevModule to your project, you will can have access to the TriggerClient instance by using the @InjectTriggerDevClient() decorator in the constructor.

Now, let's create an example job to test the integration.

  1. Create a controller named job.controller.ts alongside your app.module.ts
  2. Inside that controller, add the following code:
import { Controller, Get } from "@nestjs/common";
import { InjectTriggerDevClient } from "";
import { eventTrigger, TriggerClient } from "";

export class JobController {
  constructor(@InjectTriggerDevClient() private readonly client: TriggerClient) {
      id: "test-job",
      name: "Test Job One",
      version: "0.0.1",
      trigger: eventTrigger({
        name: "test.event",
      run: async (payload, io, ctx) => {
        await"Hello world!", { payload });

        return {
          message: "Hello world!",

  getHello(): string {
    return `Running with client-id ${}`;

You can import the client inside any service or controller, we recommend you to create specialized service for each job you have for a better maintainability.

Adding Configuration to package.json

Inside the package.json file, add the following configuration under the root object:

"": {
  "endpointId": "my-app"

Your package.json file might look something like this:

  "name": "my-app",
  "version": "1.0.0",
  "dependencies": {
    // ... other dependencies
  "": {
    "endpointId": "my-app"

Replace "my-app" with the appropriate identifier you used during the step for creating the Trigger Client.


Run your NestJS app

Run your NestJS app locally, like you normally would. For example:

npm run start

Run the CLI 'dev' command

In a separate terminal window or tab run:

npx dev

You can optionally pass the port if you're not running on 3000 by adding --port 3001 to the end

You can optionally pass the hostname if you're not running on localhost by adding --hostname <host>. Example, in case your Remix is running on --hostname