Skip to main content
RapidDev - Software Development Agency
bubble-integrationsBubble API Connector

Codecademy

Codecademy has no public API — the only reliable Bubble integration is a companion dashboard built on top of CSV exports from Codecademy for Teams. Create a CodecademyProgress Data Type in Bubble, import weekly admin exports via Bubble's native CSV Import tool, and build a team learning dashboard using Repeating Groups, :filtered searches, and Bubble's built-in aggregations. Add 'Open in Codecademy' External Link actions so learners can launch courses without leaving your Bubble app.

What you'll learn

  • Why Codecademy has no public API and why the CSV companion approach is the only reliable integration method
  • How to design a CodecademyProgress Data Type in Bubble with the correct field types for progress tracking
  • How to use Bubble's native CSV Import tool to load Codecademy for Teams exports without any code
  • How to build an UPSERT pattern in Bubble that prevents duplicate records on re-import
  • How to build team and department completion dashboards using Bubble's built-in search aggregations
  • How to add 'Open in Codecademy' External Link actions and display a 'Data as of' freshness indicator
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Beginner21 min read25 minutesEducationLast updated July 2026RapidDev Engineering Team
TL;DR

Codecademy has no public API — the only reliable Bubble integration is a companion dashboard built on top of CSV exports from Codecademy for Teams. Create a CodecademyProgress Data Type in Bubble, import weekly admin exports via Bubble's native CSV Import tool, and build a team learning dashboard using Repeating Groups, :filtered searches, and Bubble's built-in aggregations. Add 'Open in Codecademy' External Link actions so learners can launch courses without leaving your Bubble app.

Quick facts about this guide
FactValue
ToolCodecademy
CategoryEducation
MethodBubble API Connector
DifficultyBeginner
Time required25 minutes
Last updatedJuly 2026

Building a Codecademy Team Dashboard in Bubble (Without an API)

Codecademy is intentionally a closed platform. There is no public REST API, no OAuth registration, and no affiliate API for third-party integrations. Any tool claiming to offer a live Codecademy API integration is using unofficial, undocumented endpoints that can break at any time. If you are building in Bubble and want to display Codecademy learning data, the honest answer is: you cannot pull live data from Codecademy's servers into Bubble. What you can build is something genuinely more valuable for organizations: a branded team dashboard that works alongside Codecademy rather than inside it.

The pattern is straightforward. Codecademy for Teams — available on Business and Enterprise plans — lets admin users export weekly progress reports as CSV files. These exports contain employee emails, course names, completion percentages, time spent, and last activity dates. Bubble's native CSV Import tool loads this data directly into a Bubble Data Type without writing a single line of code. From there, all of Bubble's visual tools — Repeating Groups, :filtered searches, :average and :count aggregations, Chart plugins, and workflow actions — work against your Bubble database to produce dashboards that Codecademy's own admin panel cannot provide.

The result: bootcamp founders, corporate L&D managers, and education providers get a fully branded learning operations portal with department-level completion views, at-risk learner identification, skills coverage maps, and course-launch buttons that open Codecademy URLs in a new tab — all on their own Bubble domain, under their own brand, shared with stakeholders who do not have Codecademy admin access. The data is updated weekly via a fresh CSV import, and a prominently displayed 'Data as of' timestamp ensures users always know how current the information is.

Integration method

Bubble API Connector

Codecademy has no public REST API — no API keys, no OAuth flow, no webhooks. The Bubble integration is a database-backed companion tracker: export progress data from the Codecademy for Teams admin dashboard as CSV, import it into a Bubble Data Type using Bubble's native CSV Import tool, and build reporting dashboards on top of Bubble's database. The 'API Connector' is not used here because there is no API to connect to — all data work happens within Bubble's Data tab.

Prerequisites

  • A Codecademy for Teams Business or Enterprise plan — admin export access is only available on these tiers (Free and Plus individual accounts cannot export team data)
  • Access to the Codecademy for Teams admin dashboard to download the progress CSV export
  • A Bubble account — any plan, including Free, can use the CSV Import tool and build database-backed dashboards
  • For scheduled email reminders to the admin about weekly imports: a paid Bubble plan (Starter or above — Free plan cannot run scheduled Backend Workflows)
  • No API keys or developer credentials are required — Codecademy has no public API

Step-by-step guide

1

Understand the CSV export and plan your data model

Before creating anything in Bubble, export a sample CSV from Codecademy and review its column names — this is the most important setup step and the most commonly skipped one. In the Codecademy for Teams admin dashboard, navigate to Reports or Analytics (the exact path depends on your plan tier and Codecademy's current interface — look for 'Team Progress', 'Reports', or 'Data Export' in the admin navigation). Download the progress report CSV. Open it in a spreadsheet and note the exact column names as they appear in the header row. Typical Codecademy export columns include employee email, employee name, course name, course category (e.g., Python, JavaScript, SQL), completion percentage, total time spent, and last activity date. Depending on your plan, the column names may be formatted as 'Employee Email', 'Learner Email', or 'email' — Codecademy has updated their export format over time and does not guarantee consistent naming. Also check the format of the completion percentage column: it may be '67' (plain number) or '67%' (number with percent symbol). If it includes the % symbol, open the column in your spreadsheet and strip the symbol before saving — Bubble's number field will silently reject non-numeric values during import, leaving progress_percentage as 0 for all rows. Note whether course URLs are included in the export. If they are not, you can find Codecademy course URLs manually (from the Codecademy course catalog) and add them as a separate column in your spreadsheet before import — this enables the 'Open Course' External Link action in your Bubble app. Finally, note how many rows are in the export. If your organization has many learners and courses, a single employee may appear multiple times — once per enrolled course. Your Bubble Data Type will be at the course-enrollment level, not the employee level.

Pro tip: Keep the original Codecademy export file alongside a cleaned version. When Codecademy changes their export format in a future update, having the original lets you compare old and new column structures and update your Bubble field mapping without guesswork.

Expected result: You have a clean, inspected CSV file from Codecademy with known column names and correctly formatted numeric values, ready to map to Bubble fields.

2

Create the CodecademyProgress Data Type in Bubble

In the Bubble editor, click the Data tab in the left sidebar, then click 'Add a new type' and name it 'CodecademyProgress'. This Data Type holds one record per employee-course combination. Add the following fields by clicking 'Add a new field' for each: - employee_email (field type: text) — the learner's email address; this is your unique identifier for employees - employee_name (field type: text) — display name - department (field type: text) — add this even if Codecademy does not export it; you can populate it by joining with your HR data or by a manual column in the import spreadsheet - course_name (field type: text) — the full Codecademy course name - course_category (field type: text) — Python, JavaScript, SQL, Data Science, Web Development, etc. - course_url (field type: text) — the Codecademy course URL for the 'Open Course' button - completion_percentage (field type: number) — 0 to 100; must be a number type, not text - time_spent_minutes (field type: number) — total minutes spent; convert from hours if Codecademy exports in hours - last_activity_date (field type: date) — the date of last Codecademy activity for this course - import_batch (field type: text) — a label like '2026-07-07' that tracks which export batch each record came from; critical for identifying stale data After adding all fields, add privacy rules before any users access this app: Data tab → Privacy → Add a new rule for CodecademyProgress. Set a condition for admin users to 'View all fields'. For the non-admin default (no condition), leave all checkboxes unchecked — this blocks all access by default. Without privacy rules, any logged-in Bubble user can retrieve all employee records including emails and learning progress via a client-side search.

Pro tip: Create the Data Type with all fields before importing the CSV — Bubble's CSV Import tool maps columns to existing fields. If you add fields after importing, those columns will not be mapped and the import will need to run again.

Expected result: The CodecademyProgress Data Type exists in Bubble with all fields at the correct types. Privacy rules are applied. The Data tab shows the type ready for import in the App Data view.

3

Import the Codecademy CSV and handle the UPSERT pattern

In the Bubble editor, click the Data tab → App Data → click the 'CodecademyProgress' type in the left panel → click the 'CSV Import' button in the top-right of the data table view. In the CSV Import dialog, click 'Choose file' and select your cleaned Codecademy export CSV. Bubble shows a preview of column headers and lets you assign each column to a Bubble field. Use the dropdown on each row to map: - Codecademy's 'Employee Email' column → employee_email field - Codecademy's 'Course Name' column → course_name field - Codecademy's completion column → completion_percentage field (must be a number — no % symbol) - Codecademy's time column → time_spent_minutes field - Codecademy's last activity column → last_activity_date field For the import_batch field, you cannot set it via CSV Import directly — after the import completes, run a Workflow action: 'Make changes to a list of things' where you search for CodecademyProgress with import_batch is empty, and set import_batch to today's date formatted as a text string (e.g., 'Current date/time:formatted as YYYY-MM-DD'). For re-imports (weekly updates): before importing a new CSV, you need to prevent duplicate records. Build an UPSERT pattern using a Backend Workflow (paid plan) or a manual pre-import cleanup: Manual approach (any plan): In the Data tab → App Data, search for records where import_batch = the previous import date, and bulk-delete them before importing the new CSV. This ensures only the latest batch is in the database. Automated approach (paid plan): Create a Backend Workflow named 'delete_previous_batch' with a parameter for batch_date (text). In the workflow, add a 'Delete a list of things' action: search for CodecademyProgress where import_batch = batch_date. Before each new import, trigger this workflow for the previous batch date. After import, verify the data in App Data: check that completion_percentage populated as a number (not 0 or null), that last_activity_date parsed as a date (check a few rows with known dates), and that the record count matches your expected employee × course count.

Pro tip: If Bubble's CSV Import tool shows 'No match found' for a column, it means the column name in the CSV does not partially match any Bubble field name. Rename the Codecademy column in your spreadsheet to more closely match the Bubble field name (e.g., rename 'Learner Email' to 'employee_email'), then re-upload the CSV.

Expected result: The App Data tab shows CodecademyProgress records populated with learner data, including numeric completion percentages, correct dates, and the current import_batch label. No records have 0 for completion_percentage unless the learner truly has not started.

4

Build the team dashboard with Repeating Groups and aggregations

Create a new Bubble page named 'team-dashboard'. This is the main view for managers showing completion across the team. At the top of the page, add a row of stat Group elements: - 'Total enrolled': add a Text element with value: Search for CodecademyProgress :count - 'Completed': add a Text element: Search for CodecademyProgress with constraint completion_percentage = 100 :count - 'Avg completion': add a Text element: Search for CodecademyProgress :average of completion_percentage + '%' (formatted with :formatted as 0) - 'Total hours': add a Text element: Search for CodecademyProgress :sum of time_spent_minutes / 60 (formatted to 1 decimal place) Below the stats, add filter controls: - A Dropdown for department: set its choices to Search for CodecademyProgress's department :unique items (pulls unique department values from the database) - A Dropdown for course_category: Search for CodecademyProgress's course_category :unique items Add the main Repeating Group below the filters: - Data source: Search for CodecademyProgress with constraints from the filter Dropdowns (use :filtered or add constraints directly) - Layout: Full List with a fixed row height In the Repeating Group cell, add: - Text: Current cell's CodecademyProgress's employee_name - Text: Current cell's CodecademyProgress's course_name - Text: Current cell's CodecademyProgress's course_category - A progress bar: a horizontal Group with two nested Groups — the outer one set to full width, the inner one set to width = (Current cell's CodecademyProgress's completion_percentage)% using a condition on the inner Group's width - Text: 'Last active: ' + Current cell's CodecademyProgress's last_activity_date:formatted as [Day] [Month abbr] [Year] - A Button 'Open Course' with a workflow: Open external website → link to Current cell's CodecademyProgress's course_url, check 'Open in new tab' Add a 'Data as of: [date]' Text element somewhere visible — this is mandatory for a CSV-backed dashboard. Set its value to: Search for CodecademyProgress :last item's import_batch (or sort by import_batch descending and take the first item). This tells users the data freshness at a glance. Without this display, users will compare the Bubble dashboard to Codecademy's live admin view and incorrectly assume the integration is broken. For building multi-department views, RapidDev's team has extensive experience designing Bubble L&D portals with complex multi-source data — reach out for a free scoping call at rapidevelopers.com/contact.

Pro tip: Bubble's Search for... with :filtered runs entirely server-side and consumes WU per search. For high-traffic manager dashboards, consider adding a Search constraint for import_batch = [latest batch date] on all searches — this prevents Bubble from scanning the full historical record set and keeps WU consumption low.

Expected result: The team-dashboard page loads showing stat elements with aggregate totals, filter Dropdowns for department and course category, a Repeating Group of learner-course records with progress bars and 'Open Course' buttons, and a 'Data as of' timestamp showing the latest import batch date.

5

Build the at-risk learner view and import reminder workflow

Add a second tab or Group on the dashboard for 'At Risk' learners — employees who have not logged into Codecademy in the past 30 days and have not yet completed their course. Add a Repeating Group with data source: Search for CodecademyProgress with constraints: - last_activity_date < Current date/time + days(-30) - completion_percentage < 100 Sort by last_activity_date ascending (oldest first). In each cell: - Text: Current cell's CodecademyProgress's employee_name - Text: 'Course: ' + Current cell's CodecademyProgress's course_name - Text: 'Last active: ' + days since last_activity_date calculated as: (Current date/time - Current cell's CodecademyProgress's last_activity_date):in days + ' days ago' - Text: 'Progress: ' + Current cell's CodecademyProgress's completion_percentage + '%' - A Button 'Send Reminder' that opens a Send Email workflow action addressed to Current cell's CodecademyProgress's employee_email with a pre-built subject and body reminding them to continue their Codecademy course For the import reminder workflow (paid Bubble plan): go to the Backend Workflows section. Add a Recurring event named 'weekly_import_reminder' set to run every Monday at 8:00 AM. In the workflow, add a Send Email action to your admin email address with subject 'Weekly Codecademy import due' and body text reminding the admin to download a fresh CSV from the Codecademy for Teams admin portal and import it into Bubble. For the free-plan alternative: create a Bubble page visible only to admins with a large 'Import New Data' button that links to the Codecademy admin dashboard and a step-by-step text block explaining the export and import process. Add a bookmark this page to your browser hint so the admin knows exactly where to go each week. Note: 'Recurring events' and scheduled Backend Workflows require a paid Bubble plan (Starter or above). The Free plan cannot run scheduled workflows — a manual process is the only option on Free.

Pro tip: Set the at-risk threshold based on your organization's learning cadence — 30 days may be too long for a bootcamp with weekly check-ins but appropriate for a self-paced corporate L&D program. Make the threshold configurable via an 'App Settings' Data Type with a single record holding the 'days_before_at_risk' number field, so managers can adjust it without editing the Bubble editor.

Expected result: The at-risk tab shows a filtered Repeating Group of learners inactive for 30+ days with Send Reminder buttons. A recurring Backend Workflow (paid plan) or a bookmarked admin page (free plan) is in place to prompt weekly CSV imports.

6

Apply privacy rules and verify data freshness display

Before making your Bubble app live or sharing it with any non-admin users, verify all privacy controls are correctly applied. In the Data tab, click Privacy in the left panel. Click 'CodecademyProgress' in the type list. You should see at least one privacy rule. Verify: - There is a rule that allows admin users (however your app defines admin — a custom field on the User type, a User role field, or an admin user list) to 'View all fields' - The default row (no condition) has NO checkboxes checked — this means unauthenticated or non-admin users cannot retrieve any CodecademyProgress records If privacy rules are missing, click 'Add a new rule', set the condition (e.g., Current User's is_admin is yes), check 'View all fields' and 'Find this in searches', and save. Next, verify the 'Data as of' display on the dashboard. In preview mode (click the Preview button in the Bubble editor), check that the import_batch text element shows today's date (or the date of your last import). If it shows blank or a very old date, check that the import_batch field was populated after the last CSV import — re-run the 'Make changes to list where import_batch is empty' workflow if needed. Also verify the 'Open Course' buttons. In preview mode, click one 'Open Course' button and confirm it opens the correct Codecademy URL in a new tab. If the course_url field is blank for records imported from CSV (because Codecademy's export does not include URLs), add the course URLs manually via the Data tab → App Data → find the course records and add URLs, or add a course_url column to your spreadsheet before the next CSV import. Finally, document the import process for whoever runs it week to week: create an internal Bubble page titled 'Admin: Import Instructions' with step-by-step text covering (1) download CSV from Codecademy admin, (2) clean percentage column, (3) delete previous batch in App Data, (4) CSV Import → map fields, (5) run 'set import_batch' workflow. This prevents process drift when the admin changes.

Pro tip: Bubble's privacy rules do not apply to searches performed inside the Bubble editor's backend workflows by the app itself — they only restrict what clients (browsers) can query. Your Backend Workflows can always read all CodecademyProgress records regardless of privacy rules, which is the correct behavior for backend automation.

Expected result: Privacy rules are verified — non-admin users cannot retrieve CodecademyProgress records in a browser. The 'Data as of' element shows the correct import date. 'Open Course' buttons navigate to correct Codecademy URLs. The import process is documented and repeatable.

Common use cases

Corporate L&D coding skills dashboard

Build a Bubble dashboard for engineering managers that shows each team member's Codecademy course completion status across assigned learning paths. Filter by department or course category (Python, JavaScript, SQL), view average completion rates, and identify team members who have not logged into Codecademy in the past 30 days — all from Bubble's database populated by weekly CSV imports.

Bubble Prompt

Build a Repeating Group of CodecademyProgress records filtered by department Dropdown. Show employee_name, course_name, course_category, and a progress bar calculated from completion_percentage. Add stat Text elements above showing average completion across the team and total hours (time_spent_minutes / 60). Add a filter Dropdown for course_category with options Python, JavaScript, SQL.

Copy this prompt to try it in Bubble

Bootcamp student progress tracker

Build a Bubble app for a coding bootcamp that tracks student progress across assigned Codecademy courses. Students see their own progress; instructors see the full cohort view. An 'Open Course' button links each Codecademy course URL in a new tab so students never need to navigate away from your Bubble app to launch a lesson.

Bubble Prompt

Create a student dashboard page showing a Repeating Group of CodecademyProgress where employee_email = Current User's email. Show course_name, a progress bar from completion_percentage, and last_activity_date formatted as [Day] [Month]. Add an 'Open Course' button linking to the stored course_url field in a new tab.

Copy this prompt to try it in Bubble

Skills coverage heatmap for hiring and upskilling

Build a Bubble analytics page that maps completed Codecademy courses to skills taxonomy, then shows which skills are covered across the team and where gaps exist. Use Bubble's :count and :avg aggregations per course_category to build a department-by-skill grid, giving engineering leads data to inform hiring plans and learning pathway decisions.

Bubble Prompt

Build a skills coverage grid: for each course_category value, show a count of employees with completion_percentage >= 80 (proficient) vs total enrolled. Display as a Repeating Group with rows per course_category and columns per department using nested Repeating Groups filtered by both category and department.

Copy this prompt to try it in Bubble

Troubleshooting

CSV Import completes but completion_percentage shows as 0 for all records

Cause: The completion percentage column in the Codecademy export contains a percentage symbol (e.g., '67%' or '67.5%'), which causes Bubble's number field to silently reject the value during import and default to 0.

Solution: Open the CSV in a spreadsheet, select the completion percentage column, use Find & Replace to remove the '%' symbol, format the column as a plain number, save the file, and re-run the CSV import. Map the cleaned column to the completion_percentage Bubble field. Verify a few records in App Data after import to confirm numeric values populated correctly.

After re-importing a weekly CSV, duplicate records appear for the same employee-course combinations

Cause: Bubble's CSV Import always creates new records — it does not update existing ones. Without a pre-import cleanup or UPSERT workflow, each weekly import adds an entirely new set of records rather than updating the existing ones.

Solution: Before each new import, delete the previous batch's records: in App Data, filter CodecademyProgress records by the previous import_batch value and bulk-delete them. On a paid plan, automate this with a Backend Workflow that deletes all records where import_batch equals the previous date string before each new import runs.

Dashboard shows very different numbers from what the Codecademy admin panel shows

Cause: This is expected behavior — the Bubble dashboard shows data from the last CSV import, while Codecademy's admin panel reflects real-time learner activity. The discrepancy grows the longer the gap between imports.

Solution: This is an inherent limitation of the CSV-export approach — your Bubble data will always lag Codecademy's real-time state by the import interval. Ensure the 'Data as of [date]' element is prominently displayed on the dashboard so stakeholders understand the data freshness. If real-time accuracy is critical, contact your Codecademy account manager to explore any available live data feed options for enterprise accounts.

Codecademy admin dashboard does not show any export or data download option

Cause: Data export features are only available on Codecademy for Teams Business or Enterprise plans. Free, Plus, and Pro individual accounts have no team data export capability. The export feature may also have moved in a Codecademy interface update.

Solution: Verify your Codecademy account is on a Teams Business or Enterprise plan. Contact Codecademy support or your account manager to confirm that data export is included in your plan and to get the current location of the export feature in the admin interface — Codecademy's admin UI has been reorganized multiple times.

Privacy rules are set but logged-in users can still retrieve all CodecademyProgress records

Cause: Bubble privacy rules must be configured with a condition that correctly identifies non-admin users. If the condition references a field that is not set on most users (e.g., is_admin is yes when the field defaults to blank rather than false), the rule may not apply correctly.

Solution: In the Data tab → Privacy → CodecademyProgress, check the default rule row (the one with no condition). All field checkboxes in the default row must be unchecked to deny access by default. Then verify the admin rule condition: use 'Current User's is_admin is yes' rather than 'is not no', as Bubble treats blank differently from false. Test in preview mode with a non-admin user account to confirm records are not retrievable.

Best practices

  • Display a 'Data as of [import_batch date]' indicator prominently on every dashboard page — users who compare the Bubble view to Codecademy's live admin panel will see discrepancies, and without a timestamp they will incorrectly assume the integration is broken rather than understanding the data is from the last weekly import.
  • Add privacy rules to the CodecademyProgress Data Type before sharing the app with any non-admin users — without rules, any logged-in Bubble user can retrieve all employee email addresses, course progress, and last activity dates via a client-side database search.
  • Perform an UPSERT cleanup before each weekly import — either delete the previous batch's records in App Data or use a Backend Workflow (paid plan) to remove old records before inserting new ones, to prevent duplicate rows that inflate all count and average aggregations.
  • Spot-check Codecademy's CSV column names on every new export before importing — Codecademy has updated their admin interface multiple times and column names have changed; a silent column name mismatch maps data to the wrong Bubble field or leaves fields empty.
  • Add an import_batch text field to every CodecademyProgress record and populate it with the export date after each import — this lets you identify which records came from which export, quickly spot data freshness issues, and clean up old batches without affecting current data.
  • Use Bubble's :count and :average aggregations in your Repeating Group data source rather than calculating in workflows — server-side aggregations are fast, consume fewer WU, and stay accurate as the dataset grows.
  • Build the 'Open Course' External Link action so learners can launch Codecademy course URLs from your Bubble app — even without a live API, giving learners a single-pane portal that launches the actual Codecademy content significantly improves adoption of the dashboard.
  • If your organization's HR system contains department and manager data, create a separate Bubble Data Type for employees and join it with CodecademyProgress on employee_email — this adds department filtering and manager-based views without requiring Codecademy to export organizational hierarchy data.

Alternatives

Frequently asked questions

Does Codecademy have a REST API I can use with Bubble's API Connector?

No. Codecademy does not offer a publicly documented REST API for third-party integrations. There are no API keys to generate, no OAuth flow to configure, and no webhooks. Any resource claiming otherwise is using unofficial undocumented endpoints that can break without notice. The only reliable Bubble integration is the CSV-export companion approach described in this guide.

What data can I export from Codecademy for Teams?

Codecademy for Teams admin exports typically include employee email addresses, employee names, course names, course categories, enrollment dates, completion percentages, total time spent, and last activity dates. The exact fields and format depend on your plan tier and Codecademy's current admin interface version. Enterprise plans may offer more detailed exports including individual lesson completions. Navigate to your Teams admin dashboard's Reports or Analytics section — the export option location has changed across Codecademy interface updates, so check all admin navigation sections if it is not immediately visible.

How often should I import fresh Codecademy data into Bubble?

Weekly imports are sufficient for most L&D and bootcamp tracking use cases — learning progress does not change rapidly enough to require daily updates. Monthly imports work for compliance reporting. The most important thing is consistency: export and import on a fixed schedule and display the 'Data as of' timestamp prominently so stakeholders always know the data freshness. Irregular imports where stakeholders are unsure when the data was last updated cause more confusion than a predictable weekly cadence.

Do I need a paid Bubble plan to use this integration?

No — Bubble's CSV Import tool and Repeating Group dashboards work on any plan including Free. You can build the full companion dashboard, import data, and display all analytics on a free Bubble account. A paid plan (Starter or above) is only required for scheduled Backend Workflows (e.g., automated weekly import reminder emails) and the 'Schedule API Workflow on a list' action for bulk operations.

What should I do if Codecademy changes their CSV export column names?

Each time you download a new CSV, open it in a spreadsheet and check the header row before importing. If Codecademy has renamed a column, remap it manually in Bubble's CSV Import field mapping dialog — use the dropdown on each column to assign it to the correct Bubble field. This is why the import_batch field is useful: if you import a CSV with a silently misnamed column (e.g., last activity date stops populating), you can trace which import batch is affected and re-import that batch after fixing the column mapping.

How do I prevent learner email addresses and progress data from being visible to all logged-in users?

Add privacy rules to the CodecademyProgress Data Type immediately: Data tab → Privacy → Add a new rule for CodecademyProgress. Set a condition for admin users to allow 'View all fields'. In the default row (no condition), leave all checkboxes unchecked — this blocks all access by default. Without these rules, any logged-in user in your Bubble app can retrieve all employee email addresses and completion data via a standard client-side search. Bubble's database is not private by default.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Integrations are where projects stall

We wire Bubble integrations like this one every week — auth, webhooks, edge cases included. Fixed-price builds from $13K, delivered in 6–10 weeks.

Talk to an integration engineer

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.