Datenmodell · nackt

Das Schema — jedes Feld, jede Verknüpfung

Drei verknüpfte Entitäten: ShopRecord (Shop / eigener Shop / Wettbewerber, ein `kind`-Feld) ↔ AdvertiserRecord (Ads-DB) ↔ AdRecord (einzelnes Creative). Jedes Feld trägt Wert + Quelle + Status.

Beziehungs-Karte

ShopRecord (kind: shop | own | competitor) ├─ company / impressum, location, warehouse ├─ products ──────────────► /products.json ├─ contacts (emails, phones, socials[]) ├─ privacy + cookies[] ─────► Datenschutz + Cookie-Scan (Tools) ├─ legal (AGB) + returns ───► Retoure-Inhalt (self|software|3PL) ├─ reviews[] ───────────────► Trustpilot · Trusted Shops · Google · Reviews.io ├─ similarweb ──────────────► SimilarWeb public │ └─ competitors[] ───┐ (Cross-Link) ├─ social[] ────────────────► IG/FB/TikTok/YT (Follower, Posts, Alter) ├─ platforms[] / sellsToCountries[] ├─ tools{analytics,emailMarketing,reviews,consent,cdp,other} └─ ads ─────────► AdvertiserRecord ──► AdRecord[] (Google CR · Meta archive) google{advertiserId,count} ├─ content{h1,h2,h3,text} meta{count} ├─ creativeType, format tiktok{active} └─ firstSeen, durationDays competitor.competitorOf ─► ShopRecord.domain (Wettbewerber-Zuordnung)

ShopRecord — Felder

ShopRecord

PK: id · kind ∈ {shop, own, competitor} · competitorOf → ShopRecord.domain · ads → AdvertiserRecord.shopId
FeldTypQuelle
id / kind / name / domain / shopUrlstringintern / Discovery
shopifyConfirmed{value,evidence[]}obj/products.json, cdn.shopify.com, x-shopid
discovery{method,signal,confidence,sourceStatus}objCT-Logs / Reverse-IP / products-json / header
company{legalName,legalForm,register,vatId,managingDirectors[],sourceUrl,sourceStatus}objImpressum §5 DDG
location{city,country} · warehouse{city,country,source}objImpressum / Versand
products{count,categories[],currency,priceRange,sourceUrl,status}obj/products.json
contacts{emails[],phones[],socials[]}objImpressum / Website
privacy{url,dpo,consentTool,trackers[]} · cookies[]{name,tool,category}obj/arrDatenschutz + Cookie-Scan
legal{termsUrl,refundUrl,shippingUrl} · returns{method,summary,freeReturns,windowDays,software,sourceUrl,status}objAGB/Widerruf/Retoure-Seite
reviews[]{provider,rating,count,answered,url,status}arrTrustpilot · Trusted Shops · Google · Reviews.io · ProvenExpert
similarweb{globalRank,countryRank,category,monthlyVisits,avgVisitDurationSec,pagesPerVisit,bounceRatePct,topCountries[],trafficSources{},competitors[],status}objSimilarWeb public
social[]{network,url,handle,followers,posts,since,status}arrIG/FB/TikTok/YT
platforms[] · sellsToCountries[]arrWebsite / Markets / Shipping
tools{analytics[],emailMarketing[],reviews[],consent[],cdp[],other[]}objCookies / Tracker / Datenschutz
traffic{monthlyVisitsEst,...} · revenue{annualEst*,method,confidence}objSimilarWeb / Modell / Public Reports
ads{google,meta,tiktok}obj→ AdvertiserRecord
dataSources[]{field,url,status,checkedAt} · linkCheck{checked,live,dead}arr/objProvenienz + Liveness

AdvertiserRecord & AdRecord — Ads-DB

AdvertiserRecord

shopId → ShopRecord.id · ads[] → AdRecord
FeldQuelle
meta{pageUrl,about{pageCreated,managedBy,hqLocation,managerCountries[],igFollowers,fbFollowers},adLibraryUrl,activeAdsCount,countStatus}Meta Ad Library + Page Transparency
google{advertiserId,transparencyUrl,activeAdsCount,countStatus}Google Ads Transparency (region=anywhere)
ads[] → AdRecordHeadless-Intercept

AdRecord

FeldQuelle
platform, creativeId/archiveId, advertiserIdRPC / GraphQL Intercept
creativeType(text|image|video), content{h1,h2,h3,primaryText,cta}, promotes, formatCreative-Parse (next)
firstSeen, lastSeen, durationDays, region, mediaUrl, landingUrlTransparency-Detail
timeWindows{today,yesterday,last7d,last30d}, source{url,status}, creativeSourceLauf-Metadaten

Muster-Record (nackt)

lädt…