diff --git a/models/actions/run.go b/models/actions/run.go
index 397455e41d..8b40cb7ba8 100644
--- a/models/actions/run.go
+++ b/models/actions/run.go
@@ -336,15 +336,18 @@ func GetLatestRun(ctx context.Context, repoID int64) (*ActionRun, error) {
 
 func GetLatestRunForBranchAndWorkflow(ctx context.Context, repoID int64, branch, workflowFile, event string) (*ActionRun, error) {
 	var run ActionRun
-	q := db.GetEngine(ctx).Where("repo_id=?", repoID).And("ref=?", branch).And("workflow_id=?", workflowFile)
+	q := db.GetEngine(ctx).Where("repo_id=?", repoID).And("workflow_id=?", workflowFile)
 	if event != "" {
 		q = q.And("event=?", event)
 	}
+	if branch != "" {
+		q = q.And("ref=?", branch)
+	}
 	has, err := q.Desc("id").Get(&run)
 	if err != nil {
 		return nil, err
 	} else if !has {
-		return nil, util.NewNotExistErrorf("run with repo_id %d, ref %s, workflow_id %s", repoID, branch, workflowFile)
+		return nil, util.NewNotExistErrorf("run with repo_id %d, ref %s, event %s, workflow_id %s", repoID, branch, event, workflowFile)
 	}
 	return &run, nil
 }
diff --git a/release-notes/8.0.0/fix/3843.md b/release-notes/8.0.0/fix/3843.md
new file mode 100644
index 0000000000..d900cbe1e7
--- /dev/null
+++ b/release-notes/8.0.0/fix/3843.md
@@ -0,0 +1 @@
+- Fixed a bug that resulted in workflow badges not working for workflows that weren't running on push (such as scheduled workflows, and ones that run on tags and for prs)
diff --git a/routers/web/repo/badges/badges.go b/routers/web/repo/badges/badges.go
index ed40e982a1..f240d30a31 100644
--- a/routers/web/repo/badges/badges.go
+++ b/routers/web/repo/badges/badges.go
@@ -45,10 +45,9 @@ func errorBadge(ctx *context_module.Context, label, text string) {
 
 func GetWorkflowBadge(ctx *context_module.Context) {
 	branch := ctx.Req.URL.Query().Get("branch")
-	if branch == "" {
-		branch = ctx.Repo.Repository.DefaultBranch
+	if branch != "" {
+		branch = fmt.Sprintf("refs/heads/%s", branch)
 	}
-	branch = fmt.Sprintf("refs/heads/%s", branch)
 	event := ctx.Req.URL.Query().Get("event")
 
 	workflowFile := ctx.Params("workflow_name")
diff --git a/tests/integration/repo_badges_test.go b/tests/integration/repo_badges_test.go
index fda991b8dd..9c3006b18d 100644
--- a/tests/integration/repo_badges_test.go
+++ b/tests/integration/repo_badges_test.go
@@ -1,4 +1,5 @@
 // Copyright 2023 The Gitea Authors. All rights reserved.
+// Copyright 2024 The Forgejo Authors c/o Codeberg e.V.. All rights reserved.
 // SPDX-License-Identifier: MIT
 
 package integration
@@ -40,12 +41,17 @@ func TestBadges(t *testing.T) {
 					{
 						Operation:     "create",
 						TreePath:      ".gitea/workflows/pr.yml",
-						ContentReader: strings.NewReader("name: test\non:\n  push:\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - run: echo helloworld\n"),
+						ContentReader: strings.NewReader("name: pr\non:\n  push:\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - run: echo helloworld\n"),
 					},
 					{
 						Operation:     "create",
 						TreePath:      ".gitea/workflows/self-test.yaml",
-						ContentReader: strings.NewReader("name: test\non:\n  push:\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - run: echo helloworld\n"),
+						ContentReader: strings.NewReader("name: self-test\non:\n  push:\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - run: echo helloworld\n"),
+					},
+					{
+						Operation:     "create",
+						TreePath:      ".gitea/workflows/tag-test.yaml",
+						ContentReader: strings.NewReader("name: tags\non:\n  push:\n    tags: '*'\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - run: echo helloworld\n"),
 					},
 				},
 			)
@@ -112,6 +118,25 @@ func TestBadges(t *testing.T) {
 			req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/pr.yml/badge.svg?event=cron", repo.Name)
 			resp = MakeRequest(t, req, http.StatusSeeOther)
 			assertBadge(t, resp, "pr.yml-Not%20found-crimson")
+
+			t.Run("tagged", func(t *testing.T) {
+				defer tests.PrintCurrentTest(t)()
+
+				// With no tags, the workflow has no runs, and isn't found
+				req := NewRequestf(t, "GET", "/user2/%s/actions/workflows/tag-test.yaml/badge.svg", repo.Name)
+				resp := MakeRequest(t, req, http.StatusSeeOther)
+				assertBadge(t, resp, "tag--test.yaml-Not%20found-crimson")
+
+				// Lets create a tag!
+				owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
+				err := release.CreateNewTag(git.DefaultContext, owner, repo, "main", "v1", "message")
+				assert.NoError(t, err)
+
+				// Now the workflow is wating
+				req = NewRequestf(t, "GET", "/user2/%s/actions/workflows/tag-test.yaml/badge.svg", repo.Name)
+				resp = MakeRequest(t, req, http.StatusSeeOther)
+				assertBadge(t, resp, "tag--test.yaml-waiting-lightgrey")
+			})
 		})
 
 		t.Run("Stars", func(t *testing.T) {