- Broaden Airtable lead counting to attr_utm_source IN ('Lead ads','landingpage')
— the 'landingpage' leads (100% fbclid, 0% gclid) were being missed entirely,
undercounting real leads for '_web' suffixed campaigns and skewing
capping/pacing decisions since yesterday's first production run.
- Add airtable_client.get_meta_leads_bulk() for day/curso-level aggregation.
- Drop per-familia Slack sectioning in favor of a single Formación block,
chunked by campaign batches instead.
- Add daily AT-vs-Meta table, per-curso PPL/CPL contrast table (leadform vs
landing breakdown), and a Claude-generated portfolio strategic diagnosis
(ported from leads-optimizer's portfolio_daily_analysis).
- Persist daily aggregate totals to a new Baserow table (daily_metrics) so
the dashboard and future reports don't depend on Meta's historical API
access remaining available indefinitely.
- Surface adset/ad-level recommendations in the campaign cards instead of
only numeric tables.
44 lines
1.6 KiB
Python
44 lines
1.6 KiB
Python
import os
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
# Meta Ads
|
|
META_APP_ID = os.environ["META_APP_ID"]
|
|
META_APP_SECRET = os.environ["META_APP_SECRET"]
|
|
META_ACCESS_TOKEN = os.environ["META_ACCESS_TOKEN"]
|
|
META_AD_ACCOUNT_ID = os.environ["META_AD_ACCOUNT_ID"]
|
|
|
|
# Anthropic
|
|
ANTHROPIC_API_KEY = os.environ["ANTHROPIC_API_KEY"]
|
|
|
|
# Baserow (self-hosted) — solo lo operativo de Meta (snapshots, acciones, creatividades, logs)
|
|
BASEROW_URL = os.environ["BASEROW_URL"]
|
|
BASEROW_TOKEN = os.environ["BASEROW_TOKEN"]
|
|
|
|
BASEROW_TABLE_ACTIONS = int(os.environ["BASEROW_TABLE_ACTIONS"])
|
|
BASEROW_TABLE_CREATIVES = int(os.environ["BASEROW_TABLE_CREATIVES"])
|
|
BASEROW_TABLE_LOGS = int(os.environ["BASEROW_TABLE_LOGS"])
|
|
BASEROW_TABLE_SNAPSHOTS = int(os.environ["BASEROW_TABLE_SNAPSHOTS"])
|
|
BASEROW_TABLE_DAILY_METRICS = int(os.environ["BASEROW_TABLE_DAILY_METRICS"])
|
|
|
|
# Airtable (misma base que leads-optimizer) — negocio: PPL, capping, Cursos, Familias
|
|
AIRTABLE_TOKEN = os.environ["AIRTABLE_TOKEN"]
|
|
AIRTABLE_BASE_ID = os.environ["AIRTABLE_BASE_ID"]
|
|
|
|
LEADS_TABLE = "Leads Lake"
|
|
CURSOS_TABLE = "Cursos"
|
|
CENTROCURSO_TABLE = "CentroCurso"
|
|
CURSOMES_TABLE = "CursoMes"
|
|
META_CAMPAIGNS_TABLE = "Meta Ads Campaigns"
|
|
META_CAMPAIGNMES_TABLE = "MetaCampaignMes"
|
|
|
|
# Slack (Bot Token, no webhook) — canal dedicado a Formación
|
|
SLACK_BOT_TOKEN = os.environ["SLACK_BOT_TOKEN"]
|
|
SLACK_SIGNING_SECRET = os.environ["SLACK_SIGNING_SECRET"]
|
|
SLACK_CHANNEL_ID = os.environ["SLACK_CHANNEL_ID"]
|
|
|
|
# Configuración
|
|
META_CAMPAIGN_PREFIX = os.environ.get("META_CAMPAIGN_PREFIX", "RoiFormacion")
|
|
DRY_RUN = os.environ.get("DRY_RUN", "true").lower() != "false"
|