Skip to content

Limitations

N2O aims for high-fidelity sync, but Notion and Obsidian are fundamentally different formats - Notion is block-based with rich metadata, Obsidian is plain markdown. Some things don’t translate perfectly. We believe in being upfront about this.


These features sync from Notion to Obsidian correctly, but lose something when pushed back to Notion.

Notion toggles become collapsible callouts (> [!note]-) in Obsidian. On push, N2O treats them as equivalent - so a toggle can come back as a callout. The content is preserved, but the block type may flip. This is intentional.

Numbered list formatting not preserved on push

Section titled “Numbered list formatting not preserved on push”

Notion numbered lists support custom start numbers and letter/Roman numeral formatting. These are pulled and displayed correctly in Obsidian, but on push, the list always restarts from 1 with standard numbering.

Notion’s table of contents block (auto-generated from headings) is rendered as an HTML comment marker in Obsidian. On push, it is not reconstructed - N2O cannot create a live table of contents block via the API.

Auto-expanded URL embeds cannot be created

Section titled “Auto-expanded URL embeds cannot be created”

When you paste a URL in Notion and it auto-expands into a rich preview (link_preview block), the API cannot create one, so N2O can never make a new one on push. It does not destroy the one you have: the original block is left alone on every push, and Obsidian renders it as a read-only card.

Notion embed blocks (Figma, Google Maps, etc.) render in Obsidian as a real sandboxed iframe for hosts N2O recognises, and as a link for hosts it does not. On push, the URL is sent back correctly and Notion re-fetches its own preview.

With Enhanced Metadata enabled, N2O also detects the embed subtype (tweet, Google Maps, Figma, Google Drive, GitHub Gist, Miro, CodePen, Replit, Excalidraw) and preserves it in metadata.


These are limitations of the Notion API itself - not things N2O can work around.

Notion doesn’t offer webhooks. N2O detects Notion changes by checking on a timer - with “Get changes from Notion” on, it checks about once a minute while you’re active and backs off when idle, plus a periodic full re-sync. Changes appear quickly but not instantly.

Notion’s last_edited_time updates once per minute. If you edit the same page in both Notion and Obsidian within the same minute, N2O compares content hashes instead of timestamps to decide whether a conflict exists.

Images and files uploaded to Notion are hosted on Amazon S3 with signed URLs that expire. N2O downloads them immediately during sync. If a download fails (e.g. network issue), it retries on the next sync with a fresh URL.

Notion’s documented limit is an average of 3 requests per second. N2O runs a token bucket at that rate with a burst of 60, so a small sync spends the burst and finishes at full speed, and only a large first sync settles down to the sustained rate. For very large workspaces (thousands of pages), the initial sync may take several minutes due to throttling. Incremental syncs after the first are much faster.

Notion’s API does not expose inline or block-level comments. Page comments and discussion threads are not synced.


Free 14-day trialProLifetime
Pages300UnlimitedUnlimited
DatabasesUnlimitedUnlimitedUnlimited
DirectionTwo-wayTwo-wayTwo-way
Automatic sync (both directions)YesYesYes
Custom templatesYesYesYes
PriceFree for 14 days$8/mo or $80/yr$299 once

  • Cover images on push - Cover images set in Notion are shown as embedded images in Obsidian, but are stripped before push. They are display-only in Obsidian and won’t overwrite your Notion cover.
  • Synced blocks transclude their first child - When a synced block’s source in Notion spans several children, Obsidian transcludes the first one only, so the rest is not visible in the embedding note. Pushing back is whole: every child goes up, and both originals and references survive.
  • Synced block circular references - If synced blocks reference each other in a loop, N2O renders the inner reference as empty to prevent infinite recursion.
  • Metadata comments in raw markdown - N2O adds invisible HTML comments (<!-- n2o:... -->) to certain blocks (toggles, callouts, colored blocks, synced blocks) to preserve metadata for push. They’re invisible in Obsidian’s reading view but visible in source mode.
  • Filename length - Page titles are capped at 200 characters, or 240 bytes, after sanitization, whichever comes first. Very long Notion page titles get truncated in Obsidian.
  • Forbidden filename characters - Characters like / : * ? " < > | # ^ [ ] are stripped from filenames. Notion page titles containing these characters will look slightly different as filenames.