diff --git a/internal/pipe/build/build.go b/internal/pipe/build/build.go
index 04635f374..b3a01c28d 100644
--- a/internal/pipe/build/build.go
+++ b/internal/pipe/build/build.go
@@ -198,7 +198,11 @@ func buildOptionsForTarget(ctx *context.Context, build config.Build, target stri
 
 	name := bin + ext
 	dir := fmt.Sprintf("%s_%s", build.ID, target)
-	if build.NoUniqueDistDir {
+	noUnique, err := tmpl.New(ctx).Bool(build.NoUniqueDistDir)
+	if err != nil {
+		return nil, err
+	}
+	if noUnique {
 		dir = ""
 	}
 	relpath := filepath.Join(ctx.Config.Dist, dir, name)
diff --git a/internal/pipe/build/build_test.go b/internal/pipe/build/build_test.go
index 208024f3c..4d11b9671 100644
--- a/internal/pipe/build/build_test.go
+++ b/internal/pipe/build/build_test.go
@@ -623,18 +623,37 @@ func TestBuildOptionsForTarget(t *testing.T) {
 			},
 		},
 		{
-			name: "overriding dist path",
+			name: "no unique dist path evals true",
 			build: config.Build{
 				ID:     "testid",
-				Binary: "distpath/{{.Os}}/{{.Arch}}/testbinary_{{.Os}}_{{.Arch}}",
+				Binary: "distpath/{{.Os}}/{{.Arch}}/testbinary",
 				Targets: []string{
 					"linux_amd64",
 				},
-				NoUniqueDistDir: true,
+				NoUniqueDistDir: `{{ printf "true"}}`,
 			},
 			expectedOpts: &api.Options{
-				Name:    "distpath/linux/amd64/testbinary_linux_amd64",
-				Path:    filepath.Join(tmpDir, "distpath", "linux", "amd64", "testbinary_linux_amd64"),
+				Name:    "distpath/linux/amd64/testbinary",
+				Path:    filepath.Join(tmpDir, "distpath", "linux", "amd64", "testbinary"),
+				Target:  "linux_amd64_v1",
+				Goos:    "linux",
+				Goarch:  "amd64",
+				Goamd64: "v1",
+			},
+		},
+		{
+			name: "no unique dist path evals false",
+			build: config.Build{
+				ID:     "testid",
+				Binary: "testbinary",
+				Targets: []string{
+					"linux_amd64",
+				},
+				NoUniqueDistDir: `{{ printf "false"}}`,
+			},
+			expectedOpts: &api.Options{
+				Name:    "testbinary",
+				Path:    filepath.Join(tmpDir, "testid_linux_amd64_v1", "testbinary"),
 				Target:  "linux_amd64_v1",
 				Goos:    "linux",
 				Goarch:  "amd64",
diff --git a/pkg/config/config.go b/pkg/config/config.go
index b4bb776d2..3bdf6db57 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -504,7 +504,7 @@ type Build struct {
 	Skip            string          `yaml:"skip,omitempty" json:"skip,omitempty" jsonschema:"oneof_type=string;boolean"`
 	GoBinary        string          `yaml:"gobinary,omitempty" json:"gobinary,omitempty"`
 	Command         string          `yaml:"command,omitempty" json:"command,omitempty"`
-	NoUniqueDistDir bool            `yaml:"no_unique_dist_dir,omitempty" json:"no_unique_dist_dir,omitempty"`
+	NoUniqueDistDir string          `yaml:"no_unique_dist_dir,omitempty" json:"no_unique_dist_dir,omitempty" jsonschema:"oneof_type:string;boolean"`
 	NoMainCheck     bool            `yaml:"no_main_check,omitempty" json:"no_main_check,omitempty"`
 	UnproxiedMain   string          `yaml:"-" json:"-"` // used by gomod.proxy
 	UnproxiedDir    string          `yaml:"-" json:"-"` // used by gomod.proxy
diff --git a/www/docs/customization/builds.md b/www/docs/customization/builds.md
index 8d496ddc5..7bc5c689b 100644
--- a/www/docs/customization/builds.md
+++ b/www/docs/customization/builds.md
@@ -207,6 +207,8 @@ builds:
     # created, you can set this property.
     # If you do, you are responsible for keeping different builds from
     # overriding each other.
+    #
+    # Templates: allowed (since v2.3).
     no_unique_dist_dir: true
 
     # By default, GoReleaser will check if the main filepath has a main