diff --git a/entrypoint.sh b/entrypoint.sh
index 026b879..fc8ba43 100755
--- a/entrypoint.sh
+++ b/entrypoint.sh
@@ -11,7 +11,13 @@ _main() {
 
     if _git_is_dirty || "$INPUT_SKIP_DIRTY_CHECK"; then
 
-        echo "changes_detected=true" >> $GITHUB_OUTPUT;
+        # Check if $GITHUB_OUTPUT is available
+        # (Feature detection will be removed in late December 2022)
+        if [ -z ${GITHUB_OUTPUT+x} ]; then
+            echo "::set-output name=changes_detected::true";
+        else
+            echo "changes_detected=true" >> $GITHUB_OUTPUT;
+        fi
 
         _switch_to_branch
 
@@ -24,7 +30,13 @@ _main() {
         _push_to_github
     else
 
-        echo "changes_detected=false" >> $GITHUB_OUTPUT;
+        # Check if $GITHUB_OUTPUT is available
+        # (Feature detection will be removed in late December 2022)
+        if [ -z ${GITHUB_OUTPUT+x} ]; then
+            echo "::set-output name=changes_detected::false";
+        else
+            echo "changes_detected=false" >> $GITHUB_OUTPUT;
+        fi
 
         echo "Working tree clean. Nothing to commit.";
     fi
@@ -101,7 +113,14 @@ _local_commit() {
         --author="$INPUT_COMMIT_AUTHOR" \
         ${INPUT_COMMIT_OPTIONS:+"${INPUT_COMMIT_OPTIONS_ARRAY[@]}"};
 
-    echo "commit_hash=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT;
+
+    # Check if $GITHUB_OUTPUT is available
+    # (Feature detection will be removed in late December 2022)
+    if [ -z ${GITHUB_OUTPUT+x} ]; then
+        echo "::set-output name=commit_hash::$(git rev-parse HEAD)";
+    else
+        echo "commit_hash=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT;
+    fi
 }
 
 _tag_commit() {
diff --git a/tests/git-auto-commit.bats b/tests/git-auto-commit.bats
index 61fc407..f0b2324 100644
--- a/tests/git-auto-commit.bats
+++ b/tests/git-auto-commit.bats
@@ -57,7 +57,12 @@ teardown() {
     rm -rf "${FAKE_LOCAL_REPOSITORY}"
     rm -rf "${FAKE_REMOTE}"
     rm -rf "${FAKE_TEMP_LOCAL_REPOSITORY}"
-    rm "${GITHUB_OUTPUT}"
+
+    if [ -z ${GITHUB_OUTPUT+x} ]; then
+        echo "GITHUB_OUTPUT is not set"
+    else
+        rm "${GITHUB_OUTPUT}"
+    fi
 }
 
 # Create a fake remote repository which tests can push against
@@ -997,3 +1002,42 @@ cat_github_output() {
     refute_line --partial "new-file-2.txt"
     refute_line --partial "new-file-3.txt"
 }
+
+
+@test "It uses old set-output syntax if GITHUB_OUTPUT environment is not available when changes are committed" {
+    unset GITHUB_OUTPUT
+
+    touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt
+
+    run git_auto_commit
+
+    assert_success
+
+    assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
+    assert_line "INPUT_BRANCH value: ${FAKE_DEFAULT_BRANCH}"
+    assert_line "INPUT_FILE_PATTERN: ."
+    assert_line "INPUT_COMMIT_OPTIONS: "
+    assert_line "::debug::Apply commit options "
+    assert_line "INPUT_TAGGING_MESSAGE: "
+    assert_line "No tagging message supplied. No tag will be added."
+    assert_line "INPUT_PUSH_OPTIONS: "
+    assert_line "::debug::Apply push options "
+    assert_line "::debug::Push commit to remote branch ${FAKE_DEFAULT_BRANCH}"
+
+    assert_line "::set-output name=changes_detected::true"
+    assert_line -e "::set-output name=commit_hash::[0-9a-f]{40}$"
+}
+
+@test "It uses old set-output syntax if GITHUB_OUTPUT environment is not available when no changes have been detected" {
+    unset GITHUB_OUTPUT
+
+    run git_auto_commit
+
+    assert_success
+
+    assert_line "INPUT_REPOSITORY value: ${INPUT_REPOSITORY}"
+    assert_line "Working tree clean. Nothing to commit."
+
+    assert_line "::set-output name=changes_detected::false"
+    refute_line -e "::set-output name=commit_hash::[0-9a-f]{40}$"
+}