{
  "slug": "bw-lead-ai",
  "name": "BW Lead Attribution Intelligence",
  "version": "1.0.0",
  "download_url": "https://plugins.bowden.works/wp-content/uploads/plugin-updates/bw-lead-ai-1.0.0.zip",
  "download_hash": "sha256:f421e50c8b3e3a9f4b144f101afb72c7ea9de20991af8a25f7ad42327fe9f00c",
  "download_size": 215229,
  "requires": "6.0",
  "tested": "",
  "requires_php": "7.4",
  "last_updated": "2026-04-13",
  "homepage": "https://plugins.bowden.works/bw-lead-ai/",
  "author": "Bowden Works",
  "description": "Capture traffic source, attribute it to every lead, and understand where your leads are coming from.",
  "changelog": "## [1.0.0] - 2026-04-13\n\nFirst stable release. Graduates the plugin from pre-1.0 pilot status now that the\nunified mapping format, channel resolution, custom dimensions, and full summary\noutput have all settled down and tested end-to-end on a live Gravity Forms site.\n\n### Fixed\n- **Source/medium separator no longer loses its spaces on save.** The default\n  separator is `\" / \"` (with spaces), but WordPress's `sanitize_text_field()`\n  trims whitespace, so the first time a user hit Save Changes the separator\n  silently became `\"/\"` and `{bw:source_medium}` rendered as `google/cpc`\n  instead of `google / cpc`. The separator now uses a dedicated sanitizer that\n  strips tags and control characters but preserves leading and trailing\n  whitespace. Users can keep `\" / \"`, `\" • \"`, `\" — \"`, or whatever they like.\n- **Invalid Parameter Aliases rows are now stripped on save, not just hidden on\n  render.** Previously, saving a row with a reserved merge-tag label (e.g.\n  `summary : foo, bar`) would emit a validation error but still write the row\n  to the database — the parser dropped it on render, so the UI stayed clean,\n  but the stored option carried a zombie row forever. Validation now\n  surfaces the error AND strips the offending row from the saved string, so\n  the stored state matches what the UI shows.\n- **Test tab custom-dimension display label.** The URL simulator result table\n  showed custom dimensions as `custom.match_type` — a leftover from before the\n  0.8.0 format change when tags were `{bw:custom.key}`. It now shows the\n  unprefixed `{bw:match_type}` label so the Test tab matches what the Help tab\n  lists and what you actually type into hidden form fields.\n\n### Notes\n- No schema or settings migrations required. Sites already running 0.8.x will\n  keep their existing settings as-is; the separator fix only applies the next\n  time the settings form is saved. Users with a mangled `\"/\"` separator can\n  open Settings, retype `\" / \"` into the Formatting & Debug section, and save."
}
