Name Normalization Rules

When backing up Bubble data into a Postgres database like Supabase, PlanB needs to convert Bubble table and column names into a format Postgres can understand. This is called name normalization.

Think of it like translating street addresses into a standard format the postal service can understand — we're doing the same with database names.

Why we need it

Bubble lets you name tables and columns with:

  • Emojis (🚀 ⭐ ❤️)
  • Special characters ($, @, #, !)
  • Spaces and mixed case
  • International characters (é, ñ, ü)

Postgres has stricter rules. Identifiers must:

  • Contain only letters, numbers, and underscores
  • Start with a letter or underscore
  • Not contain spaces or special characters
  • Be case-insensitive (everything becomes lowercase)

How it works

Step 1 — Character-by-character translation

Each character in the name is examined and converted.

Emojis become descriptive words

  • 🚀 → rocket
  • 💰 → money_bag
  • ⭐ → star
  • ❤️ → heart
  • 🔥 → fire
  • 📊 → bar_chart

Special characters become descriptive words

  • @at
  • #hash
  • $dollar
  • %percent
  • &ampersand
  • !exclamation

Spaces become underscores

Spaces are replaced with underscores to connect words.

Step 2 — Unknown emojis

When the system encounters an emoji or character it doesn't recognise, it's assigned a unique number:

  • 🦄 (unicorn) → emoji_1
  • 🦖 (dinosaur) → emoji_2
  • 🌈 (rainbow) → emoji_3

Each unknown emoji gets its own number, so they remain distinct.

Step 3 — Cleanup

  • Convert everything to lowercase
  • Remove duplicate underscores (__ becomes _)
  • Trim underscores from the start and end
  • Prepend an underscore if the name starts with a number

Examples

Simple emoji conversions
OriginalConvertedExplanation
🚀rocketSingle emoji becomes its word
💰 Moneymoney_bag_moneyEmoji + word
Sales 📊sales_bar_chartWord + emoji
⭐⭐⭐star_star_starMultiple emojis
🏠 Homehouse_homeEmoji with its meaning
Special character conversions
OriginalConvertedExplanation
$$$ Pricedollar_dollar_dollar_priceDollar signs become words
Email@Companyemail_at_company@ becomes 'at'
#1 Producthash_1_product# becomes 'hash'
50% Off_50_percent_offStarts with underscore for numbers
Q&A Sectionq_ampersand_a_section& becomes 'ampersand'
Unknown emoji handling
OriginalConvertedExplanation
🦄 Magicemoji_1_magicUnknown emoji gets number
🦖 Ancientemoji_2_ancientNext unknown gets next number
🌈 Colors 🦄emoji_3_colors_emoji_4Each unknown gets unique number
Complex examples
OriginalConvertedExplanation
!!! URGENT !!!exclamation_exclamation_exclamation_urgent_exclamation_exclamation_exclamationAll exclamations converted
User's Profile!users_profile_exclamationApostrophe removed, ! converted
💰💰💰 Big Salemoney_bag_money_bag_money_bag_big_saleMultiple emojis handled
⚡Fast⚡high_voltage_fast_high_voltageEmoji on both sides
Café Renécafe_reneAccented characters normalised

Handling duplicates

When multiple Bubble tables or columns normalise to the same name:

OriginalConvertedExplanation
🚀 RocketrocketFirst one keeps simple name
🚀 ROCKETrocket_2Second gets number suffix
Rocketrocket_3Third gets next number
rocketrocket_4Fourth gets next number

Edge cases

OriginalConvertedExplanation
(empty)unnamed_table_1Empty names get default
unnamed_table_2Only whitespace gets default
###hash_hash_hashOnly special characters
1234_1234Numbers get underscore prefix
SELECTselect_SQL reserved word gets underscore suffix
from-tofrom_toDash becomes underscore
🦄🦖🌈emoji_1_emoji_2_emoji_3All unknown emojis

Why this works

  • Preserves meaning — “🚀 Launch Date” → rocket_launch_date is still readable.
  • Prevents errors — no database crashes from special characters.
  • Handles everything — from emojis to international characters.
  • Avoids conflicts — duplicate names automatically get numbered suffixes.
  • Stays consistent — the same emoji always converts to the same word.

Summary

Name normalisation acts as a translator between Bubble's flexible naming and Postgres's strict requirements. It ensures every name is database-safe, names remain meaningful, and no data is lost due to naming issues.

Even with normalisation, you'll get a cleaner result if you prepare your Bubble app before migrating.

Need help? Email [email protected] or DM in the Bubble forum.