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.
Things that don’t round-trip perfectly
Section titled “Things that don’t round-trip perfectly”These features sync from Notion → Obsidian correctly, but lose something when pushed back to Notion.
Toggle and callout are interchangeable
Section titled “Toggle and callout are interchangeable”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.
Column layouts lose their side-by-side arrangement
Section titled “Column layouts lose their side-by-side arrangement”Notion columns become sequential content in Obsidian (separated by ---). The structure is preserved — all content syncs correctly — but the side-by-side visual is gone. On push, columns come back as sequential blocks, not columns.
Code block captions are lost on push
Section titled “Code block captions are lost on push”Notion code blocks can have captions below them. N2O renders these as italic text under the code block. However, the caption is not parsed back during push — it stays in Obsidian but doesn’t round-trip to Notion.
Synced blocks only push their first child
Section titled “Synced blocks only push their first child”Notion’s “synced block” feature lets you reuse content across pages. During push, N2O can only create the content of the original synced block’s first child — subsequent children are dropped. This is a Notion API limitation: you can’t programmatically create “original” synced blocks.
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.
Table of contents blocks are not pushed
Section titled “Table of contents blocks are not pushed”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.
Table row headers are reset on push
Section titled “Table row headers are reset on push”Notion tables can have a “header row” setting. When pushing a table back to Notion, N2O always sets has_row_header: false. If your table had a header row enabled in Notion, that setting is lost on the first push.
Auto-expanded URL embeds are lost
Section titled “Auto-expanded URL embeds are lost”When you paste a URL in Notion and it auto-expands into a rich preview (link_preview block), N2O has no way to recreate that on push — it becomes an unsupported block type. The URL itself is preserved in a bookmark block, but the rich preview is gone.
Embed blocks only keep the URL
Section titled “Embed blocks only keep the URL”Notion embed blocks (Figma, Google Maps, etc.) are stored as bookmark-type links in Obsidian. The embedded content preview is not reproduced — only the URL is retained.
With Enhanced Metadata enabled, N2O detects the embed subtype (tweet, Google Maps, Figma, Google Drive, GitHub Gist, Miro, CodePen, Replit, Excalidraw) and preserves it in metadata. On push, the URL is sent back correctly, but Notion must re-fetch the preview.
Notion API constraints
Section titled “Notion API constraints”These are limitations of the Notion API itself — not things N2O can work around.
No instant change notifications
Section titled “No instant change notifications”Notion doesn’t offer webhooks. N2O detects Notion changes by polling — fast polling checks every 5–120 seconds (Pro), auto-sync runs every 1–60 minutes. Changes appear quickly but not instantly.
Timestamps round to the nearest minute
Section titled “Timestamps round to the nearest minute”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.
File URLs expire after ~1 hour
Section titled “File URLs expire after ~1 hour”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.
Rate limits on large workspaces
Section titled “Rate limits on large workspaces”Notion enforces 3 API requests per second. N2O targets 2.5 req/s to stay under the limit. 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.
No block-level comments
Section titled “No block-level comments”Notion’s API does not expose inline or block-level comments. Page comments and discussion threads are not synced.
Free tier limits
Section titled “Free tier limits”| Feature | Free | Pro |
|---|---|---|
| Synced items | 100 max | Unlimited |
| Databases | Unlimited | Unlimited |
| Pull sync (Notion → Obsidian) | Yes | Yes |
| Push sync (Obsidian → Notion) | No | Yes |
| Auto-sync scheduling | No | Yes |
| Fast polling | No | Yes |
| Multiple workspaces | No | Coming soon |
Other known edge cases
Section titled “Other known edge cases”- 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 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 100 characters after sanitization. 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.