---
title: "Cron Jobs with Django and GitHub Actions"
description: "Run a cron job on Railway with the help of Django and GitHub Actions"
date: 2023-03-22T00:00:00.000Z
updated: 2026-10-29T11:13:09.502Z
topics: ["Guides"]
tags: []
url: https://railway.com/guides/cron-jobs-django-github-actions
---

# Cron Jobs with Django and GitHub Actions

### **Update (31/08/23) — Cron Jobs now available on Railway**

Railway now supports Cron Jobs natively. It may be a better fit for you than what’s written here. Check out [https://docs.railway.com/cron-jobs](https://docs.railway.com/cron-jobs) for details!

---

## Introduction

We’ve been asked a number of times how to orchestrate a cron job on Railway. Today we’re going to show you how to create your first Django cron using GitHub Actions. 

This may come in handy if you’re looking to add a cron to a new or existing Railway project and will make it possible to run any Django task on a schedule on Railway.

Let’s get into it!

## The GitHub Action

For those of you who are here to grab the example code, here’s the entire YAML needed to create a GitHub Action to run your Django tasks on a cron:

```yaml
name: My Command

on:
  schedule:
    - cron: '*/4 * * * *'

jobs:
  build:
    name: Run crons
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - uses: actions/setup-node@v3
        with:
          node-version: 16

      - name: Install Railway
        run: npm i -g @railway/cli

      - name: Install Python packages
        run: railway run --service {{SERVICE_ID}} pip install -r requirements.txt
        env:
          RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}

      - name: My Command
        run: railway run --service {{SERVICE_ID}} python manage.py my_command
        env:
          RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
```

If you care to understand a bit more about how this works, please read on. 

### The Schedule

In the snippet below, we’re telling GitHub to run this Action every 4 minutes. 

```yaml
on:
  schedule:
    - cron: '*/4 * * * *'
```

Of course, you may use any cron expression you like to run your Action at your preferred interval. We recommend checking out [CrontabGuru](https://crontab.guru/), which is a handy service to test out your cron expressions before adding them to your Action.

### The Railway CLI

Next, we’ll install the Railway CLI which will allow us to interact with our Railway project from within the GitHub Action. You can [read the docs](https://docs.railway.com/cli) to learn more about the CLI. 

```yaml
name: Install Railway
  run: npm i -g @railway/cli
```

Now that the Railway CLI is installed, we’ll run the task. 

### Running the Task

In the snippet below, we’ll invoke our `my_command` management command on our service using the Railway CLI. If you don’t have a `RAILWAY_TOKEN` secret, note that this can be generated by creating a [Project Token](https://docs.railway.com/integrations/api) for your project.

```yaml
name: My Command
  run: railway run --service {{SERVICE_ID}} python manage.py my_command
  env:
    RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }}
```

Success! We’ve now run the task and started the cron!

## Closing

In a few simple steps, we’ve made it possible to execute any Django task at a specific interval on our Railway projects and services.

We’d like to give a shoutout to [Dan Rowden](https://twitter.com/dr) for sharing this GitHub Action which was written for a new project called [InstantDM](https://instantdm.com/).

Additionally, if someone in the community would like re-work this GitHub Action to run rake tasks for Ruby on Rails — [reach out](https://discord.com/invite/railway) and let us know! We’d love to help you get it working.