diff --git a/CLAUDE.md b/CLAUDE.md
index 2d68d14..097a5a4 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -809,6 +809,102 @@ WooCommerce has different hooks for different product types in the admin product
**Lesson:** When adding admin UI for variable product parents, use `woocommerce_product_options_general_product_data` and check `$product->is_type('variable')` to conditionally display. Using `woocommerce_product_options_pricing` will cause forms to never appear for variable products (as discovered in v1.2.6 → v1.2.7 fix).
+#### CRITICAL: Currency Symbol Display (Learned in v1.2.8)
+
+When displaying currency symbols in admin interface table headers and input placeholders:
+
+**Table Headers:**
+
+```php
+// ✅ Correct - Use printf with translation and WooCommerce currency function
+
|
+
+// ❌ Wrong - Hard-coded or missing currency
+ |
+ |
+```
+
+**Twig Template Placeholders:**
+
+```twig
+{# ✅ Correct - Pass currency_symbol from PHP and concatenate in template #}
+placeholder="{{ ('e.g., 9.99 ' ~ currency_symbol)|__('wc-tier-package-prices') }}"
+
+{# ❌ Wrong - Hard-coded or missing currency #}
+placeholder="{{ 'e.g., 9.99'|__('wc-tier-package-prices') }}"
+placeholder="{{ 'e.g., 9.99 €'|__('wc-tier-package-prices') }}"
+```
+
+**Implementation Pattern:**
+
+1. In PHP render methods, pass currency symbol to Twig: `'currency_symbol' => get_woocommerce_currency_symbol()`
+2. In Twig templates, concatenate using `~` operator: `'text ' ~ currency_symbol`
+3. Always use WooCommerce's `get_woocommerce_currency_symbol()` - never hard-code currency symbols
+
+**Affected Methods:** All template render methods must pass `currency_symbol`:
+
+- `render_tier_row()`
+- `render_package_row()`
+- `render_variation_tier_row()`
+- `render_variation_package_row()`
+
+#### CRITICAL: Post Meta Deletion vs. Empty Arrays (Learned in v1.2.8)
+
+When saving product meta data, WordPress distinguishes between "no data" (deleted meta) and "empty data" (empty array saved as meta):
+
+**Problem Pattern:**
+
+```php
+// ❌ WRONG - Saves empty array when all entries removed
+if (isset($_POST['_wc_tpp_tiers'])) {
+ $tiers = array();
+ foreach ($_POST['_wc_tpp_tiers'] as $tier) {
+ if (!empty($tier['min_qty']) && !empty($tier['price'])) {
+ $tiers[] = array(...);
+ }
+ }
+ update_post_meta($post_id, '_wc_tpp_tiers', $tiers); // Saves [] if no valid entries
+} else {
+ delete_post_meta($post_id, '_wc_tpp_tiers');
+}
+```
+
+**Correct Pattern:**
+
+```php
+// ✅ CORRECT - Deletes meta when no valid entries exist
+if (isset($_POST['_wc_tpp_tiers'])) {
+ $tiers = array();
+ foreach ($_POST['_wc_tpp_tiers'] as $tier) {
+ if (!empty($tier['min_qty']) && !empty($tier['price'])) {
+ $tiers[] = array(...);
+ }
+ }
+ // Only save if we have valid entries, otherwise delete
+ if (!empty($tiers)) {
+ update_post_meta($post_id, '_wc_tpp_tiers', $tiers);
+ } else {
+ delete_post_meta($post_id, '_wc_tpp_tiers');
+ }
+} else {
+ delete_post_meta($post_id, '_wc_tpp_tiers');
+}
+```
+
+**Why This Matters:**
+
+- Empty arrays `[]` saved via `update_post_meta()` persist in database as serialized empty arrays
+- Frontend/cart code checking `if ($tiers)` will evaluate `[]` as falsy, but meta still exists in database
+- Database queries like `get_post_meta()` return `[]` instead of `false`, causing subtle bugs
+- Properly deleting meta keeps database clean and prevents "ghost" configurations
+
+**Affected Methods in v1.2.8:**
+
+- `save_tier_package_fields()` - Simple and variable parent products
+- `save_variation_pricing_fields()` - Individual variations
+
+**Rule:** Always check `if (!empty($array))` before calling `update_post_meta()` for array data. If empty, call `delete_post_meta()` instead.
+
### When Adding Features
- Follow the existing pattern: add setting → add UI → add logic → add template