santifer/career-ops · error · Error
No "Applications" database found under the Career Ops page —
Error message
No "Applications" database found under the Career Ops page — create it and share the integration with it.
What it means
After resolving all child databases under the parent page, the notion plugin looks specifically for one named 'Applications'. If none is found (dbs['Applications'] is undefined), it throws with instructions to create it and share it with the integration. This is a setup-completeness guard, not a runtime failure.
Source
Thrown at plugins/notion/index.mjs:37
// internal integration. Enable in config/plugins.yml; keys in .env.
//
// node plugins.mjs run notion export # mirror tracker → Notion
// node plugins.mjs run notion search "platform" # read matching records → pipeline
import { createNotionClient, rich, canonicalStatus } from './_notion.mjs';
function clientFromCtx(ctx) {
return createNotionClient({
token: ctx?.env?.NOTION_ACCESS_TOKEN,
parent: ctx?.env?.NOTION_PARENT_PAGE_ID,
fetch: ctx?.fetch, // route through the engine's allowedHosts/redirect guard
});
}
async function applicationsDb(client) {
const dbs = await client.resolveDBs();
const apps = dbs['Applications'];
if (!apps) throw new Error('No "Applications" database found under the Career Ops page — create it and share the integration with it.');
return apps;
}
/**
* Parse a tracker score cell into a numeric value for the Notion DB Score property.
*
* Scores in applications.md may be formatted like `4.2/5`, `**4.2/5**`, `4.25`, etc.
* Strips formatting and extracts the first numeric value so slash-formatted
* scores (e.g. 4.2/5) are not mangled into 4.25 (#1414).
*
* @param {unknown} s - Raw score value from tracker row.
* @returns {number} Parsed score, or NaN if no valid number is present.
*/
export function parseScore(s) {
const m = String(s ?? '').replace(/\*\*/g, '').match(/([\d.]+)/);
return m ? parseFloat(m[1]) : NaN;
}
View on GitHub (pinned to 9b17a8ac97)
Solutions
- In Notion, under the 'Career Ops' parent page, create a new database in-line named exactly 'Applications' (capital A, plural).
- Ensure the database is shared with the integration: open the database → ⋯ → Connect to → your integration. (Sharing the parent page alone may not propagate to children.)
- Re-run the notion plugin. If it still fails, verify resolveDBs sees the DB name — the integration must have access to the child database specifically.
Example fix
// Not a code fix — Notion setup: // 1. Career Ops page → Add a page → Database (full page) → title: "Applications" // 2. Applications DB → ⋯ menu → Connect to → <integration name> // 3. node plugins.mjs run notion
Defensive patterns
Strategy: validation
Validate before calling
// Pre-flight: ensure the Applications DB exists and is shared.
async function ensureApplicationsDb(client) {
const dbs = await client.resolveDBs();
if (!dbs['Applications']) {
throw new Error('Setup incomplete: create an "Applications" database under the Career Ops page and share it with the integration.');
}
return dbs['Applications'];
} Type guard
/** @param {unknown} dbs @returns {dbs is Record<string, string>} */
function isDbMap(dbs) {
return !!dbs && typeof dbs === 'object' && 'Applications' in dbs;
} Try / catch
try {
const appId = await applicationsDb(client);
} catch (err) {
if (err instanceof Error && err.message.includes('Applications" database')) {
console.error('Notion setup step missing: create + share the Applications DB.');
} else throw err;
} Prevention
- Title databases exactly as the code looks them up (case-sensitive) — 'Applications', not 'applications'.
- After creating a child DB, explicitly connect it to the integration; parent-level sharing does not always inherit.
- Add a setup self-check (resolveDBs + assert key DBs present) to the plugin's doctor step.
When it happens
Trigger: Running any notion plugin operation that targets the Applications DB (e.g. syncing the tracker) when the parent page exists and is reachable, but contains no child database titled exactly 'Applications'. A database with a different title (e.g. 'applications' lowercase, 'Job Applications') will NOT match — the lookup is by exact title string.
Common situations: User set up the token and parent page id but hasn't created the Applications database yet; the database exists but has a slightly different name; the database exists with the right name but was created as a regular page (not a database / 'data source'); the parent page is shared with the integration but the child database isn't (then resolveDBs can't see it, though that more often yields a missing entry than an error).
Related errors
- Set NOTION_PARENT_PAGE_ID in .env (the "Career Ops" parent p
- plugin "${id}" inactive: ${reason}. Run `node doctor.mjs` fo
- gmail: invalid days_back "${ctx?.settings?.days_back}" (must
- NOTION_ACCESS_TOKEN is not set (.env) — the Notion plugin ne
- Notion ${method} ${path} -> ${j.code}: ${j.message}
AI-assisted analysis of santifer/career-ops@9b17a8ac97 (2026-08-13).
Data as JSON: /api/errors/b0ba2aa1a7fd8665.
Report an issue: GitHub.