How to's

Managing images in Notion

Any image that you upload to Notion will be optimized before rendering on the website.

How does Bullet optimize images in the background?

The images you upload to Notion will be automatically converted into WebP and AVIF format.
If the requesting browser supports AVIF we deliver the image in AVIF format. If the browser does not support AVIF, images will fall back to WebP. And if there is no support for WebP, then we will serve compressed files in the original format.

Converting images into Links

You can add a link to images so users can navigate to a specific URL. To hyperlink an image:
  1. Hover over the image and click or ⋮⋮.
  1. Select Add link → Paste a URL or choose a Notion page.
Note that selecting a Notion page won't create a backlink.

Adding alt text for images.

Alt Text is a short description added to images for accessibility and SEO purposes.
Alt text is a brief description added to images, primarily for accessibility. Adding alt text ensures better accessibility, enhances search rankings.
  • Hover over the image and click the three dots menu.
  • Select Alt text → Enter a description → press Enter to save.
However, if you want have an alt text, and still have a link or if you want a different image caption than that of alt text, then follow the advanced image control attributes below.

Advanced image control attributes

You can use advanced image attributes inside of image caption. These image control attributes, while not visible on the website, serve as meta properties that enable precise image management.
Some of the attributes are:
1.00
  • :height=”120px”
    • Change the height of the image
  • :width=”180px”
    • Change the width of the image
  • :loading=”eager”
Remember these image attributes will be given in the image caption of your Notion page, but they won't show up on your website.

How to unpublish an existing page

There are a few ways to stop a Notion page from appearing on a website.
  1. Disable the Publish property in Notion. This is the easiest way to control if the page should appear directly from Notion. Any database page which has the property called “Publish” and unchecked will not be published.
  1. For the database collection page, sometimes the database collection page is not easily controllable in Notion. For these pages, you can turn off “Show Database pages” option inside Themes > Database views.
    1. 1.00
  1. You can also turn off pages that you don’t want to be published under Page Settings > Publish.
    1. 1.00

How to Add Buttons in the Notion website

There are a couple of ways to add buttons to your favorite Notion website builder.

Notion’s “/button”

Type /button in Notion to create a standard button. This button can be linked to an external website or an internal page in Notion - which will be linked to corresponding page in Bullet.

Bullet Button

Bullet has its own format for adding a button - enclose the link text with square brackets and add a link along with square brackets. This generates a link with the bullet-btn class, which can be customized differently across templates.
1.00
The link text enclosed in square brackets becomes a button.
Note: Bullet only adds the bullet-btn class, and the style is managed in the templates. If you're not using our templates, you'll need to add custom CSS to make the link look like a button.

Common Mistake: Sometimes, users find the button doesn't work because the square brackets should be part of the hyperlink, not outside it.

Show database views as Tabs

Copy and paste the below snippet in your custom CSS to make your database views appear in different tabs.
/* render database views as tabs */ .notion-collection-view-dropdown-content { display: flex; box-shadow: none; align-items: center; justify-content: start; gap: 30px; flex-wrap: wrap; margin: 0 auto !important; } .notion-collection-view-dropdown-content-item-active-icon>svg { display: none !important; } .notion-view-type>svg{ display: none !important; } .notion-collection-view-type-title{ overflow: unset; } .notion-collection-view-dropdown-content-item { padding: 10px 20px 10px 20px; border-radius:5px; box-shadow:0px 0px 0px 2px black; color: white !important; } .notion-collection-view-dropdown-content-item:focus, .notion-collection-view-dropdown-content-item-active { background-color:black; color: white !important; } .notion-collection-view-dropdown-content-item-active>.notion-collection-view-type>.notion-view-type>.notion-collection-view-type-title{ color: white !important; } .dropdown { display: block; } .dropdown-trigger { display: none; } .dropdown-menu { display: block; position: unset; z-index: 99; } .dropdown-content{ background: unset; } .notion-collection-view-dropdown-content{ padding: 25px 0px 25px 0px; } .notion-collection-header{ display: flex; justify-content: start; padding-left: 90px; align-items: center; margin: 10px 0px 60px 0px; } .notion-collection-view-dropdown-content { display: flex; box-shadow: none; align-items: center; justify-content: center; gap: 15px; flex-wrap: wrap; }

Prevent the discovery of the Notion Page

With Bullet, you can prevent the discovery of your Notion page ID from others by generating a randomized ID for added privacy.
  • First, you have to enable the Randomize Notion Block ID for your site. Go to Dashboard > Settings and scroll down to the "Randomize Notion Block ID" section.
  • Once you enable the option, the randomized Notion ID will be generated instead of your original Notion ID, and click Save.
notion image
NOTE: Don't forget to hit "Save" after every change and then "Publish" to see results on your live webpage.

How to use different templates in different pages?

This document will be helpful if you want to:
  • Apply different templates to different pages of the same website.
  • Apply a template to only a specific page and keep other pages as the default Notion design.
Note: You can’t combine two different templates on the same page, as that will lead to a clash of styles for the same elements.
Any Bullet template that you see on our templates page is a combination of a Notion template and a set of CSS styles and JavaScript for that template.
For every template, you can see the Notion template link and CSS code under its respective /getting-started/ page.
For example, see for Docuflow template: https://docuflow.bullet.ink/getting-started/
If you’ve created your site during the onboarding flow from the Bullet dashboard, you will see a global code inside Code > Head, Code > Body. This code will be applied to all the pages on the website.
So this consists of two steps.

Step 1: Move the current template code from global to page-specific

Now that you want this code to be applied only inside specific pages, remove this code from the global code, and paste this code under page-specific code under Pages > Select the page > Code > Current page.
1.00

Step 2: Copy the new template code into a different page

Go to any other template that you have already, then copy the code to the specific page.
For example, if you want to add Gear template to the specific page, go to its getting started page and scroll all the way to bottom to copy paste the code inside specific page.

How to add a custom search bar

Adding a search bar to your website enhances user experience by allowing visitors to find content quickly. This guide walks you through implementing a custom search bar using HTML and CSS.
  1. Add the following code inside a code block on your Notion page. Below the code block, include a caption labelled as a bullet:HTML
<div class="bullet-search"> <div class="panel is-link bullet-panel"> <div class="panel-block"> <p class="control has-icons-left"> <span class="icon is-left"> <svg xmlns="<http://www.w3.org/2000/svg>" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" style="width: 1.2rem; height: 1.2rem;"> <path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z"></path> </svg> </span> <input data-origin="" id="bullet-search-input" class="input bullet-search-input" type="text" placeholder="Search..."> </p> </div> </div> </div>

  1. Copy and paste the following custom code inside "Code" > "CSS"
.panel { border-radius: 20px; } .notion-custom-code .panel { border-radius: 50px; } .bullet-panel .panel-block{ border: unset; } .panel{ box-shadow: 0px 0px 3px 0px lightgray; } .notion-custom-code { width: 100%; } .has-icons-left { display: flex; align-items: center; gap: 8px; } .is-left svg { width: 1.5rem !important; height: 1.5rem !important; color: var(--fg-color-6); } input::placeholder { font-size: 1.3rem; color: var(--fg-color-6); } .bullet-search-input { font-size: 1.3rem; padding-left: unset; } .control.has-icons-left .icon { position: unset; } .control.has-icons-left .input { padding-left: unset; } .notion-custom-code .bullet-panel { margin-top: 0px; } @media(min-width: 800px){ .notion-custom-code .bullet-panel{ max-width:66vw; } }

How to embed forms in Notion and Bullet?

Embed forms into Notion and simplify data collection and management. Streamline tasks like lead generation and feedback by embedding forms from platforms like Tally or Mailchimp, all within one workspace, improving efficiency without needing extra tools.

How to Embed a Notion Form in bullet site

Step 1: Create Your Form in Notion

  1. Create your form in Notion by typing /forms inside a page.
  1. Add all required fields and configure the form the way you want.
  1. Click on Share form and make it public.
    1. notion image
  1. Copy the public URL of the form from the Share option.
    1. notion image

Step 2: Embed the form Inside the Notion Page

  1. Create a new** Notion page** where you want the form to appear.
  1. Give the page a clear title like “Contact Form” or “Request Form.”
  1. Paste the copied form link into the page.
  1. Choose Embed when Notion asks how to display the link.
notion image

Step 3: How to Link form page in notion button

  1. Open the Notion page where you want to link the form.
  1. Click on the existing Button block (or create a new button).
  1. Open the Button Settings.
    1. notion image
  1. Click on New Action and choose “Open Page, form, or URL.”
    1. notion image
  1. Select the Notion page where your form is embedded.
notion image
6. Click
Done
to save the action.
7. Publish your site in Bullet to make the changes live.

Embed Tally forms in the Notion website using Bullet.

Tally Forms is a form builder that allows users to create forms quickly and without needing coding skills. It's commonly used for lead generation, gathering customer feedback, event registration, surveys, job applications, and more. You can directly embed forms in Notion using Bullet.
  1. Create your Tally form and click Publish.
  1. Navigate to the Share tab and choose the Standard option.
  1. Adjust the embed settings to your preference.
  1. Click Copy embed link.
  1. On your Notion page, type the /embed command and paste the link.
Standard Form:
A standard Tally form will always be displayed on your Bullet site.
Popup Form:
A pop-up form can be triggered on actions such as button click, on page load, after a set time, on exit intent, and after scrolling.

Beehive newsletter signup form on the Notion website

Beehiiv is a form builder that enables users to create forms easily without any coding skills. It is often used for newsletter sign-ups, feedback collection, event registrations, surveys, and lead generation. You can seamlessly integrate forms into Notion with Beehiiv.
  1. Log in to Beehiiv and create a custom subscribe form.
  1. Go to the Subscribe Forms page → Click "View" next to your form.
  1. Choose an embed option (Full Width, Fixed Width, Slim Embed) and copy the code.
  1. Open Notion → type /embed and select the "Embed" option.
  1. Paste the copied embed code into the URL field.

Embed Your Substack Newsletter Form in Notion website.

Substack allows writers to publish newsletters directly to their audience, with options for free or paid subscriptions. It simplifies the publishing process.
  1. Sign up with your email to receive a magic login link. Click the link to log in.
  1. Enter your Substack newsletter URL → click the "Add" button. Customize the embed using options on the left.
  1. Click the " Embed Code" button at the bottom left, then select the Notion tab and copy the link.
  1. Open Notion → /embed to paste the ink and click create embed.

Embed Mailchimp email form in Notion website.

Mailchimp is a comprehensive marketing platform that streamlines email campaigns, allowing businesses to create, send, and track newsletters easily.
  • Go to your Mailchimp Campaigns and click the down arrow next to the campaign → select "Social Share → Copy campaign URL.
  • Open the Notion page where you want to embed the campaign. Type /embed or just / and select the "Embed" block.
  • Paste the Mailchimp campaign link into the Embed block and click the "Embed link" button.

Guide to Embedding Content in Notion and Bullet

Embed Videos, PDFs and other files.

Video links and other files can be added in your site in two ways.

Embed directly in Notion

Similarly embed like video links, images, PDFs, and more directly into Notion.
  1. Type /embed in notion → Choose and upload files from your device.
  1. The uploaded or linked file will now appear in both Notion and your Bullet site.

Embed via Google Drive

You can upload files to Google Drive and then embed them in Notion.
  1. Upload video to Google Drive
  1. Click Share, set access to " Anyone with the link," and copy the Share URL.
  1. In Notion, type /video or /embed → paste the Share URL.
The video will appear in Notion and on your Bullet site.
Similarly, embed Youtube videos, images, PDFs, and other media files into Notion.
To embed a social media post on your Bullet site for social proof or when it gains attention, simply copy the link and add it using the embed option in Notion.
  1. Click Share on the post and select Copy link.
  1. In your Notion page, either type /embed and paste the link or paste it directly and choose Embed.

Sell product using Gumroad

If you want to sell online, Gumroad can help you get started. It could be a course, digital files, or anything else — Gumroad handles your online store and payments. To add your Gumroad product or store to a Bullet site:
  1. Copy your Gumroad product or store profile URL
  1. Paste the link to your Notion page
  1. Select Create embed.
The product preview will be visible in your notion site and in bullet.

To create a scrollable carousel for a gallery view

  1. Create a medium gallery view and name it. .bullet-carousel
    1. 1.00
  1. If you don't want the cards to be clickable, add a Publish property and uncheck it
  1. To set up redirects, add a URL property named bullet:Link and insert your desired redirect URL

Add the carousel script

Navigate to the code section of your site in the Bullet dashboard. Copy the code below and paste it inside the “Body” section.
<script> const ARROW_RIGHT_IMAGE = `<svg width="35" height="36" viewBox="0 0 35 32" fill="none" xmlns="<http://www.w3.org/2000/svg>"> <path d="M7.29167 19.243H24.5875L19.2937 25.6013C19.1712 25.7488 19.0789 25.919 19.0221 26.1021C18.9653 26.2852 18.9451 26.4778 18.9627 26.6687C18.9982 27.0543 19.1855 27.41 19.4833 27.6576C19.7811 27.9051 20.1651 28.0242 20.5507 27.9887C20.9363 27.9531 21.292 27.7658 21.5396 27.468L28.8313 18.718C28.8803 18.6484 28.9242 18.5753 28.9625 18.4993C28.9625 18.4263 29.0354 18.3826 29.0646 18.3097C29.1307 18.1425 29.1653 17.9645 29.1667 17.7847C29.1653 17.6049 29.1307 17.4269 29.0646 17.2597C29.0646 17.1868 28.9917 17.143 28.9625 17.0701C28.9242 16.994 28.8803 16.9209 28.8313 16.8513L21.5396 8.10133C21.4025 7.93671 21.2308 7.80433 21.0367 7.71359C20.8426 7.62285 20.6309 7.57599 20.4167 7.57633C20.0759 7.57567 19.7457 7.69434 19.4833 7.91175C19.3357 8.03418 19.2136 8.18453 19.1241 8.35421C19.0347 8.52388 18.9795 8.70953 18.9619 8.90054C18.9443 9.09155 18.9646 9.28416 19.0215 9.46733C19.0784 9.6505 19.171 9.82064 19.2937 9.968L24.5875 16.3263H7.29167C6.90489 16.3263 6.53396 16.48 6.26047 16.7535C5.98698 17.027 5.83333 17.3979 5.83333 17.7847C5.83333 18.1714 5.98698 18.5424 6.26047 18.8159C6.53396 19.0894 6.90489 19.243 7.29167 19.243Z" fill="currentColor"/> </svg>`; const SCROLL_AMOUNT = 350; const toggleBtns = (collection, currentScroll, maxScroll) => { const prevButton = collection.querySelector(".carousel-btn-prev"); const nextButton = collection.querySelector(".carousel-btn-next"); prevButton.disabled = currentScroll <= 0; nextButton.disabled = currentScroll >= maxScroll; }; const carouselCollections = Array.from( document.querySelectorAll(".notion-collection"), ).filter((el) => { const galleryView = el.querySelector(".bullet-carousel"); return galleryView !== null || galleryView !== undefined; }); const initCarousel = () => { Array.from(carouselCollections).forEach((collection) => { if (!collection) return; const galleryView = collection.querySelector(".notion-gallery-grid"); galleryView.classList.add("db-bullet-carousel"); const carouselFragment = document.createDocumentFragment(); const carouselButtonContainer = document.createElement("div"); carouselButtonContainer.classList.add("carousel-container"); const prevButton = document.createElement("button"); prevButton.classList.add("carousel-btn-prev"); prevButton.innerHTML = ARROW_RIGHT_IMAGE; prevButton.style.transform = "rotate(180deg)"; prevButton.disabled = true; prevButton.addEventListener("click", () => { scrollCarousel("left", collection); }); const nextButton = document.createElement("button"); nextButton.classList.add("carousel-btn-next"); nextButton.innerHTML = ARROW_RIGHT_IMAGE; nextButton.style.marginTop = "7px"; nextButton.addEventListener("click", () => { scrollCarousel("right", collection); }); carouselButtonContainer.appendChild(prevButton); carouselButtonContainer.appendChild(nextButton); carouselFragment.appendChild(carouselButtonContainer); collection.appendChild(carouselFragment); }); }; const scrollCarousel = (direction, collection) => { const galleryGrid = collection.querySelector(".notion-gallery-grid"); if (!galleryGrid) return; let currentScroll = galleryGrid.scrollLeft; const maxScroll = galleryGrid.scrollWidth - galleryGrid.clientWidth; const calculateTargetScroll = ( direction, currentScroll, scrollAmount, maxScroll, ) => { if (direction === "right") { return Math.min(currentScroll + scrollAmount, maxScroll); } else { return Math.max(currentScroll - scrollAmount, 0); } }; let targetScroll = calculateTargetScroll( direction, currentScroll, SCROLL_AMOUNT, maxScroll, ); galleryGrid.scrollLeft = targetScroll; toggleBtns(collection, targetScroll, maxScroll); }; const addScrollEvent = () => { carouselCollections.forEach((coll) => { const notionGalleryGrid = coll.querySelector(".notion-gallery-grid"); if (notionGalleryGrid !== undefined) { const updateButtonsState = () => { const currentScroll = notionGalleryGrid.scrollLeft; const maxScroll = notionGalleryGrid.scrollWidth - notionGalleryGrid.clientWidth; const prevButton = document.querySelector('.carousel-btn-prev'); const nextButton = document.querySelector('.carousel-btn-next'); if (!prevButton || !nextButton) { return; } prevButton.disabled = currentScroll <= 0; nextButton.disabled = currentScroll >= maxScroll; }; notionGalleryGrid.addEventListener('scroll', updateButtonsState) } }) } document.addEventListener("DOMContentLoaded", () => { initCarousel(); addScrollEvent(); }); </script>
Next, add the carousel's CSS styling. Copy the following code and paste it into the “CSS” section.
:root { --card-width: 320px; --card-gap: 50px; } .db-bullet-carousel { width: auto; display: grid; grid-template-columns: repeat(auto-fill, minmax(var(--card-width), 1fr)); grid-auto-flow: column; gap: var(--card-gap); overflow-x: auto; } .db-bullet-carousel .notion-collection-card { width: var(--card-width); } .coll-Carousel .notion-gallery-grid { transition: scroll-behavior 0.5s ease-in-out; } .carousel-btn-next, .carousel-btn-prev { border: none; background: var(--bg-color); color: var(--navbar-btn-bg-color); opacity: 0.6; } .carousel-btn-next:hover, .carousel-btn-prev:hover { opacity: 1; } .carousel-btn-prev:disabled, .carousel-btn-next:disabled, .carousel-btn-prev:disabled:hover, .carousel-btn-next:disabled:hover { opacity: 0.2; } .notion-gallery-grid { scroll-behavior: smooth; }

Output:

1.00

How to unhide an element or <H1> tag

How to Unhide an Element or <H1> Tag Using Block Editor in Bullet.so

To make any hidden element visible on your Bullet.so site using the Block Editor, follow these steps:
  1. Open the page you want to edit.
  1. Go to Design section and select any block
    1. 1.00
  1. In the right-side Layers panel, locate and select the element you want to unhide (e.g., Notion Title or any other block).
    1. 1.00
  1. Click on Design, navigate to the Layout section.
    1. 1.00
  1. Under Show/Hide, select “ Show” to make the element visible on your site.
    1. 1.00
  1. Save and publish your site to apply the changes.
📝 Tip: You can use the Layers panel to quickly find and manage visibility for nested or overlapping elements.

How to Unhide an Element or <H1> Tag Using Block Editor in Bullet.so (Legacy Method)

For Legacy Users
To make any hidden element visible on your Bullet.so site using the Block Editor, follow these steps:
  1. Open the page you want to edit.
  1. Click on any block to enable the Block Editor
1.00
  1. In the right-side Layers panel, locate and select the element you want to unhide (e.g., Notion Title or any other block).
1.00
  1. In the Block Editor, navigate to the Layout section.
1.00
  1. Under Show/Hide, select “ Show” to make the element visible on your site.
1.00
  1. Save and publish your site to apply the changes.
📝 Tip: You can use the Layers panel to quickly find and manage visibility for nested or overlapping elements.

Video Customization in Bullet

You can use advanced video attributes inside a video caption. These control attributes, while not visible on the website, act as meta properties that allow you to manage video behavior more precisely.

1. Upload Video

1.00
Use the following attributes in the video caption:
:loop="true" :autoPlay="true" :muted="true"
Above attributes is used to automatically starts playing the video when the page loads.
💡 Note: These video attributes should be added in the video caption of your Notion page. They won’t appear visually on your website but will control the video’s behavior.

2. Embed via URL

When embedding a video link (e.g., YouTube), you can customize playback by adding attributes at the end of the URL.
Example URL:
<https://www.youtube.com/embed/VIDEO_ID?autoplay=1&mute=1&controls=0&loop=0>
Common URL attributes:
?autoplay=1&mute=1&controls=0&loop=0
Attribute explanations:
  • autoplay=1 → Video starts automatically
  • mute=1 → Video is muted
  • controls=0 → Player controls are hidden
  • loop=0 → Video does not loop
Note: Use 1 for true and 0 for false. You can combine multiple parameters using &.

How to Customize Mobile/Tablet Layout Without Affecting Desktop

In Bullet, you can edit your website’s layout separately for Mobile, Tablet, and Desktop devices. This allows you to fix mobile or tablet issues without changing how your desktop site looks.
Steps:
  1. Open your site in the Bullet editor.
  1. In the top toolbar, set the Preview Device to Mobile or Tablet.
  1. Make your changes directly in that selected view.
  1. These changes will apply only to the chosen device layout.
  1. Your Desktop layout will remain unaffected.
Watch the step-by-step video tutorial below for a full walkthrough.

How to Exclude Your Own Visits from Analytics

Exclude your own visits from analytics by setting a flag in your browser’s local storage. Follow the steps below.

Steps to Exclude Your Own Visits:

  1. Open your website in your browser.
  1. Open the Developer Console:
      • Press F12 or Ctrl + Shift + I (or Cmd + Option + I on Mac)
  1. This will open the Developer Tools. Navigate to the Console tab.
  1. If you're in a different tab like "Network" or "Elements," click on "Console" to switch.
    1. 1.00
  1. In the Console, paste the following line of code and hit Enter:
localStorage.setItem('umami.disabled', 'true')
  1. Refresh the page. Your visits will now be excluded from tracking on that browser.

Note:
  • This setting only applies to the specific browser and device where it was set.
  • If you use a different browser or device, repeat these steps there.
  • This is especially helpful for internal team visits, QA testing, or development environments.

How to Set Up Subscription-Based Page Access

Use this guide to protect specific pages on your Bullet website, and allow access only to users who have completed a subscription payment.

1. Create a Payment Link

You can use Stripe or Gumroad for collecting payments.
For Stripe:
  • Create a Product → Price → Payment Link.
  • Copy the generated payment link.
For Gumroad:
  • Create a Product.
  • Copy the product link.
Add this link to a button on your site with a label like “Subscribe to Unlock Premium Access”.

2. Create a Premium Segment in Bullet

  1. Go to your Site Dashboard → Membership
  1. If Membership is enabled, you’ll see a “Segments” option
  1. Click “Create Segment” and name it something like Premium Users
  1. This segment will be used to control access to protected pages for paying users

3. Automate Segment Assignment with Zapier

Once a payment is made, Zapier can automatically add the user to your Premium Users segment.
For Stripe:
  • Trigger: Stripe – Checkout Session Completed
  • Action: Bullet – Add user to segment
    • Segment: Premium Users
    • Email: Use the email from Stripe
For Gumroad:
  • Trigger: Gumroad – New Sale
  • Action: Bullet – Add user to segment

4. Redirect Users After Payment

In Stripe or Gumroad:
  • Set the Post-payment Redirect URL to your protected page or a thank-you page that links to the protected page.
Add a message like:
“Please enter the same email you used for payment to access your premium content.”

5. Email Verification via Bullet

When users visit a protected page:
  • Bullet shows an email input screen.
  • The user enters their email → Bullet sends a verification link.
  • Once verified, if their email is in the Premium Users segment, they’ll get access.

How to upload a custom file

Uploading Custom Files

To upload a custom file to your website (like ads.txt), follow these steps
  1. Go to Site Settings → Domain → Files → Ads.txt
    1. 1.00
  1. In the input field, enter the full file path. Example: /ads.txt
    1. 1.00
  1. Upload your file directly using the upload interface.

Legacy User

To upload a custom file to your website (like ads.txt), follow these steps
  1. Go to SettingsFilesAds.txt section.
    1. 1.00
  1. In the input field, enter the full file path. Example: /ads.txt
    1. 1.00
  1. Upload your file directly using the upload interface.