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 to 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.
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.
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.
Embed blocks re-fetch their preview
Section titled “Embed blocks re-fetch their preview”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.
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 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.
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’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.
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.
Plan limits
Section titled “Plan limits”| Free 14-day trial | Pro | Lifetime | |
|---|---|---|---|
| Pages | 300 | Unlimited | Unlimited |
| Databases | Unlimited | Unlimited | Unlimited |
| Direction | Two-way | Two-way | Two-way |
| Automatic sync (both directions) | Yes | Yes | Yes |
| Custom templates | Yes | Yes | Yes |
| Price | Free for 14 days | $8/mo or $80/yr | $299 once |
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 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.