Custom Filament Sync to Printer -H2C

Is this a bug or did I forget how to do this?

I have custom filament profiles for the h2c in Bambu Studio, but I cannot get them to sync to the printer. I was thinking the way this is done is to click the button in the upper right corner on the filament edit screen on the printer?

Studio:

H2C:

On my X1c:

On the printer, edit filament, on your screenshot to the right of the PLA there is a round circle arrow, tap that to sync the printer with your custom filaments

My last H2d picture shows that I have tried that. That is the “updating user filaments”

So I was having the same issue with my H2C and AMS 2 PRO and AMS HT not showing the custom filaments I created, I was going crazy, this may not work for you but for me in the custom filaments section in Bambu Studio all the way at the end of the list I had an “Action required” filament I clicked the edit icon deleted it and all of a sudden they now reappeared in the AMS’s screen. I guess at some point I made a filament profile and it wasn’t complete so it was causing a sync issue with the AMS’s I hope this helps anyone.

sorry I clicked the settings cog in the project filaments tab on the prepare tab then went to custom filaments if that wasn’t clear sorry :frowning:

1 Like

Yes of course, you can not just edit a filament and save it. Even though it is then selectable as a custom filaments on the left, it is not the correct type to sync to the printer.

We must create a custom filament using the cog in the project filaments header.

I solved “my” issue, which really seems to be an issue with the profiles Polymaker has listed for the H2C on their profile page. I had to edit some fields in their JSON files and they all did finally sync over to the printer as expected. Just like they did on the other Bambu printers I own

Bionicbone, you are rambling complete nonsense

Lol, I don’t think so but I am glad you sorted it

How exactly did you do that? I can’t seem to create this in H2C.

Bambu Studio / H2C — Polymaker Filament Profile Sync Fix

How to get manufacturer-provided filament profiles to sync to your printer


Disclaimer

This guide documents the specific approach we developed and validated for our own setup. It worked for us on Bambu Studio 2.6.0.51 with the H2C, and we are sharing it in case it helps others in the same situation.

We are not claiming this is the only way to solve this problem, the officially supported method, or the approach Bambu or Polymaker would recommend. There may be other ways to achieve the same result. We explored this path, it worked, and we have no interest in debating alternative approaches.

Use it as-is, adapt it to your needs, or ignore it entirely — your call.


The Problem

Polymaker provides H2C filament profile JSON files for Bambu Studio via their website.

These files are designed for Polymaker’s own import pipeline and use a thin “template” format that Bambu Studio’s cloud sync does not recognize as a valid profile for the H2C.

As a result, when you import these files into Bambu Studio via File → Import → Import Configs, they appear in Studio but will not sync to your printer for selection during printing.

Profiles that Bambu Studio creates itself (via the “Create Custom Filament” workflow) do sync correctly. The difference is structural — the manufacturer files contain vendor metadata fields and use template inheritance instead of self-contained settings.


Root Cause

The manufacturer JSON files contain fields that identify them as official vendor presets rather than user-created profiles:

Field Value in Manufacturer File Effect
type "filament" Marks as a system-registered preset
instantiation "true" Triggers formal preset registration path
setting_id "GFSL99_20" (same on all files) Vendor placeholder ID — conflicts with sync validation
include ["fdm_filament_template_direct_dual"] Relies on template inheritance instead of explicit values
idle_temperature 0 Part of the vendor preset schema
description " " Vendor metadata field
bed_type ["Cool Plate"] Vendor metadata field
filament_id e.g. PMPL09, PMHT01 Non-Pa format — not recognized as user preset ID

What the include line was doing

The "include": ["fdm_filament_template_direct_dual"] line was telling Studio: “go grab a set of standard default fields from our built-in master template, and apply them to this profile.” That template lives inside Bambu Studio’s installation files. Polymaker’s JSON files were intentionally thin because their import pipeline would inject those template fields automatically at load time.

The problem is that Bambu Studio’s cloud sync system does not go through that same template-loading process — it reads the JSON as-is. A profile that depends on template inheritance is effectively incomplete from the sync system’s perspective, so it never gets registered for printer sync.

Additionally, Bambu Studio expects user preset filament IDs to follow the format Pa followed by 6 hexadecimal characters (e.g. Pa4587dd). Vendor-style IDs like PMPL09 are not recognized as user-created profiles and may be rejected or ignored by the sync system.


The Fix

The fix is to convert each manufacturer JSON into the fully self-contained format that Bambu Studio uses for its own user presets. This involves:

  • Removing the vendor metadata fields
  • Explicitly adding all the fields the template inheritance would have provided, using values from a confirmed working Studio-created Polymaker profile as the baseline
  • Renaming the profile to use the full Bambu Lab printer name convention
  • Replacing the vendor filament_id with a valid Pa+hex user ID

Note on field values: The fields we add are sourced from a confirmed working Studio-created profile, not purely from the raw template defaults. Several values intentionally differ from the raw template — this reflects Polymaker’s own overrides of those defaults. The script never overwrites values already present in the manufacturer file, so all per-filament settings (density, flow ratio, temperatures, etc.) are always preserved exactly as Polymaker provided them.


Step-by-Step Fix

Option A — Manual Fix (Single File)

Use this approach for one or two files, or to understand what the automated script does.

Step 1: Open the JSON file in a text editor

Open the manufacturer-provided JSON file in any plain text editor (Notepad, VS Code, Notepad++, etc.).

Step 2: Remove these fields entirely

Delete the following key-value pairs from the file:

"type": "filament",
"instantiation": "true",
"setting_id": "GFSL99_20",
"include": ["fdm_filament_template_direct_dual"],
"idle_temperature": 0,
"description": " ",
"bed_type": ["Cool Plate"],

Step 3: Replace the filament_id

Change the filament_id from the vendor format to a Pa+hex format. Generate a unique value by replacing XXXXXX with 6 random hexadecimal characters (0–9, a–f):

"filament_id": "PaXXXXXX",

Examples: Pa4f8a2c, Pa1b9e37, Pad05c1a

Important: Make sure each filament profile you fix has a different filament_id value. Do not reuse the same ID across multiple profiles.

On the Pa prefix: Bambu Studio generates IDs in Pa+6hex format internally, and this is what the script produces. However, testing with profiles from other manufacturers shows that P+hex IDs (without the a) also sync correctly — the critical factors are uniqueness and not conflicting with a vendor catalog ID. The Pa format is the safest choice, but not the only one that works.

Step 4: Update the name and filament_settings_id

Change both the name field and the filament_settings_id field to use the full Bambu Lab printer name. Replace @BBL H2C with @Bambu Lab H2C 0.4 nozzle:

"name": "Panchroma PLA Neon @Bambu Lab H2C 0.4 nozzle",
"filament_settings_id": ["Panchroma PLA Neon @Bambu Lab H2C 0.4 nozzle"],

Step 5: Add the missing fields

Because the include template inheritance has been removed, you must explicitly add the fields it would have injected. The values below are sourced from a confirmed working Studio-created Polymaker profile. Most match the raw fdm_filament_template_direct_dual template — where they differ, the values reflect Polymaker’s own intended overrides of the template defaults (noted in comments in the Python script).

Only add fields that are not already present in your file. The filament-specific fields (density, flow ratio, temperatures, fan speeds, etc.) are already in the manufacturer file and should not be changed.

"from": "User",
"inherits": "",
"activate_air_filtration": ["0"],
"chamber_temperatures": ["0"],
"circle_compensation_speed": ["200"],
"compatible_printers_condition": "",
"compatible_prints": [],
"compatible_prints_condition": "",
"complete_print_exhaust_fan_speed": ["70"],
"cooling_perimeter_transition_distance": ["10"],
"cooling_slowdown_logic": ["uniform_cooling"],
"counter_coef_1": ["0"],
"counter_coef_2": ["0.0025"],
"counter_coef_3": ["0.014"],
"counter_limit_max": ["0.076"],
"counter_limit_min": ["0.014"],
"default_filament_colour": [""],
"diameter_limit": ["50"],
"during_print_exhaust_fan_speed": ["70"],
"enable_overhang_bridge_fan": ["1"],
"enable_pressure_advance": ["0"],
"filament_adaptive_volumetric_speed": ["0", "0"],
"filament_adhesiveness_category": ["100"],
"filament_bridge_speed": ["25", "25"],
"filament_deretraction_speed": ["nil", "nil"],
"filament_dev_ams_drying_ams_limitations": ["1", "0"],
"filament_dev_ams_drying_heat_distortion_temperature": ["45"],
"filament_dev_ams_drying_temperature": ["45", "45", "45", "45"],
"filament_dev_ams_drying_time": ["12", "12", "12", "12"],
"filament_dev_chamber_drying_bed_temperature": ["70"],
"filament_dev_chamber_drying_time": ["12.0"],
"filament_dev_drying_cooling_temperature": ["45"],
"filament_dev_drying_softening_temperature": ["50"],
"filament_enable_overhang_speed": ["1", "1"],
"filament_extruder_compatibility": ["0"],
"filament_flush_temp": ["0", "0"],
"filament_flush_volumetric_speed": ["0", "0"],
"filament_long_retractions_when_cut": ["nil", "nil"],
"filament_metal_stickiness": ["None"],
"filament_notes": "",
"filament_overhang_1_4_speed": ["0", "0"],
"filament_overhang_2_4_speed": ["50", "50"],
"filament_overhang_3_4_speed": ["30", "30"],
"filament_overhang_4_4_speed": ["10", "10"],
"filament_overhang_totally_speed": ["10", "10"],
"filament_pre_cooling_temperature": ["0", "0"],
"filament_printable": ["3"],
"filament_ramming_volumetric_speed": ["-1", "-1"],
"filament_ramming_volumetric_speed_nc": ["-1", "-1"],
"filament_retract_before_wipe": ["nil", "nil"],
"filament_retract_restart_extra": ["nil", "nil"],
"filament_retract_when_changing_layer": ["nil", "nil"],
"filament_retraction_distances_when_cut": ["nil", "nil"],
"filament_retraction_minimum_travel": ["nil", "nil"],
"filament_retraction_speed": ["nil", "nil"],
"filament_scarf_gap": ["15%"],
"filament_scarf_height": ["10%"],
"filament_scarf_length": ["10"],
"filament_scarf_seam_type": ["none"],
"filament_shrink": ["100%"],
"filament_tower_interface_pre_extrusion_dist": ["10"],
"filament_tower_interface_pre_extrusion_length": ["0"],
"filament_tower_interface_print_temp": ["-1"],
"filament_tower_interface_purge_volume": ["20"],
"filament_tower_ironing_area": ["4"],
"filament_velocity_adaptation_factor": ["1"],
"filament_z_hop": ["nil", "nil"],
"first_x_layer_part_fan_speed": ["0"],
"hole_coef_1": ["0"],
"hole_coef_2": ["-0.0028"],
"hole_coef_3": ["0.12"],
"hole_limit_max": ["0.12"],
"hole_limit_min": ["0.05"],
"impact_strength_z": ["10.0"],
"ironing_fan_speed": ["-1"],
"long_retractions_when_ec": ["1", "1"],
"no_slow_down_for_cooling_on_outwalls": ["0"],
"overhang_threshold_participating_cooling": ["95%"],
"override_process_overhang_speed": ["0", "0"],
"pressure_advance": ["0.02"],
"retraction_distances_when_ec": ["10", "10"],
"supertack_plate_temp": ["40"],
"supertack_plate_temp_initial_layer": ["40"],
"volumetric_speed_coefficients": ["0 0 0 0 0 0", "0 0 0 0 0 0"]

Where these values come from: Values follow the full inheritance chain for the H2C:

  • fdm_filament_common — base defaults for all filaments
  • fdm_filament_pla — PLA-specific overrides (fan speeds, drying temps, etc.)
  • fdm_filament_template_direct_dual — dual extruder field expansions
  • Bambu PLA Basic @BBL H2C — H2C printer-specific calibration (hole/counter compensation coefficients, supertack plate temps)

Fields already present in the manufacturer file are never overwritten

On compensation coefficients: The hole/counter compensation values from Bambu PLA Basic @BBL H2C are a solid, well-calibrated baseline for the H2C. Some manufacturers use their own measured values that differ slightly — this is legitimate and intentional on their part. If a profile you are working with already has its own compensation coefficients set, preserve them rather than overwriting with the H2C defaults.

Step 6: Save and import

Save the file, then in Bambu Studio go to File → Import → Import Configs and select the edited JSON. Fully close and relaunch Bambu Studio, then check if the profile appears in the printer sync list.


Option B — Automated Python Script (Batch Fix)

Use this approach for multiple files. The script processes any number of manufacturer JSON files and outputs corrected versions ready to import.

Requirements:

  • Python 3.x (standard installation, no additional packages needed)
  • The manufacturer JSON files downloaded from Polymaker’s website

Step 1: Save the script

Create a file called fix_filaments.py with the following content:

import json, os, random

FIELDS_TO_REMOVE = {
    "type", "instantiation", "setting_id",
    "include", "idle_temperature", "description", "bed_type"
}

# These fields are added only if not already present in the file.
# Values are sourced from a confirmed working Studio-created Polymaker profile.
# Where values differ from the raw fdm_filament_template_direct_dual defaults,
# they reflect Polymaker's own intended overrides of those defaults.
FIELDS_TO_ADD = {
    "from": "User",
    "inherits": "",
    "activate_air_filtration": ["0"],
    "chamber_temperatures": ["0"],
    "circle_compensation_speed": ["200"],
    "compatible_printers_condition": "",
    "compatible_prints": [],
    "compatible_prints_condition": "",
    "complete_print_exhaust_fan_speed": ["70"],
    "cooling_perimeter_transition_distance": ["10"],
    "cooling_slowdown_logic": ["uniform_cooling"],
    "counter_coef_1": ["0"],
    "counter_coef_2": ["0.0025"],
    "counter_coef_3": ["0.014"],
    "counter_limit_max": ["0.076"],
    "counter_limit_min": ["0.014"],
    "default_filament_colour": [""],
    "diameter_limit": ["50"],
    "during_print_exhaust_fan_speed": ["70"],
    "enable_overhang_bridge_fan": ["1"],
    "enable_pressure_advance": ["0"],
    "filament_adaptive_volumetric_speed": ["0", "0"],
    "filament_adhesiveness_category": ["100"],
    "filament_bridge_speed": ["25", "25"],
    "filament_deretraction_speed": ["nil", "nil"],
    "filament_dev_ams_drying_ams_limitations": ["1", "0"],
    "filament_dev_ams_drying_heat_distortion_temperature": ["45"],
    "filament_dev_ams_drying_temperature": ["45", "45", "45", "45"],
    "filament_dev_ams_drying_time": ["12", "12", "12", "12"],
    "filament_dev_chamber_drying_bed_temperature": ["70"],
    "filament_dev_chamber_drying_time": ["12.0"],
    "filament_dev_drying_cooling_temperature": ["45"],
    "filament_dev_drying_softening_temperature": ["50"],
    "filament_enable_overhang_speed": ["1", "1"],
    "filament_extruder_compatibility": ["0"],
    "filament_flush_temp": ["0", "0"],
    "filament_flush_volumetric_speed": ["0", "0"],
    "filament_long_retractions_when_cut": ["nil", "nil"],
    "filament_metal_stickiness": ["None"],
    "filament_notes": "",
    "filament_overhang_1_4_speed": ["0", "0"],
    "filament_overhang_2_4_speed": ["50", "50"],  # template default: ["50","50"]
    "filament_overhang_3_4_speed": ["30", "30"],  # template default: ["30","30"]
    "filament_overhang_4_4_speed": ["10", "10"],  # template default: ["10","10"]
    "filament_overhang_totally_speed": ["10", "10"],
    "filament_pre_cooling_temperature": ["0", "0"],
    "filament_printable": ["3"],
    "filament_ramming_volumetric_speed": ["-1", "-1"],
    "filament_ramming_volumetric_speed_nc": ["-1", "-1"],
    "filament_retract_before_wipe": ["nil", "nil"],
    "filament_retract_restart_extra": ["nil", "nil"],
    "filament_retract_when_changing_layer": ["nil", "nil"],
    "filament_retraction_distances_when_cut": ["nil", "nil"],
    "filament_retraction_minimum_travel": ["nil", "nil"],
    "filament_retraction_speed": ["nil", "nil"],
    "filament_scarf_gap": ["15%"],
    "filament_scarf_height": ["10%"],
    "filament_scarf_length": ["10"],
    "filament_scarf_seam_type": ["none"],
    "filament_shrink": ["100%"],
    "filament_tower_interface_pre_extrusion_dist": ["10"],
    "filament_tower_interface_pre_extrusion_length": ["0"],
    "filament_tower_interface_print_temp": ["-1"],
    "filament_tower_interface_purge_volume": ["20"],
    "filament_tower_ironing_area": ["4"],
    "filament_velocity_adaptation_factor": ["1"],
    "filament_z_hop": ["nil", "nil"],
    "first_x_layer_part_fan_speed": ["0"],
    "hole_coef_1": ["0"],
    "hole_coef_2": ["-0.0028"],
    "hole_coef_3": ["0.12"],
    "hole_limit_max": ["0.12"],
    "hole_limit_min": ["0.05"],
    "impact_strength_z": ["10.0"],
    "ironing_fan_speed": ["-1"],
    "long_retractions_when_ec": ["1", "1"],      # template default: ["1","1"]
    "no_slow_down_for_cooling_on_outwalls": ["0"],
    "overhang_threshold_participating_cooling": ["95%"],
    "override_process_overhang_speed": ["0", "0"],
    "pressure_advance": ["0.02"],
    "retraction_distances_when_ec": ["10", "10"],
    "supertack_plate_temp": ["40"],
    "supertack_plate_temp_initial_layer": ["40"],
    "volumetric_speed_coefficients": ["0 0 0 0 0 0", "0 0 0 0 0 0"],   # template default: ["0 0 0 0 0 0","0 0 0 0 0 0"]
}

def gen_id():
    return 'Pa' + ''.join(random.choices('0123456789abcdef', k=6))

input_dir = './input'    # folder containing original JSON files
output_dir = './output'  # folder for fixed JSON files
os.makedirs(output_dir, exist_ok=True)

for fname in os.listdir(input_dir):
    if not fname.endswith('.json'):
        continue
    with open(os.path.join(input_dir, fname)) as f:
        data = json.load(f)

    # Remove vendor metadata fields
    for field in FIELDS_TO_REMOVE:
        data.pop(field, None)

    # Add missing fields (never overwrites existing filament-specific values)
    for field, value in FIELDS_TO_ADD.items():
        if field not in data:
            data[field] = value

    # Fix name and filament_settings_id
    old_name = data.get('name', '')
    new_name = old_name.replace('@BBL H2C', '@Bambu Lab H2C 0.4 nozzle')
    data['name'] = new_name
    data['filament_settings_id'] = [new_name]

    # Replace non-Pa filament_id with generated user ID
    if not data.get('filament_id', '').startswith('Pa'):
        data['filament_id'] = gen_id()

    out_path = os.path.join(output_dir, new_name + '.json')
    with open(out_path, 'w') as f:
        json.dump(data, f, indent=4)

    print('Fixed:', new_name)

Step 2: Organize your files

  1. Create a folder called input and place all manufacturer JSON files in it
  2. Create an empty folder called output next to it
  3. Place fix_filaments.py in the same parent folder
fix_filaments.py
input/
    Panchroma PLA Neon @BBL H2C - BambuStudio.json
    PolyLite PLA @BBL H2C - BambuStudio.json
    ... (all your manufacturer JSON files)
output/
    (empty — script will populate this)

Step 3: Run the script

Open a terminal or command prompt in the folder containing the script and run:

python fix_filaments.py

The fixed JSON files will appear in the output folder.

Step 4: Import into Bambu Studio

  1. In Bambu Studio, go to File → Import → Import Configs
  2. Select all the fixed JSON files from the output folder
  3. Fully close and relaunch Bambu Studio
  4. Check that the profiles now appear and sync to your printer

What the Fix Preserves

The conversion only changes structural metadata. All manufacturer-specified print settings are preserved exactly as provided, including:

Setting Notes
Nozzle temperature Per-filament (e.g. 220°C for PLA, 240°C for PETG)
Bed temperatures Per-plate-type and per-filament
Flow ratio Per-filament (e.g. 0.96, 0.98, 1.01)
Filament density Per-filament (e.g. 1.17, 1.23, 1.37)
Max volumetric speed Per-filament (e.g. 15 or 12 for filled/specialty)
Temperature vitrification Per-filament
Fan speeds Per-filament type (PLA vs PETG differ significantly)
Nozzle temperature range Per-filament (affects temp slider bounds in Studio)
slow_down_min_speed Preserved from Polymaker’s file at 20 (template default is 10, but Polymaker explicitly set this)
All other Polymaker overrides Script never overwrites values already present in the file

Profiles That Don’t Need Fixing

Not all third-party H2C profiles have the sync issue described in this guide. The problem is specific to profiles using Polymaker’s thin template format, identifiable by the presence of type, instantiation, setting_id, and include fields.

Profiles already in the fully self-contained format — with "from": "User", no include line, and all fields explicitly set — will import and sync without any modification. Before running the fix, check your file for those four fields. If they’re not there, you’re already good.

A quick way to check in any text editor: open the file and search for "include". If it’s not found, the profile is almost certainly in the correct format already.


Additional Notes

  • PETG profiles: PETG files have very different settings from PLA (higher temps, lower fan speeds, different cooling logic). The script handles these correctly — just be aware PETG profiles will look quite different from PLA ones in Studio.

  • Other manufacturers: Any third-party manufacturer using the same thin template format (identifiable by the presence of type, instantiation, setting_id, and include fields) will have the same sync issue and can be fixed the same way.

  • Bambu Studio version: Confirmed on Bambu Studio 2.6.0.51. The fix may not be necessary on future versions if Bambu updates their import pipeline to handle vendor preset formats.

  • Unique filament IDs: Each profile must have a unique filament_id. The script generates random Pa+hex IDs to ensure uniqueness. Do not copy the same ID across multiple profiles.

  • Value sourcing: Values follow the full inheritance chain: fdm_filament_common → fdm_filament_pla → fdm_filament_template_direct_dual → H2C-specific calibration from Bambu PLA Basic @BBL H2C. The hole/counter compensation coefficients and supertack plate temps are hardware-calibrated values set by Bambu specifically for the H2C. These are a solid baseline — some manufacturers use their own measured compensation values that differ slightly, which is intentional and valid. Fields already in the manufacturer files are never overwritten.


Scrogs — Bambu Lab H2C Filament Profile Fix Guide — April 2026

2 Likes