Color ZoomArt on color background · uploaded as additional product media
Admin Settings
Shopify connection, SKU counter, and product defaults. Saved locally to this browser.
Shopify Connection credentials live on the server
As of Jan 1, 2026 Shopify retired the legacy shpat_ token flow. This app now uses
OAuth client credentials — the CLIENT_ID and CLIENT_SECRET
are set in Vercel env vars (SHOPIFY_SHOP_DOMAIN, SHOPIFY_CLIENT_ID,
SHOPIFY_CLIENT_SECRET, SHOPIFY_API_VERSION) and never touch the browser.
Informational. The server uses SHOPIFY_SHOP_DOMAIN from env at publish time.
Not tested
Calls /api/shopify-test which exchanges client credentials for an access token and pings /shop.json.
SKU Counter
Tokens: ####, {STYLE}, {COLOR}, {SIZE}
Auto-increments after every successful publish. When Supabase is connected, this value is pulled/pushed on the database.
Supabase SKU Counter server-managed · shared with backbone-db
Supabase credentials live in Vercel env vars (SUPABASE_URL,
SUPABASE_SERVICE_ROLE_KEY) and never touch the browser. The server writes to the shared
sku_counters row (name='T-Shirt_Hoodie') so SKUs stay sequential with the legacy backbone-db tool.
Each publish also appends to publish_log and upserts into designs.
Show SQL to create publish_log + designs in backbone-db
-- Shared SKU counter (ALREADY EXISTS in backbone-db — do not recreate)
-- sku_counters(id bigint, name text unique, value int4)
-- Current row: name='T-Shirt_Hoodie'
-- Publish history / audit trail — run this in backbone-db
create table if not exists publish_log (
id bigint generated by default as identity primary key,
created_at timestamptz default now(),
device_id text,
design_slug text,
design_name text,
product_title text,
product_handle text,
shopify_product_id text,
sku_from int4,
sku_to int4,
variant_count int4,
price_min numeric(10,2),
price_max numeric(10,2),
styles text[],
colors text[],
status text,
payload jsonb
);
create index if not exists publish_log_created_idx on publish_log (created_at desc);
create index if not exists publish_log_slug_idx on publish_log (design_slug);
-- Design registry — one row per unique design slug
create table if not exists designs (
slug text primary key,
name text,
vibe text,
tags text[],
first_seen timestamptz default now(),
last_used timestamptz default now(),
publish_count int4 default 0,
thumbnail_url text
);
-- RLS: the server uses the service role key, which bypasses RLS.
-- No policies needed unless you also plan to hit these tables from the browser.
Not tested
Product Defaults
Pricing
Base price per garment style. Size upcharges stack on top of the base.
$
$
$
$
+$
+$
+$
Size Runs by Style
SEO AI Assist
Publish to Shopify
Review details, variants, and SEO — then push to your store as a Draft.
1Details
2SEO
3Variants
4Review
One title per design — variants cover style, color, and size.
Garments Included
Click AI Assist to draft title, description, and meta fields — then edit to taste.
Next available: #0000 — enter a number here to use a specific (e.g. older) SKU instead.
Image groups: one mockup per Style × Color, then every size in that group shares the image.
All Variants
Style / Color
Size
SKU
Price
Ready to push to Shopify as a Draft. You can edit everything in Shopify admin after publish.