diff --git a/.gitignore b/.gitignore
index ea63aaa..434c14b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,7 @@
 .envrc
 .direnv
 cmd/server/server
-
+cmd/server/app.log
 # postgres
 postgres.db
 postgres.log
diff --git a/README.md b/README.md
index 69fafe3..86efcab 100644
--- a/README.md
+++ b/README.md
@@ -21,6 +21,9 @@ The goal of this project is to be a crowd sourced resource to find out if a prod
 - create mobile and desktop front ends
 - moderation tooling?
 
+## Tip
+Paste this to log the SQL queries in stdout.
+ctx = ksql.InjectLogger(ctx, ksql.Logger)
 
 
 ## How to start database
diff --git a/internal/application/handlers.go b/internal/application/handlers.go
index 46b4bf5..aaa1a54 100644
--- a/internal/application/handlers.go
+++ b/internal/application/handlers.go
@@ -1,7 +1,6 @@
 package application
 
 import (
-	"fmt"
 	"net/http"
 	"vegan-barcode/internal/models"
 
@@ -25,6 +24,7 @@ func (a *Application) GetClaimsHandler(c *gin.Context) {
 	c.JSON(http.StatusOK, productClaims)
 }
 
+// PostClaimHandler takes the parameters and body form
 func (a *Application) PostClaimHandler(c *gin.Context) {
 	system := c.Param("system")
 	barcode := c.Param("barcode")
@@ -32,12 +32,12 @@ func (a *Application) PostClaimHandler(c *gin.Context) {
 	var requestBody models.UserClaimForm
 	err := c.BindJSON(&requestBody)
 	if err != nil {
-		c.JSON(http.StatusBadRequest, fmt.Errorf("improperly formatted request: %w", err))
+		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
 		return
 	}
 	log.Debugf("requestbody: %v", requestBody)
 
-	claim, err := a.CreateClaim(system, barcode, requestBody)
+	claim, err := a.CreateUserClaim(system, barcode, requestBody)
 	if err != nil {
 		c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
 		return
diff --git a/internal/application/services.go b/internal/application/services.go
index 9120055..8177447 100644
--- a/internal/application/services.go
+++ b/internal/application/services.go
@@ -23,18 +23,13 @@ func (a *Application) GetClaims(system string, barcode string) (*models.ProductC
 	return &models.ProductClaims{Id: product.Id, Claims: claims}, nil
 }
 
-func (a *Application) CreateClaim(system string, barcode string, form models.UserClaimForm) (*database.UserClaim, error) {
-	product, err := a.db.FindProductByBarcode(system, barcode)
+// CreateUserClaim gets the product ID or creates a new entry if not found,
+// then calls InsertUserClaim to create the claim object and put it in the database.
+func (a *Application) CreateUserClaim(system string, barcode string, form models.UserClaimForm) (*database.UserClaim, error) {
+	product, err := a.db.FindOrCreateProduct(system, barcode)
 	if err != nil {
 		return nil, err
 	}
-	// no product, create new
-	if product == nil {
-		product, err = a.db.CreateProduct(system, barcode)
-		if err != nil {
-			return nil, err
-		}
-	}
 
-	return a.db.CreateUserClaim(product.Id, form)
+	return a.db.InsertUserClaim(product.Id, form)
 }
diff --git a/internal/database/claims.go b/internal/database/claims.go
index 033ea4b..73532b8 100644
--- a/internal/database/claims.go
+++ b/internal/database/claims.go
@@ -59,7 +59,7 @@ func (d *Database) FindClaimsByProductID(product_id int) (claims []models.Claim,
 	return
 }
 
-// exists only for testing
+// Testing function
 func (database *Database) FindUserClaimById(claim_id int) (*UserClaim, error) {
 	ctx := context.Background()
 
@@ -73,7 +73,8 @@ func (database *Database) FindUserClaimById(claim_id int) (*UserClaim, error) {
 	return &claim, err
 }
 
-func (d *Database) CreateUserClaim(product_id int, form models.UserClaimForm) (*UserClaim, error) {
+// InsertUserClaim puts creates a new user claim database object and inserts in DB.
+func (d *Database) InsertUserClaim(product_id int, form models.UserClaimForm) (*UserClaim, error) {
 	ctx := context.Background()
 	var uc = UserClaim{
 		Product_id:    product_id,
@@ -81,7 +82,7 @@ func (d *Database) CreateUserClaim(product_id int, form models.UserClaimForm) (*
 		Evidence:      form.Evidence,
 		Claims:        form.Claims,
 		Counterclaims: form.Counterclaims,
-		// TODO: Add created by
+		Created_by:    form.Created_by,
 	}
 
 	err := d.db.Insert(ctx, UserClaimsTable, &uc)
diff --git a/internal/database/database.go b/internal/database/database.go
index 71555d8..42604f3 100644
--- a/internal/database/database.go
+++ b/internal/database/database.go
@@ -51,7 +51,8 @@ func (database *Database) createTables(ctx context.Context) {
 			id BIGSERIAL PRIMARY KEY,
 			system TEXT,
 			barcode TEXT,
-			created_at TIMESTAMPTZ
+			created_at TIMESTAMPTZ,
+			UNIQUE (system, barcode)
 		);
 	`)
 	if err != nil {
diff --git a/internal/database/products.go b/internal/database/products.go
index 1eb3e5c..77f5ad0 100644
--- a/internal/database/products.go
+++ b/internal/database/products.go
@@ -9,10 +9,26 @@ import (
 	"github.com/vingarcia/ksql"
 )
 
+func (d *Database) FindOrCreateProduct(system string, barcode string) (*Product, error) {
+	product, err := d.FindProductByBarcode(system, barcode)
+	if err != nil {
+		return nil, err
+	}
+
+	// If the product doesn't exist yet, create it
+	if product == nil {
+		product, err = d.CreateProduct(system, barcode)
+		if err != nil {
+			return nil, err
+		}
+	}
+	return product, nil
+}
+
+// FindProductByBarcode will return nil with no error if the product doesn't exist.
 func (d *Database) FindProductByBarcode(system string, barcode string) (*Product, error) {
 
 	ctx := context.Background()
-	ctx = ksql.InjectLogger(ctx, ksql.Logger)
 
 	var product Product
 	err := d.db.QueryOne(ctx, &product, "FROM products WHERE system = $1 AND barcode = $2", system, barcode)
@@ -27,7 +43,7 @@ func (d *Database) FindProductByBarcode(system string, barcode string) (*Product
 	return &product, nil
 }
 
-// Doesnt handle checking if product exists.
+// CreateProduct simply makes an entry in the products table. Prefer FindOrCreateProduct
 func (d *Database) CreateProduct(system string, barcode string) (*Product, error) {
 	ctx := context.Background()
 	var product = Product{
@@ -36,7 +52,7 @@ func (d *Database) CreateProduct(system string, barcode string) (*Product, error
 		Created_at: time.Now(),
 	}
 
-	log.Debugf("made new product: %v", product)
+	log.Debugf("successfully created new product: %v", product)
 
 	if err := d.db.Insert(ctx, ProductsTable, &product); err != nil {
 		return nil, fmt.Errorf("failed to insert new product: %w", err)