Practiqe Studykai Studying in Spain Startup Academy
Airtable: not connected Metricool: not connected HubSpot: not connected
Home

Aventa Ops Console

Live status across the Aventa Brain, Metricool, HubSpot, and content pipeline. Connect your tokens in the Connections group, then refresh — nothing on this page is fixed data.

No live data yet

Head to Connections, check your tokens, then hit Refresh all data. Every tab updates from there.

Overview

Posting runway

How many days ahead each brand is actually scheduled, computed from the Metricool log's future "Scheduled" rows. Zero means there is nothing queued past today for that brand — the riskiest state.

Not connected

Connect Airtable (Metricool log) to see this live.

Overview

Partners & team

Manually editable — nothing here pulls from an API. Pre-filled from Sly's Obsidian vault notes. Every cell below edits in place: type directly into Name/Company/Role/Notes, pick a Category from the dropdown, and flip the Active toggle. "Left for good" is separate from Active — it's about whether an inactive person is gone permanently (finished their masters, study-abroad term ended, not coming back) versus just temporarily away and could still return (e.g. between semesters). An "Export as Airtable-ready CSV" button is at the bottom since writing a brand-new table into Airtable needs a write-scoped token this console doesn't have by default.

NameCompany / BrandRoleCategoryActiveLeft for goodNotes
Social Media

Posting trend

Mix and match brands, platforms, and a time frame. Built from the Metricool log in Airtable by default; connected Metricool brands are used where live data succeeded.

Brands
Platforms
Time frame
to
 

Not connected

Connect Airtable (Metricool log table) to see this live.

Social Media

Content calendar

Every post the Metricool log shows as "Scheduled" from today forward, in date order.

Not connected

Connect Airtable (Metricool log) to see this live.

Social Media

Content ideas still alive in Metricool

Posts logged as "Scheduled" whose date has already passed without publishing — drafted, never rejected, just stalled — plus anything in a connected BBS content pillars table. Each one gets a short ID you can hand to the Post Generator to draft off of.

Not connected

Connect Airtable (Metricool log table) to see this live.

✨ Generate more content ideas

Uses the same AI provider & key configured in the Post Generator tab. Rate each result — "Mark as bad" writes a flagged note back into the Metricool Airtable log (best-effort; needs a write-capable token) so bad prompts don't get reused blindly.

Brand (select one or more)
Platform (select one or more)
Describe what kind of content you want
Social Media

Instagram & TikTok performance

Honest limitation up front: neither platform offers a public, no-auth way to read someone else's full post history from a browser. TikTok's oEmbed works with no login for a single video link. Instagram needs a Meta Graph API token tied to a Business/Creator account. Below that, use the table to log stats by hand — it's real, it's just manual until those are connected.

Embed a TikTok video (real, no login needed)

TikTok's public oEmbed endpoint works straight from the browser. Paste a video URL:

Instagram Graph API (optional)

If BBS/Studykai's Instagram is a Business or Creator account connected to a Facebook Page, a Graph API token can pull real recent-post stats. Long-lived tokens are generated in Meta's Graph API Explorer / a Facebook App.

Logged posts

BrandPlatformDateCaptionLikesCommentsSharesLink
Social Media

Website growth

Honest limitation: search ranking and traffic data lives behind authenticated APIs (Google Search Console, GA4, SEMrush/Ahrefs) that need OAuth or a paid key — none of that is connected here. This page gives you a place to log the numbers by hand each month, plus an optional field if you have a rank-tracking API key.

Optional: rank-tracking API

Generic field for any REST-based rank/traffic API you already pay for (SEMrush, Ahrefs, SerpApi, etc.). Attempted live; most of these block direct browser calls too, so expect the same honest fallback as Metricool/HubSpot if it fails.

📍 Google Business Profile (optional, per location)

Not set up yet — the Brain has "Google Business Profile build-out: Studykai (activate existing), Startup Academy (create new)" on the To Do list, so this is here for when that's done. Needs an OAuth access token (Google's Business Profile APIs don't take a plain API key) — generate one via Google's OAuth 2.0 Playground or a small script authorized for the business.manage scope, plus the location's resource ID (looks like locations/1234567890, found in Business Profile Manager settings). One row per brand/location. Direct browser calls are very likely to hit CORS, same honest fallback as everything else on this page — paste the API Proxy URL on the Connections tab to route this through the proxy too.

🕸️ Internal link health (Internal Link Graph Auditor)

This is real, not manual: it's the output of the internal_link_graph.py scraper (in the Obsidian vault's Skills folder) that crawls a site's sitemap, reads every article's body content, and checks whether the freelancer-written articles actually hyperlink to each other. Run it locally (python internal_link_graph.py --site bbs), then drop the resulting graph.json here — no API, no token, no CORS involved, since the crawl already happened offline.

Monthly numbers (logged by hand)

SiteMonthOrganic visitsAvg. positionIndexed pagesNotes
Outreach

Inbox

Recent conversation threads across both connected HubSpot accounts — most recent first, with read/unread and replied/not-replied status where HubSpot exposes it.

Not connected

Add HubSpot tokens in Connections → HubSpot.

Outreach

Email templates

Marketing email performance from HubSpot — sends, opens, clicks — per template, across both connected accounts.

Not connected

Add HubSpot tokens in Connections → HubSpot.

Tasks

Overdue tasks

Every open item in the Brain whose own due date has already passed. This page goes green the day that list is empty.

Not connected

Connect Airtable to see this live.

Tasks

Upcoming — top 7

Sorted by due date first, then by how recently the item was touched in the Brain.

Not connected

Connect Airtable to see this live.

Tasks

Brain: tasks marked complete

Tally from the "Completed Actions" tab of the Brain.

Not connected

Connect Airtable to see this live.

Tasks

Priority matrix

Not a vibe — a formula. Every item gets an urgency score and an importance score; the quadrant is just where those two numbers land.

Urgency — overdue items score 50 + days overdue (capped at 100). Items due in the future score 50 − days until due (floors at 0). Items with no date score a flat 10.
Importance — base score by Brain tab: Bottlenecks=90, Outreach & Relationships=70, To Do List=60, Claude Recommends=50. +15 if the title/notes mention money, payment, contract, or accreditation. +10 if owned by Jes specifically.
Quadrant — urgency ≥ 50 and importance ≥ 65 → Do now. Importance ≥ 65 and urgency < 50 → Schedule it. Urgency ≥ 50 and importance < 65 → Delegate. Otherwise → Batch for later.

Not connected

Connect Airtable to see this live.

Tasks

Notes & quick to-do

A scratchpad, not the Brain. Overdue/Upcoming/Completed/Priority Matrix are a live read-only mirror of the Aventa Brain Airtable — this page is the opposite: fast, local, and never synced to Airtable automatically. Jot something here mid-conversation, then copy the ones worth keeping into Airtable yourself (or ask Claude to propose the write, per the Chief of Staff rule that nothing gets written to the Brain without confirmation). Saved to this browser only.

    AI

    Generate the missing posts

    Pick an AI provider and paste its key below — this runs as a standalone page outside claude.ai now, so it needs a real key to call any model. Drafts only, nothing auto-publishes to Metricool.

    AI Provider
    ClaudeAnthropic
    ChatGPTOpenAI
    GeminiGoogle
    DeepSeekDeepSeek
    OtherQwen / Kimi / GLM / custom
    Anthropic API Key (leave blank to try this session's built-in Claude access)

    Anthropic supports direct-from-browser calls with a key. Most other providers block browser calls (CORS) by design — if a call fails here, that's almost always why, and the status line below will say so plainly.

    Brand (select one or more)
    Platform (select one or more)
    Base on content idea (optional)
    IDs come from the Content Ideas page.
    Additional context / manual input (optional)
    Posts per brand × platform combination
    e.g. 2 brands × 2 platforms × 2 posts = 8 drafts
    Connections

    Airtable & Metricool

    Tokens below are pre-filled with the ones you gave me so this works the moment you open it. That also means this file contains live credentials — treat it like a password, don't post it publicly. Rotate at airtable.com/create/tokens or in Metricool if it ever leaks. Any edit you make below is saved automatically to this browser (localStorage), so it survives a reload — it's per-browser/per-device, not synced anywhere else, and a different computer or a private/incognito window still sees the hardcoded defaults.

    Checking saved settings…

    🔌 API Proxy (fixes Metricool + HubSpot CORS)

    Metricool and HubSpot block direct browser calls (CORS) — that's why those two show "blocked by CORS" below. Deploy the small proxy in proxy/README.md and paste its URL here to make those two work live. Leave blank to keep the current (CORS-blocked) behavior — nothing else changes. Airtable is unaffected; it already allows direct browser calls.

    ⚡ Zapier / Make (optional automation webhook)

    Not set up yet — this is just a place to plug it in once it exists. Paste a Zapier "Catch Hook" or Make "Custom webhook" URL here and this console can push a summary of what it just read (overdue count, upcoming count, stalled content ideas, completions this week) into a Zap/Scenario — e.g. to post a daily digest to Slack, or to kick off the Metricool ↔ Google Search Console sync the Brain has flagged as a to-do. Nothing fires automatically; both buttons below are manual so you don't burn Zap/Make run quota on every page load.

    🗂 Airtable — connect as many tables as you need

    Each row is its own token + base + table. Tell the console what each table is so it knows how to read it.

    📣 Metricool — track as many brands/platforms as you need

    One API token, many tracked brands. If a row fails to connect it's very likely CORS — Trend/Content Ideas fall back to the Airtable log for that brand.

    Connections

    HubSpot

    Two accounts, kept separate — Jes's and yours. HubSpot's API is built for server-side use, so a direct browser call is very likely to hit CORS; if it does, this page says so plainly instead of pretending it worked.

    About the "NetworkError" / CORS failures — this isn't a bug in this page's code. Browsers block a webpage from calling most third-party APIs directly unless that API explicitly opts in (sends an "Access-Control-Allow-Origin" header). HubSpot's API doesn't opt in — by design, since it's meant to be called from a server, not a page anyone could open. The fix: a small server-side proxy (included alongside this file, in proxy/) that calls HubSpot normally (no browser restriction applies server-to-server) — this page calls the proxy instead. Deploy it once (see proxy/README.md, ~5 minutes on Cloudflare's free tier) and paste its URL into the API Proxy URL field on the Airtable & Metricool connections tab. Same fix covers Metricool.
    Scopes this console actually needs — for the Inbox tab: conversations.read. For Email Templates: marketing-email. That's it for what's built today. Optional but useful if you want contact names attached to threads later: crm.objects.contacts.read. You do not need conversations.write or any crm.objects.*.write scope — this console only reads, it never sends or modifies anything in HubSpot. When in doubt, grant the fewest scopes that make the app work; you can always add more later without recreating the app.