diff --git a/internal/postgres/experiment.go b/internal/postgres/experiment.go
deleted file mode 100644
index 5729735..0000000
--- a/internal/postgres/experiment.go
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package postgres
-
-import (
-	"context"
-	"database/sql"
-	"fmt"
-
-	"golang.org/x/pkgsite/internal"
-	"golang.org/x/pkgsite/internal/derrors"
-)
-
-// GetExperiments fetches all experiments in the database.
-func (db *DB) GetExperiments(ctx context.Context) (_ []*internal.Experiment, err error) {
-	defer derrors.Wrap(&err, "DB.GetExperiments(ctx)")
-
-	query := "SELECT name, rollout, description FROM experiments;"
-	var experiments []*internal.Experiment
-	err = db.db.RunQuery(ctx, query, func(rows *sql.Rows) error {
-		var e internal.Experiment
-		if err := rows.Scan(&e.Name, &e.Rollout, &e.Description); err != nil {
-			return err
-		}
-		experiments = append(experiments, &e)
-		return nil
-	})
-	return experiments, nil
-}
-
-// InsertExperiment inserts a row into the experiments table.
-func (db *DB) InsertExperiment(ctx context.Context, e *internal.Experiment) (err error) {
-	defer derrors.Wrap(&err, "DB.insertExperiment(ctx, %v)", e)
-	if e.Name == "" || e.Description == "" {
-		return fmt.Errorf("neither name nor description can be empty: %w", derrors.InvalidArgument)
-	}
-
-	_, err = db.db.Exec(ctx,
-		`INSERT INTO experiments
-		(name, rollout, description) VALUES ($1, $2, $3);`,
-		e.Name, e.Rollout, e.Description)
-	return err
-}
-
-// UpdateExperiment updates the specified experiment with the provided rollout value.
-func (db *DB) UpdateExperiment(ctx context.Context, e *internal.Experiment) (err error) {
-	defer derrors.Wrap(&err, "DB.UpdateExperiment(ctx, %v)", e)
-	if e.Name == "" || e.Description == "" {
-		return fmt.Errorf("neither name nor description can be empty: %w", derrors.InvalidArgument)
-	}
-
-	query := `UPDATE experiments
-		SET rollout = $2, description = $3
-		WHERE name = $1;`
-	n, err := db.db.Exec(ctx, query, e.Name, e.Rollout, e.Description)
-	if err != nil {
-		return err
-	}
-	if n == 0 {
-		return derrors.NotFound
-	}
-	return nil
-}
-
-// RemoveExperiment removes the specified experiment.
-func (db *DB) RemoveExperiment(ctx context.Context, name string) (err error) {
-	defer derrors.Wrap(&err, "DB.RemoveExperiment(ctx, %q)", name)
-	n, err := db.db.Exec(ctx, `DELETE FROM experiments WHERE name = $1`, name)
-	if err != nil {
-		return err
-	}
-	if n == 0 {
-		return derrors.NotFound
-	}
-	return nil
-}
diff --git a/internal/postgres/experiment_test.go b/internal/postgres/experiment_test.go
deleted file mode 100644
index b17729f..0000000
--- a/internal/postgres/experiment_test.go
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package postgres
-
-import (
-	"context"
-	"errors"
-	"testing"
-
-	"github.com/google/go-cmp/cmp"
-	"golang.org/x/pkgsite/internal"
-	"golang.org/x/pkgsite/internal/derrors"
-)
-
-func TestGetActiveExperiments(t *testing.T) {
-	defer ResetTestDB(testDB, t)
-	ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
-	defer cancel()
-
-	experiment := &internal.Experiment{Name: "test-experiment", Description: "test-description"}
-	if err := testDB.UpdateExperiment(ctx, experiment); !errors.Is(err, derrors.NotFound) {
-		t.Fatalf("unexpected error when updating non-existent experiment: %v", err)
-	}
-	got, err := testDB.GetExperiments(ctx)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if len(got) != 0 {
-		t.Fatalf("got %d experiments; want = 0", len(got))
-	}
-	if err := testDB.InsertExperiment(ctx, experiment); err != nil {
-		t.Fatalf("error inserting inactive experiment: %v", err)
-	}
-	got, err = testDB.GetExperiments(ctx)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if len(got) != 1 {
-		t.Fatalf("got %d experiments; want = 1", len(got))
-	}
-
-	experiment.Rollout = 50
-	if err := testDB.UpdateExperiment(ctx, experiment); err != nil {
-		t.Fatal(err)
-	}
-	got, err = testDB.GetExperiments(ctx)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if len(got) != 1 {
-		t.Fatalf("got = %d active experiments; want = 1", len(got))
-	}
-	if diff := cmp.Diff(experiment, got[0]); diff != "" {
-		t.Fatalf("mismatch (-want +got):\n%s", diff)
-	}
-
-}
-
-func TestCannotInsertRolloutGreaterThan100(t *testing.T) {
-	defer ResetTestDB(testDB, t)
-	ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
-	defer cancel()
-
-	experiment := &internal.Experiment{
-		Name:        "test-rollout-greater-than-one",
-		Rollout:     101,
-		Description: "test-description",
-	}
-	// Test cannot insert feature with rollout > 100.
-	if err := testDB.InsertExperiment(ctx, experiment); err == nil {
-		t.Fatal(err)
-	}
-
-	experiment.Rollout = 100
-	if err := testDB.InsertExperiment(ctx, experiment); err != nil {
-		t.Fatal(err)
-	}
-	// Test cannot update feature rollout to > 1.
-	experiment.Rollout = 101
-	if err := testDB.UpdateExperiment(ctx, experiment); err == nil {
-		t.Fatal(err)
-	}
-}
