Major Features: - Complete Ferrero ↔ CreativeX mapping system with 93 brands - Automated Box.com folder monitoring service - Email notifications with score breakdowns - Database integration for result storage Mapping System (v2.0.0): - mappings.json: 93 brand mappings, 44+ channel mappings - core/mapping_resolver.py: Translates Ferrero codes to CreativeX format - scripts/validate_mappings.py: Validation tool for brand/channel support - scripts/generate_brand_mappings.py: Auto-mapping tool - scripts/download_reports.py: Scorecard PDF download tool - Updated scripts/upload.py: Integrated mapping validation - Updated scripts/check_status.py: Added detailed score display with guidelines Documentation: - Updated README.md: Complete user guide with mapping system - Updated STATUS.md: Production-ready status with test results - MAPPINGS_GUIDE.md: Complete mapping documentation - MAPPING_IMPLEMENTATION.md: Implementation summary - BRAND_MAPPINGS_REVIEW.md: Brand mapping validation guide - PRODUCTION_BRANDS_SUMMARY.md: Production brand catalog - PRODUCTION_MAPPING_COMPLETE.md: Mapping completion summary Automation Service (New): - creativex-automation/: Complete automated Box monitoring service - Monitors Box Ferrero-In folder (363284027140) for new files - Automatically uploads to CreativeX - Polls for completion (30 min intervals) - Extracts scores and stores in PostgreSQL creativex_scores table - Sends formatted emails to file uploader + daveporter@oliver.agency - Moves processed files to Processed subfolder Service Components: - automation/box_monitor.py: Box folder monitoring with uploader detection - automation/upload_processor.py: CreativeX upload integration - automation/status_poller.py: CreativeX status polling - automation/result_handler.py: Score extraction and email sending - automation/orchestrator.py: Service coordination - automation/processing_queue.py: JSON-based processing queue - service.py: Main service entry point - config.py: Service configuration loader - requirements.txt: All dependencies - deployment/systemd/: Systemd service unit file - Updated shared/notifier.py: Added creativex_upload_complete and creativex_upload_failed templates Testing: - Supports --dry-run mode for configuration testing - Supports --scan-once mode for Box folder testing - Manual run mode for development/testing - Comprehensive logging with rotation (10MB, 28 backups) Database Integration: - Uses existing creativex_scores table (no migrations needed) - Compatible with existing Ferrero-Opentext workflows - Stores full CreativeX API responses in JSONB Email Templates: - Matches Ferrero-Opentext styling (#9c27b0 purple for CreativeX) - Includes score, tier, guidelines breakdown, scorecard URL - Recipients: Box uploader + CC to daveporter@oliver.agency Deployment: - Runs locally for dev/testing - Systemd service for production - Auto-restart on failure - Complete documentation in creativex-automation/README.md Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
928 lines
No EOL
27 KiB
JSON
928 lines
No EOL
27 KiB
JSON
{
|
|
"_comment": "Mapping tables between Ferrero naming conventions and Creative X API",
|
|
"_last_updated": "2026-01-22",
|
|
"brand_mappings": {
|
|
"MC": {
|
|
"creativex_name": "Mon Chéri",
|
|
"creativex_id": 13422,
|
|
"ferrero_name": "MON CHERI"
|
|
},
|
|
"PK": {
|
|
"creativex_name": "Pocket Coffee",
|
|
"creativex_id": 13420,
|
|
"ferrero_name": "POCKET COFFEE"
|
|
},
|
|
"ROC": {
|
|
"creativex_name": "Ferrero Rocher",
|
|
"creativex_id": 13415,
|
|
"ferrero_name": "ROCHER"
|
|
},
|
|
"FPR": {
|
|
"creativex_name": "Ferrero Prestige",
|
|
"creativex_id": 18679,
|
|
"ferrero_name": "FERRERO PRESTIGE"
|
|
},
|
|
"KMAX": {
|
|
"creativex_name": "Kinder Maxi",
|
|
"creativex_id": 11366,
|
|
"ferrero_name": "KINDER MAXI"
|
|
},
|
|
"KSB": {
|
|
"creativex_name": "Kinder Schoko Bons",
|
|
"creativex_id": 10758,
|
|
"ferrero_name": "SCHOKOBONS"
|
|
},
|
|
"KCH": {
|
|
"creativex_name": "Kinder Chocolate",
|
|
"creativex_id": 10435,
|
|
"ferrero_name": "KINDER CHOCOLATE"
|
|
},
|
|
"RAF": {
|
|
"creativex_name": "Raffaello",
|
|
"creativex_id": 13416,
|
|
"ferrero_name": "RAFFAELLO"
|
|
},
|
|
"DUN": {
|
|
"creativex_name": "Kinder Duplo",
|
|
"creativex_id": 11691,
|
|
"ferrero_name": "DUPLO NOCCIOLATO"
|
|
},
|
|
"TRO": {
|
|
"creativex_name": "Kinder Tronky",
|
|
"creativex_id": 11367,
|
|
"ferrero_name": "TRONKY"
|
|
},
|
|
"KCY": {
|
|
"creativex_name": "Kinder Country",
|
|
"creativex_id": 11372,
|
|
"ferrero_name": "KINDER COUNTRY"
|
|
},
|
|
"BUE": {
|
|
"creativex_name": "Kinder Bueno",
|
|
"creativex_id": 10432,
|
|
"ferrero_name": "KINDER BUENO"
|
|
},
|
|
"KSUR": {
|
|
"creativex_name": "Kinder Surprise",
|
|
"creativex_id": 10434,
|
|
"ferrero_name": "KINDER SURPRISE"
|
|
},
|
|
"KMS": {
|
|
"creativex_name": "Kinder Surprise Maxi",
|
|
"creativex_id": 11386,
|
|
"ferrero_name": "KINDER MAXI SURPRISE"
|
|
},
|
|
"KPI": {
|
|
"creativex_name": "Kinder Pingui",
|
|
"creativex_id": 10440,
|
|
"ferrero_name": "KINDER PINGUI"
|
|
},
|
|
"NUT": {
|
|
"creativex_name": "Nutella",
|
|
"creativex_id": 13411,
|
|
"ferrero_name": "NUTELLA"
|
|
},
|
|
"NUGO": {
|
|
"creativex_name": "Nutella & Go",
|
|
"creativex_id": 13412,
|
|
"ferrero_name": "NUTELLA & GO"
|
|
},
|
|
"FFIE": {
|
|
"creativex_name": "Fiesta",
|
|
"creativex_id": 11438,
|
|
"ferrero_name": "FERRERO FIESTA"
|
|
},
|
|
"KBRI": {
|
|
"creativex_name": "Kinder Brioss",
|
|
"creativex_id": 11373,
|
|
"ferrero_name": "KINDER BRIOSS"
|
|
},
|
|
"FBRI": {
|
|
"creativex_name": "Ferrero Rocher",
|
|
"creativex_id": 13415,
|
|
"ferrero_name": "FERRERO BRIOSS"
|
|
},
|
|
"KFL": {
|
|
"creativex_name": "Kinder Milk Slice",
|
|
"creativex_id": 11368,
|
|
"ferrero_name": "KINDER MILK SLICE"
|
|
},
|
|
"KCOL": {
|
|
"creativex_name": "Kinder Colazione Più",
|
|
"creativex_id": 11374,
|
|
"ferrero_name": "KINDER COLAZIONE PIU"
|
|
},
|
|
"KDEL": {
|
|
"creativex_name": "Kinder Delice",
|
|
"creativex_id": 11363,
|
|
"ferrero_name": "KINDER DELICE"
|
|
},
|
|
"KCHO": {
|
|
"creativex_name": "Kinder Choco Fresh",
|
|
"creativex_id": 10437,
|
|
"ferrero_name": "KINDER CHOCOFRESH"
|
|
},
|
|
"KHH": {
|
|
"creativex_name": "Kinder Happy Hippo",
|
|
"creativex_id": 11364,
|
|
"ferrero_name": "KINDER HAPPY HIPPO"
|
|
},
|
|
"TT": {
|
|
"creativex_name": "Tic Tac",
|
|
"creativex_id": 13425,
|
|
"ferrero_name": "TIC TAC"
|
|
},
|
|
"ET": {
|
|
"creativex_name": "Estathe",
|
|
"creativex_id": 17838,
|
|
"ferrero_name": "ESTATHE"
|
|
},
|
|
"DEL": {
|
|
"creativex_name": "Delacre",
|
|
"creativex_id": 17477,
|
|
"ferrero_name": "DELACRE"
|
|
},
|
|
"KUS": {
|
|
"creativex_name": "Ferrero Kusschen",
|
|
"creativex_id": 13421,
|
|
"ferrero_name": "KUSSCHEN"
|
|
},
|
|
"KPAR": {
|
|
"creativex_name": "Kinder Paradiso",
|
|
"creativex_id": 11371,
|
|
"ferrero_name": "KINDER PARADISO"
|
|
},
|
|
"KMKNG": {
|
|
"creativex_name": "Kinder Maxi King",
|
|
"creativex_id": 10438,
|
|
"ferrero_name": "KINDER MAXI KING"
|
|
},
|
|
"HAN": {
|
|
"creativex_name": "Hanuta",
|
|
"creativex_id": 18514,
|
|
"ferrero_name": "HANUTA"
|
|
},
|
|
"GIO": {
|
|
"creativex_name": "Giotto",
|
|
"creativex_id": 13419,
|
|
"ferrero_name": "GIOTTO"
|
|
},
|
|
"KJOY": {
|
|
"creativex_name": "Kinder Joy",
|
|
"creativex_id": 10433,
|
|
"ferrero_name": "KINDER MERENDERO/JOY"
|
|
},
|
|
"KPC": {
|
|
"creativex_name": "Kinder Pan e Cioc",
|
|
"creativex_id": 11375,
|
|
"ferrero_name": "KINDER PAN E CIOC"
|
|
},
|
|
"YOG": {
|
|
"creativex_name": "Yogurette",
|
|
"creativex_id": 13193,
|
|
"ferrero_name": "YOGURETTE"
|
|
},
|
|
"DU": {
|
|
"creativex_name": "Kinder Duplo",
|
|
"creativex_id": 11691,
|
|
"ferrero_name": "DUPLO"
|
|
},
|
|
"KSBCR": {
|
|
"creativex_name": "Kinder Crispy",
|
|
"creativex_id": 18231,
|
|
"ferrero_name": "KINDER SCHOKOBONS CRISPY"
|
|
},
|
|
"KMIX": {
|
|
"creativex_name": "Kinder Mix",
|
|
"creativex_id": 11384,
|
|
"ferrero_name": "KINDER MIX"
|
|
},
|
|
"TTCHE": {
|
|
"creativex_name": "Tic Tac Chewy",
|
|
"creativex_id": 13426,
|
|
"ferrero_name": "TIC TAC CHEWY"
|
|
},
|
|
"100GR": {
|
|
"creativex_name": "100 Grand Ice Cream",
|
|
"creativex_id": 20079,
|
|
"ferrero_name": "100 GRAND"
|
|
},
|
|
"BRUTH": {
|
|
"creativex_name": "Baby Ruth Ice Cream",
|
|
"creativex_id": 20078,
|
|
"ferrero_name": "BABY RUTH"
|
|
},
|
|
"BTF": {
|
|
"creativex_name": "Butterfinger",
|
|
"creativex_id": 19368,
|
|
"ferrero_name": "BUTTERFINGER"
|
|
},
|
|
"CRU": {
|
|
"creativex_name": "Crunch",
|
|
"creativex_id": 19369,
|
|
"ferrero_name": "CRUNCH"
|
|
},
|
|
"KPLUM": {
|
|
"creativex_name": "Kinder PlumCake",
|
|
"creativex_id": 11376,
|
|
"ferrero_name": "KINDER PLUMCAKE"
|
|
},
|
|
"TTJEL": {
|
|
"creativex_name": "Tic Tac Chewy",
|
|
"creativex_id": 13426,
|
|
"ferrero_name": "TIC TAC JELLY"
|
|
},
|
|
"KCHIC": {
|
|
"creativex_name": "Kinder Chocolate Ice Cream",
|
|
"creativex_id": 11683,
|
|
"ferrero_name": "KINDER CHOCOLATE ICE CREAM"
|
|
},
|
|
"BUEIC": {
|
|
"creativex_name": "Kinder Bueno Ice Cream",
|
|
"creativex_id": 11370,
|
|
"ferrero_name": "KINDER BUENO ICE CREAM"
|
|
},
|
|
"ROIC": {
|
|
"creativex_name": "Ferrero Rocher Ice Cream",
|
|
"creativex_id": 13256,
|
|
"ferrero_name": "FERRERO ROCHER ICE CREAM"
|
|
},
|
|
"RAFIC": {
|
|
"creativex_name": "Raffaello Ice Cream",
|
|
"creativex_id": 13257,
|
|
"ferrero_name": "RAFFAELLO ICE CREAM"
|
|
},
|
|
"ETIC": {
|
|
"creativex_name": "Estathè Ice",
|
|
"creativex_id": 13192,
|
|
"ferrero_name": "ESTATHE ICE"
|
|
},
|
|
"RDN": {
|
|
"creativex_name": "Rondnoir",
|
|
"creativex_id": 13423,
|
|
"ferrero_name": "RONDNOIR"
|
|
},
|
|
"TTSF": {
|
|
"creativex_name": "Tic Tac Fresh",
|
|
"creativex_id": 17482,
|
|
"ferrero_name": "TIC TAC CHILL/TIC TAC BREEZE"
|
|
},
|
|
"KCCK": {
|
|
"creativex_name": "Kinder Crunchy Cookie",
|
|
"creativex_id": 12652,
|
|
"ferrero_name": "KINDER CRUNCHY COOKIES"
|
|
},
|
|
"KDUO": {
|
|
"creativex_name": "Kinder Duo",
|
|
"creativex_id": 11369,
|
|
"ferrero_name": "KINDER DUO"
|
|
},
|
|
"KTRO": {
|
|
"creativex_name": "Kinder Tronky",
|
|
"creativex_id": 11367,
|
|
"ferrero_name": "KINDER TRONKY"
|
|
},
|
|
"FRO": {
|
|
"creativex_name": "Ferrero Rocher Moments",
|
|
"creativex_id": 19435,
|
|
"ferrero_name": "FERRERO ROCHER ORIGINS"
|
|
},
|
|
"KSURM": {
|
|
"creativex_name": "Kinder Surprise Maxi",
|
|
"creativex_id": 11386,
|
|
"ferrero_name": "KINDER SORPRESA MAXI"
|
|
},
|
|
"NUCOK": {
|
|
"creativex_name": "Nutella Crepes",
|
|
"creativex_id": 21760,
|
|
"ferrero_name": "NUTELLA COOKIES"
|
|
},
|
|
"RDNIC": {
|
|
"creativex_name": "Ferrero Rondnoir Ice Cream",
|
|
"creativex_id": 13190,
|
|
"ferrero_name": "RONDNOIR ICE CREAM"
|
|
},
|
|
"PKIC": {
|
|
"creativex_name": "Pocket Coffee Ice Cream",
|
|
"creativex_id": 13191,
|
|
"ferrero_name": "POCKET COFFEE ICE CREAM"
|
|
},
|
|
"YOGIC": {
|
|
"creativex_name": "Yogurette Ice Cream",
|
|
"creativex_id": 13427,
|
|
"ferrero_name": "YOGURETTE ICE CREAM"
|
|
},
|
|
"NUBR": {
|
|
"creativex_name": "Nutella B-ready",
|
|
"creativex_id": 13413,
|
|
"ferrero_name": "NUTELLA B-READY"
|
|
},
|
|
"TTTWO": {
|
|
"creativex_name": "Tic Tac Two",
|
|
"creativex_id": 18763,
|
|
"ferrero_name": "TIC TAC TWO"
|
|
},
|
|
"NUIC": {
|
|
"creativex_name": "Nutella Ice Cream",
|
|
"creativex_id": 11768,
|
|
"ferrero_name": "NUTELLA ICE CREAM"
|
|
},
|
|
"HANR": {
|
|
"creativex_name": "Hanuta Riegel",
|
|
"creativex_id": 13409,
|
|
"ferrero_name": "HANUTA RIEGEL"
|
|
},
|
|
"KCHH": {
|
|
"creativex_name": "Kinder Happy Hippo",
|
|
"creativex_id": 11364,
|
|
"ferrero_name": "KINDER CIOCCOLATO HAPPY"
|
|
},
|
|
"KTRIS": {
|
|
"creativex_name": "Kinder Trust",
|
|
"creativex_id": 18600,
|
|
"ferrero_name": "KINDER TRIS"
|
|
},
|
|
"NUCRE": {
|
|
"creativex_name": "Nutella Crepes",
|
|
"creativex_id": 21760,
|
|
"ferrero_name": "NUTELLA CREPES"
|
|
},
|
|
"NUDON": {
|
|
"creativex_name": "Nutella Donut",
|
|
"creativex_id": 18021,
|
|
"ferrero_name": "NUTELLA DONUT"
|
|
},
|
|
"GFRO": {
|
|
"creativex_name": "Ferrero Rocher",
|
|
"creativex_id": 13415,
|
|
"ferrero_name": "GRAND FERRERO ROCHER"
|
|
},
|
|
"TROSN": {
|
|
"creativex_name": "Kinder Tronky Sandwich",
|
|
"creativex_id": 13410,
|
|
"ferrero_name": "TRONKY SANDWICH"
|
|
},
|
|
"KCRO": {
|
|
"creativex_name": "Kinder Crispy",
|
|
"creativex_id": 18231,
|
|
"ferrero_name": "KINDER CROISSANT"
|
|
},
|
|
"NUCRO": {
|
|
"creativex_name": "Nutella Croissant",
|
|
"creativex_id": 17839,
|
|
"ferrero_name": "NUTELLA CROISSANT"
|
|
},
|
|
"RABIS": {
|
|
"creativex_name": "Nutella Biscuits",
|
|
"creativex_id": 13414,
|
|
"ferrero_name": "RAFFAELLO BISCUITS"
|
|
},
|
|
"KCYB": {
|
|
"creativex_name": "Kinder Country",
|
|
"creativex_id": 11372,
|
|
"ferrero_name": "KINDER COUNTRY BISCUIT"
|
|
},
|
|
"KCARD": {
|
|
"creativex_name": "Kinder Cards",
|
|
"creativex_id": 11361,
|
|
"ferrero_name": "KINDER CARDS"
|
|
},
|
|
"KHMO": {
|
|
"creativex_name": "Kinder Happy Moments",
|
|
"creativex_id": 11380,
|
|
"ferrero_name": "KINDER HAPPY MOMENTS"
|
|
},
|
|
"KKIND": {
|
|
"creativex_name": "Kinder Kinderini",
|
|
"creativex_id": 11379,
|
|
"ferrero_name": "KINDER KINDERINI"
|
|
},
|
|
"KKOR": {
|
|
"creativex_name": "Kinder Kornetti",
|
|
"creativex_id": 11377,
|
|
"ferrero_name": "KINDER KORNETTI"
|
|
},
|
|
"THO": {
|
|
"creativex_name": "Thorntons",
|
|
"creativex_id": 18599,
|
|
"ferrero_name": "THORNTONS"
|
|
},
|
|
"DDCH": {
|
|
"creativex_name": "DeliChoc",
|
|
"creativex_id": 17479,
|
|
"ferrero_name": "DELACRE DELICHOC"
|
|
},
|
|
"KCRE": {
|
|
"creativex_name": "Kinder Creamy",
|
|
"creativex_id": 11362,
|
|
"ferrero_name": "KINDER CREAMY"
|
|
},
|
|
"NUBIS": {
|
|
"creativex_name": "Nutella Biscuits",
|
|
"creativex_id": 13414,
|
|
"ferrero_name": "NUTELLA BISCUITS"
|
|
},
|
|
"ROMO": {
|
|
"creativex_name": "Ferrero Rocher Moments",
|
|
"creativex_id": 19435,
|
|
"ferrero_name": "FERRERO ROCHER MOMENTS"
|
|
},
|
|
"KCLA": {
|
|
"creativex_name": "Kinder Coeur au lait",
|
|
"creativex_id": 22075,
|
|
"ferrero_name": "KINDER COEUR AU LAIT"
|
|
},
|
|
"FULF": {
|
|
"creativex_name": "Fulfil",
|
|
"creativex_id": 12981,
|
|
"ferrero_name": "FF ENERGY BA"
|
|
},
|
|
"KFIG": {
|
|
"creativex_name": "Kinder Pingui",
|
|
"creativex_id": 10440,
|
|
"ferrero_name": "KINDER FIGURE"
|
|
},
|
|
"KCER": {
|
|
"creativex_name": "Kinder Cereale",
|
|
"creativex_id": 13428,
|
|
"ferrero_name": "KINDER CEREALE"
|
|
},
|
|
"FOX": {
|
|
"creativex_name": "Fox's Biscuits",
|
|
"creativex_id": 19424,
|
|
"ferrero_name": "FOX"
|
|
},
|
|
"EATN": {
|
|
"creativex_name": "Eat Natural",
|
|
"creativex_id": 12980,
|
|
"ferrero_name": "EAT NATURAL"
|
|
},
|
|
"FCIC": {
|
|
"creativex_name": "Ferrero Rocher Triple Experience Ice Cream",
|
|
"creativex_id": 13188,
|
|
"ferrero_name": "FERRERO COLLECTION EXPERIENCE ICE CREAM"
|
|
},
|
|
"RAFTE": {
|
|
"creativex_name": "Raffaello Triple Experience Ice Cream",
|
|
"creativex_id": 13189,
|
|
"ferrero_name": "RAFFAELLO TRIPLE EXPERIENCE ICE CREAM"
|
|
}
|
|
},
|
|
"channel_mappings": {
|
|
"_comment": "Maps Ferrero social media codes to Creative X channel + placement",
|
|
"_structure": "Each mapping includes: channel (required), publisher (optional), placement (optional)",
|
|
"FACEBOOK_CODES": {
|
|
"FBD": {
|
|
"ferrero_name": "FB - Biz Disco Feed",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "biz_disco_feed"
|
|
},
|
|
"FGF": {
|
|
"ferrero_name": "FB - Groups Feed",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "facebook_groups_feed"
|
|
},
|
|
"FBR": {
|
|
"ferrero_name": "FB - Reels",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "facebook_reels"
|
|
},
|
|
"FRO": {
|
|
"ferrero_name": "FB - Reels Overlay",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "facebook_reels_overlay"
|
|
},
|
|
"FBS": {
|
|
"ferrero_name": "FB - Stories",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "facebook_stories"
|
|
},
|
|
"FBF": {
|
|
"ferrero_name": "FB - Feed",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "feed"
|
|
},
|
|
"FIA": {
|
|
"ferrero_name": "FB - Instant Article",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "instant_article"
|
|
},
|
|
"FIV": {
|
|
"ferrero_name": "FB - Instream Video",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "instream_video"
|
|
},
|
|
"FMP": {
|
|
"ferrero_name": "FB - Marketplace",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "marketplace"
|
|
},
|
|
"FPF": {
|
|
"ferrero_name": "FB - Profile Feed",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "facebook_profile_feed"
|
|
},
|
|
"FRC": {
|
|
"ferrero_name": "FB - Right Hand Column",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "right_hand_column"
|
|
},
|
|
"FSE": {
|
|
"ferrero_name": "FB - Search",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "search"
|
|
},
|
|
"FSS": {
|
|
"ferrero_name": "FB - Search Serp",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "search_serp"
|
|
},
|
|
"FSV": {
|
|
"ferrero_name": "FB - Suggested Video",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "suggested_video"
|
|
},
|
|
"FUK": {
|
|
"ferrero_name": "FB - Unknown",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "unknown"
|
|
},
|
|
"FVF": {
|
|
"ferrero_name": "FB - Video Feeds",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "facebook",
|
|
"creativex_placement": "video_feeds"
|
|
}
|
|
},
|
|
"AUDIENCE_NETWORK_CODES": {
|
|
"ANC": {
|
|
"ferrero_name": "Audience Network - An Classic",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "audience_network",
|
|
"creativex_placement": "an_classic"
|
|
},
|
|
"ANI": {
|
|
"ferrero_name": "Audience Network - Instream Video",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "audience_network",
|
|
"creativex_placement": "instream_video"
|
|
},
|
|
"ANR": {
|
|
"ferrero_name": "Audience Network - Rewarded Video",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "audience_network",
|
|
"creativex_placement": "rewarded_video"
|
|
}
|
|
},
|
|
"MESSENGER_CODES": {
|
|
"MSI": {
|
|
"ferrero_name": "Messenger - Inbox",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "messenger",
|
|
"creativex_placement": "messenger_inbox"
|
|
},
|
|
"MSS": {
|
|
"ferrero_name": "Messenger - Stories",
|
|
"creativex_channel": "facebook_paid",
|
|
"creativex_publisher": "messenger",
|
|
"creativex_placement": "messenger_stories"
|
|
}
|
|
},
|
|
"INSTAGRAM_CODES": {
|
|
"IGF": {
|
|
"ferrero_name": "IG - Feed",
|
|
"creativex_channel": "instagram_paid",
|
|
"creativex_publisher": "instagram",
|
|
"creativex_placement": "feed"
|
|
},
|
|
"IGE": {
|
|
"ferrero_name": "IG - Explore",
|
|
"creativex_channel": "instagram_paid",
|
|
"creativex_publisher": "instagram",
|
|
"creativex_placement": "instagram_explore"
|
|
},
|
|
"IGG": {
|
|
"ferrero_name": "IG - Explore Grid Home",
|
|
"creativex_channel": "instagram_paid",
|
|
"creativex_publisher": "instagram",
|
|
"creativex_placement": "instagram_explore_grid_home"
|
|
},
|
|
"IGT": {
|
|
"ferrero_name": "IG - IGTV",
|
|
"creativex_channel": "instagram_paid",
|
|
"creativex_publisher": "instagram",
|
|
"creativex_placement": "instagram_igtv"
|
|
},
|
|
"IPF": {
|
|
"ferrero_name": "IG - Profile Feed",
|
|
"creativex_channel": "instagram_paid",
|
|
"creativex_publisher": "instagram",
|
|
"creativex_placement": "instagram_profile_feed"
|
|
},
|
|
"IPR": {
|
|
"ferrero_name": "IG - Profile Reels",
|
|
"creativex_channel": "instagram_paid",
|
|
"creativex_publisher": "instagram",
|
|
"creativex_placement": "instagram_profile_reels"
|
|
},
|
|
"IGR": {
|
|
"ferrero_name": "IG - Reels",
|
|
"creativex_channel": "instagram_paid",
|
|
"creativex_publisher": "instagram",
|
|
"creativex_placement": "instagram_reels"
|
|
},
|
|
"IGO": {
|
|
"ferrero_name": "IG - Overlay",
|
|
"creativex_channel": "instagram_paid",
|
|
"creativex_publisher": "instagram",
|
|
"creativex_placement": "instagram_reels_overlay"
|
|
},
|
|
"IGS": {
|
|
"ferrero_name": "IG - Search",
|
|
"creativex_channel": "instagram_paid",
|
|
"creativex_publisher": "instagram",
|
|
"creativex_placement": "instagram_search"
|
|
},
|
|
"ISH": {
|
|
"ferrero_name": "IG - Shop",
|
|
"creativex_channel": "instagram_paid",
|
|
"creativex_publisher": "instagram",
|
|
"creativex_placement": "instagram_shop"
|
|
},
|
|
"IST": {
|
|
"ferrero_name": "IG - Stories",
|
|
"creativex_channel": "instagram_paid",
|
|
"creativex_publisher": "instagram",
|
|
"creativex_placement": "instagram_stories"
|
|
}
|
|
},
|
|
"YOUTUBE_GOOGLE_ADS_CODES": {
|
|
"YTB": {
|
|
"ferrero_name": "YT - Youtube Bumper",
|
|
"creativex_channel": "google_ads",
|
|
"creativex_publisher": "youtube",
|
|
"creativex_ad_format": "Bumper"
|
|
},
|
|
"YTI": {
|
|
"ferrero_name": "YT - Youtube Instream",
|
|
"creativex_channel": "google_ads",
|
|
"creativex_publisher": "youtube",
|
|
"creativex_ad_format": "Skippable In-Stream",
|
|
"_note": "Could also be 'Non-Skippable In-Stream' - may need to determine based on duration"
|
|
},
|
|
"YTS": {
|
|
"ferrero_name": "YT - Youtube Shorts",
|
|
"creativex_channel": "google_ads",
|
|
"creativex_publisher": "youtube",
|
|
"creativex_ad_format": "Shorts"
|
|
},
|
|
"YTT": {
|
|
"ferrero_name": "YT - Youtube Trueview",
|
|
"creativex_channel": "google_ads",
|
|
"creativex_publisher": "youtube",
|
|
"creativex_ad_format": "In-Feed Video"
|
|
},
|
|
"YTA": {
|
|
"ferrero_name": "YT - Youtube Ad",
|
|
"creativex_channel": "google_ads",
|
|
"creativex_publisher": "youtube",
|
|
"creativex_ad_format": "Video Responsive Ad"
|
|
}
|
|
},
|
|
"DV360_CODES": {
|
|
"DV3": {
|
|
"ferrero_name": "DV360",
|
|
"creativex_channel": "dv360",
|
|
"creativex_publisher": "youtube",
|
|
"creativex_ad_format": "Skippable In-Stream",
|
|
"_note": "Default mapping - may need ad_format specified based on creative type"
|
|
}
|
|
},
|
|
"TIKTOK_CODES": {
|
|
"TIK": {
|
|
"ferrero_name": "TikTok",
|
|
"creativex_channel": "tiktok_paid"
|
|
}
|
|
},
|
|
"SNAPCHAT_CODES": {
|
|
"SNA": {
|
|
"ferrero_name": "Snap",
|
|
"creativex_channel": "snapchat_paid"
|
|
}
|
|
},
|
|
"PINTEREST_CODES": {
|
|
"PIN": {
|
|
"ferrero_name": "Pinterest",
|
|
"creativex_channel": "pinterest"
|
|
}
|
|
},
|
|
"TWITTER_CODES": {
|
|
"TWI": {
|
|
"ferrero_name": "Twitter",
|
|
"creativex_channel": "twitter_paid"
|
|
}
|
|
},
|
|
"AMAZON_CODES": {
|
|
"AMZ": {
|
|
"ferrero_name": "Amazon",
|
|
"creativex_channel": "amazon_paid"
|
|
}
|
|
},
|
|
"GOOGLE_CODES": {
|
|
"GOO": {
|
|
"ferrero_name": "Google",
|
|
"creativex_channel": "google_ads",
|
|
"_note": "Generic Google - may need to specify publisher/ad_format based on creative"
|
|
}
|
|
}
|
|
},
|
|
"country_mappings": {
|
|
"_comment": "Country codes mostly match ISO 3166-1, but noting exceptions",
|
|
"_note": "Most Ferrero country codes are standard ISO codes and map directly to Creative X markets",
|
|
"SPECIAL_CASES": {
|
|
"GL": {
|
|
"ferrero_name": "GLOBAL",
|
|
"creativex_name": "Global",
|
|
"creativex_iso_code": null,
|
|
"_note": "GL in Ferrero = Global, but GL is also Greenland in ISO. Creative X has both 'Global' (no code) and 'Greenland' (GL)"
|
|
},
|
|
"GB": {
|
|
"ferrero_name": "United Kingdom",
|
|
"creativex_name": "United Kingdom",
|
|
"creativex_iso_code": "GB",
|
|
"_note": "UK is sometimes used colloquially but GB is the official ISO code"
|
|
},
|
|
"US": {
|
|
"ferrero_name": "United States",
|
|
"creativex_name": "United States of America",
|
|
"creativex_iso_code": "US"
|
|
},
|
|
"KR": {
|
|
"ferrero_name": "South Korea",
|
|
"creativex_name": "South Korea",
|
|
"creativex_iso_code": "KR"
|
|
},
|
|
"TW": {
|
|
"ferrero_name": "Taiwan",
|
|
"creativex_name": "Taiwan, Province of China",
|
|
"creativex_iso_code": "TW"
|
|
},
|
|
"CZ": {
|
|
"ferrero_name": "Czech Republic",
|
|
"creativex_name": "Czechia",
|
|
"creativex_iso_code": "CZ"
|
|
},
|
|
"SZ": {
|
|
"ferrero_name": "Eswatini",
|
|
"creativex_name": "Eswatini",
|
|
"creativex_iso_code": "SZ",
|
|
"_note": "Formerly Swaziland"
|
|
},
|
|
"VA": {
|
|
"ferrero_name": "Vatican City",
|
|
"creativex_name": "Holy See",
|
|
"creativex_iso_code": "VA"
|
|
},
|
|
"CD": {
|
|
"ferrero_name": "Congo (DRC)",
|
|
"creativex_name": "Congo (Democratic Republic of the)",
|
|
"creativex_iso_code": "CD"
|
|
},
|
|
"CG": {
|
|
"ferrero_name": "Congo (Republic)",
|
|
"creativex_name": "Congo",
|
|
"creativex_iso_code": "CG"
|
|
},
|
|
"XK": {
|
|
"ferrero_name": "Kosovo",
|
|
"creativex_name": "Kosovo",
|
|
"creativex_iso_code": "XK",
|
|
"_note": "User-assigned code, not official ISO"
|
|
}
|
|
},
|
|
"VERIFICATION_NOTES": [
|
|
"Most countries map 1:1 via ISO 3166-1 alpha-2 codes",
|
|
"Creative X has 252 markets in their system",
|
|
"Ferrero data.json has 202 countries defined",
|
|
"The main issue is GL (GLOBAL vs Greenland) which needs context-based handling"
|
|
]
|
|
},
|
|
"reverse_lookups": {
|
|
"_comment": "Helper mappings for reverse lookups from Creative X to Ferrero",
|
|
"creativex_brand_to_ferrero": {
|
|
"Nutella": "NUT",
|
|
"Rafalleo": "RAF"
|
|
},
|
|
"creativex_channel_to_ferrero_codes": {
|
|
"facebook_paid": [
|
|
"FBD",
|
|
"FGF",
|
|
"FBR",
|
|
"FRO",
|
|
"FBS",
|
|
"FBF",
|
|
"FIA",
|
|
"FIV",
|
|
"FMP",
|
|
"FPF",
|
|
"FRC",
|
|
"FSE",
|
|
"FSS",
|
|
"FSV",
|
|
"FUK",
|
|
"FVF",
|
|
"ANC",
|
|
"ANI",
|
|
"ANR",
|
|
"MSI",
|
|
"MSS"
|
|
],
|
|
"instagram_paid": [
|
|
"IGF",
|
|
"IGE",
|
|
"IGG",
|
|
"IGT",
|
|
"IPF",
|
|
"IPR",
|
|
"IGR",
|
|
"IGO",
|
|
"IGS",
|
|
"ISH",
|
|
"IST"
|
|
],
|
|
"google_ads": [
|
|
"YTB",
|
|
"YTI",
|
|
"YTS",
|
|
"YTT",
|
|
"YTA",
|
|
"GOO"
|
|
],
|
|
"dv360": [
|
|
"DV3"
|
|
],
|
|
"tiktok_paid": [
|
|
"TIK"
|
|
],
|
|
"snapchat_paid": [
|
|
"SNA"
|
|
],
|
|
"pinterest": [
|
|
"PIN"
|
|
],
|
|
"twitter_paid": [
|
|
"TWI"
|
|
],
|
|
"amazon_paid": [
|
|
"AMZ"
|
|
]
|
|
}
|
|
},
|
|
"validation_rules": {
|
|
"_comment": "Rules for mapping and validation",
|
|
"brand_mapping": {
|
|
"rule": "If Ferrero brand code exists in brand_mappings, use creativex_name; otherwise upload will fail",
|
|
"missing_brands": "All Ferrero brands except NUT and RAF are not yet in Creative X system"
|
|
},
|
|
"channel_mapping": {
|
|
"rule": "Map Ferrero social media code to Creative X channel + optional publisher/placement",
|
|
"facebook_instagram_needs": "Requires channel, publisher, and placement",
|
|
"youtube_needs": "Requires channel, publisher, and ad_format",
|
|
"simple_channels": "tiktok_paid, snapchat_paid, pinterest, twitter_paid, amazon_paid only need channel"
|
|
},
|
|
"country_mapping": {
|
|
"rule": "Always use full market name (e.g., 'Germany' not 'DE'). API requires market_name field.",
|
|
"gl_handling": "If country_code == 'GL' in Ferrero, send market_name='Global'"
|
|
}
|
|
},
|
|
"upload_payload_structure": {
|
|
"_comment": "Reference for how to construct Creative X preflight payload using mappings",
|
|
"example": {
|
|
"brand_name": "<<from brand_mappings[ferrero_brand_code].creativex_name>>",
|
|
"market_name": "<<from ferrero country_name field (e.g., 'Germany', 'Italy', 'Global')>>",
|
|
"channel": "<<from channel_mappings[ferrero_social_code].creativex_channel>>",
|
|
"publisher": "<<from channel_mappings[ferrero_social_code].creativex_publisher (optional)>>",
|
|
"placement": "<<from channel_mappings[ferrero_social_code].creativex_placement (optional)>>",
|
|
"ad_format": "<<from channel_mappings[ferrero_social_code].creativex_ad_format (optional)>>",
|
|
"language": "<<from ferrero language_code, lowercase>>",
|
|
"dimensions": "<<from ferrero aspect_ratio, e.g., '16x9', '1x1'>>",
|
|
"duration": "<<from ferrero seconds, e.g., '6', '20'>>",
|
|
"subject": "<<from ferrero subject_title>>"
|
|
}
|
|
}
|
|
} |