Loganix Ops

Supplier Profile — QA Review Form

Schema Mapping

How each form field maps to the loganix_ops.suppliers table. This form collects the core profile data for a publisher or vendor — separate from their site listings.

Identity
supplier_typeType dropdown
emailPrimary email
alt_emailAlt email
first_nameFirst name
last_nameLast name
phonePhone number
countryCountry
company_nameCompany name
alt_contactsAlt contacts (JSONB)
contact_typePreferred (dynamic)
Payment & Financials
payment_methodPayment method
payment_detailsPayment details
credit_balanceCredit balance (auto)
debit_balanceDebit balance (auto)
prepaymentsPrepayments
monthly_billingBilling cycle
global_discountDiscount %
holiday_discountHoliday discount %
holiday_discount_startHoliday window from
holiday_discount_endHoliday window to
Operations
default_tatDefault TAT (days)
provides_contentProvides content?
referralReferral source
Status & Flags
banned_atBanned at (ts)
ban_expires_atBan expires at
probatedProbation toggle
stl_v2_approvedSTL v2 approved
Portal Auth
auth_providerOAuth provider
auth_subjectOAuth subject
portal_prefsPortal UI state
Consent
consent_communicationComms consent
privacy_consentPrivacy consent
terms_conditionsT&C accepted
Notes & Timestamps
notesInternal notes
last_comms_atAuto: last email/msg
last_list_update_atAuto: last inventory edit
last_login_atAuto: last portal login
System & Computed
ratingAuto: QA pipeline
rating_detailsAuto: rating breakdown
reliabilityAuto: delivery score
invoice_numberAuto: next counter
created_atAuto: on create
updated_atAuto: on update

Legacy Source

fulfillment.loganix.com → publishers table
publishers.loganix.com → self-service profile
Data migrated via create_supply_tables.py

Data Quality Issues (6,416 rows)

country — freetext, inconsistent casing, junk entries (phone numbers, ".", "All Country Allow")
monthly_billing — all NULL in current data; now "billing cycle" with bi-weekly / net72
alt_contacts — JSONB, no consistent schema yet
debit_balance — new field, not in current schema

QA Review Form — Not Connected to Database

This form shows every data point stored for a supplier (publisher or vendor) profile. Use it to verify field completeness against the legacy systems (fulfillment.loganix.com, publishers.loganix.com). Nothing is saved — this is for review by Angelo, John, Lore, and Sara.

Supplier Profile

All the data we collect and maintain for a publisher or vendor. This is the supplier's core profile — their site listings are managed separately on the /listing page.

1

Identity & Contact

suppliers
Publisher owns sites directly. Vendor is an intermediary who manages multiple publisher relationships.
suppliers.supplier_type — NOT NULL
Main contact email. Must be unique across all suppliers. Used for login, comms, and payment notifications.
suppliers.email — citext, NOT NULL, UNIQUE
Secondary email for CC purposes or alternate contact.
suppliers.alt_email — varchar(255)
Contact person's first name.
suppliers.first_name — varchar(255)
Contact person's last name.
suppliers.last_name — varchar(255)
Business or agency name. Displayed in the UI as the primary name when present (falls back to first/last name).
suppliers.company_name — varchar(255)
Contact phone number. No format enforced currently.
suppliers.phone — varchar(255)
Supplier's country of operation. Legacy data is freetext — needs standardization (e.g. "canada" vs "Canada" vs "CANADA").
suppliers.country — varchar(255)
Additional contact methods beyond primary and alt email. Stored as JSONB array. Each entry becomes a choice in Preferred Contact Method below.
suppliers.alt_contacts — jsonb
Which of the above contact methods this supplier prefers we use. Populated dynamically from primary email, alt email, and any alternate contacts entered above.
suppliers.contact_type — varchar(255)
2

Payment & Financials

suppliers
How we pay this supplier. Determines what payment_details we need.
suppliers.payment_method — varchar(50)
Account info, PayPal email, wire instructions, etc. Format depends on payment method above.
suppliers.payment_details — text
How frequently we pay this supplier. Per-order is the default; some suppliers are on a regular cycle.
suppliers.monthly_billing — varchar(15)
What we owe this supplier. Auto-updated from supplier_ledger credit entries as orders complete; decremented when an invoice is paid. Manual override allowed.
suppliers.credit_balance — numeric(10,2), default 0
$
Auto-updated — manual override allowed
What this supplier owes us (penalties, chargebacks, overpayment corrections). Auto-updated from supplier_ledger debit entries. Manual override allowed.
suppliers.debit_balance — numeric(10,2), default 0
$
Auto-updated — manual override allowed
Amount pre-paid to this supplier (advance against future work).
suppliers.prepayments — numeric(10,2), default 0
$
A blanket discount percentage applied across all this supplier's sites.
suppliers.global_discount — numeric(10,2)
%
Temporary additional discount for promotional periods (e.g. 4th of July, Black Friday). Only active between the start and end dates — automatically applies on top of the regular discount during that window.
suppliers.holiday_discount — numeric(10,2) + holiday_discount_start / _end (date)
%
From
To
3

Operations & Performance

suppliers
Supplier-level default TAT in days. Individual sites can override this in supplier_sites.tat.
suppliers.default_tat — smallint
days
Whether this supplier can write content themselves (vs. requiring us to provide it).
suppliers.provides_content — varchar(255)
How this supplier found us or who referred them.
suppliers.referral — varchar(255)
4

Status & Flags

suppliers
Timestamp when the current ban was issued. Blank = supplier is not currently banned. We dropped the separate banned boolean — the timestamp itself is the state.
suppliers.banned_at — timestamptz
Leave blank if not currently banned
When the ban automatically lifts. Null (when banned_at is set) = indefinite ban. Set a future timestamp for a timed suspension. A supplier is banned right now if banned_at IS NOT NULL AND (ban_expires_at IS NULL OR ban_expires_at > now()).
suppliers.ban_expires_at — timestamptz
Leave blank for indefinite ban
Supplier is on probation — still eligible for orders, but monitored more closely. May carry reduced order volume limits or require manual QA.
suppliers.probated — boolean, default false
On probation
Marks this supplier as vetted for Shop The List v2 — the rebuild of our legacy STL marketplace. Not all v1 vendors will migrate; this flag identifies the ones approved for v2. Keep this column even once v1 is gone; it documents the one-time migration gate.
suppliers.stl_v2_approved — boolean, default false
Approved for STL v2
5

Consent & Compliance

suppliers
Supplier has opted in to receive communications (newsletters, updates, promotions).
suppliers.consent_communication — boolean, default false
Opted in to communications
Supplier has acknowledged and accepted the privacy policy.
suppliers.privacy_consent — boolean, default false
Privacy policy accepted
Supplier has accepted the terms and conditions of service.
suppliers.terms_conditions — boolean, default false
T&C accepted
6

Notes & Activity Timestamps

suppliers
Free-text notes visible only to Loganix staff. Relationship history, special arrangements, issues.
suppliers.notes — text
Timestamp of last email, message, or meaningful contact. Updated automatically by comms system.
suppliers.last_comms_at — timestamptz
Auto-populated — not manually editable
When the supplier last added/modified a site listing via the portal.
suppliers.last_list_update_at — timestamptz
Auto-populated — not manually editable
When the supplier last logged into the vendor/publisher portal.
suppliers.last_login_at — timestamptz
Auto-populated — not manually editable
7

Portal Authentication

suppliers

The supplier portal will live on its own domain (not ops.loganix.com, which is staff-only). Suppliers will log in via OAuth — likely Google to start, others later. These fields store the identity tying them to a provider account.

Which provider the supplier authenticates with. Null until first portal login.
suppliers.auth_provider — varchar(30)
The provider’s stable unique identifier for this user (e.g. Google’s sub claim). Combined with provider forms a unique login identity — supplier can change their email without losing access.
suppliers.auth_subject — varchar(255), unique per provider
Auto-populated on first login; staff should rarely edit manually.
Free-form JSONB for per-supplier portal UI state — tour dismissal flags, default views, timezone, etc. Extend keys freely without migrations.
suppliers.portal_prefs — jsonb, default {}
8

System & Computed

suppliers

These columns exist on the suppliers table but are never manually edited from this form — they are populated by the system (order QA, ledger entries, portal activity). Shown here for completeness so the staff profile reflects every real field.

Rating
Overall quality rating derived from link checks and feedback. Updated by the QA pipeline.
suppliers.rating — numeric
Rating Details
Breakdown of rating components (TAT adherence, quality grades, rework rate, etc.).
suppliers.rating_details — jsonb
Reliability
Reliability score based on accept rate, TAT hit rate, and cancellation rate.
suppliers.reliability — numeric
Invoice Number
Next invoice number counter — auto-increments on each invoice generation.
suppliers.invoice_number — integer
Created At
Timestamp when this supplier row was first created.
suppliers.created_at — timestamptz
Updated At
Timestamp of the last write to any column on this row.
suppliers.updated_at — timestamptz