View Source Changelog

All notable changes to this project are documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

Unreleased

0.2.0 - 2026-09-02

Coverage and packaging since the first Hex release. Breaking for inbound webhooks: add ex_pipedrive_web if you used ExPipedrive.Incoming.Handler from core.

Added

  • Run Dialyzer in CI on the primary Elixir 1.17 matrix cell with PLT caching; document mix dialyzer in the local quality gate (#84).
  • Optional sibling package ex_pipedrive_phoenix (packages/ex_pipedrive_phoenix) for marketplace OAuth install helpers (independent of Überauth) (#21).
  • Optional sibling package ex_pipedrive_oban (packages/ex_pipedrive_oban) with cursor-aware Oban sync workers and rate-limit snooze (#20).
  • Optional sibling package ex_pipedrive_web (packages/ex_pipedrive_web) with inbound webhook Plug helpers; Event structs stay in core (#82).
  • Expand ExPipedrive.Webhook.Event beyond deal/person: typed decode for organization, activity, lead, note, product, pipeline, stage, user, activityType, deal_product, deal_installment, project, task, and board; v1 merged plus v2 create/change/delete; real v2 payloads synthesize an event name from meta.action/meta.entity; unknown resources stay maps (#81).

Fixed

  • ExPipedrive.Users.find_users_by_name/3 matched atom-key response bodies (%{success: true, data: data}) and silently returned no matches against Jason-decoded (string-key) JSON. Now matches %{"data" => data} like every other resource module (#67).
  • Preserve API-provided lead value currencies and leave bare numeric values currency-less.

Changed

  • Inbound webhook PlugExPipedrive.Incoming.Handler moved to sibling package ex_pipedrive_web as ExPipedriveWeb.Incoming.Handler (old module names remain compatibility aliases there). Core no longer depends on Plug (#82).
  • Facade / twin cleanup — Document blessed path (ExPipedrive.Deals.get/2, list_page/2, stream/2, …). Soft-deprecate legacy v1 twin names on resource modules and the root facade; nothing removed yet (#79).
  • Resource adoptionDeals, Persons, Organizations, Activities, and Pipelines implement ExPipedrive.Resource for v2 CRUD/list/stream (same pattern as Products/Stages). Public APIs unchanged; v1 legacy helpers retained (#78).
  • List return shapesNotes.get_all_org_notes/2 now returns {:ok, %PagedResult{}} like Notes.list/2 (was a bare note list). Prefer list/2 with :org_id. Documented list conventions on ExPipedrive.Page; soft-documented Pipelines.list_pipelines/1 in favor of list_page/2 / stream/2 (#86).
  • Refresh AUDIT.md as a current Pipedrive OpenAPI gap map (implemented vs missing tags); catch-all checklist split into focused issues (#83, #88).

Added

0.1.0 - 2026-07-31

First Hex release of ExPipedrive, a v2-first fork of LineDrive.

Added

Client foundation

Resources (API v2 unless noted)

  • Deals and Persons: list/stream (cursor), get, create, update; deal delete
  • Organizations, Activities, Pipelines, Stages, Products: list/stream, get, create, update, delete (product variations deferred)
  • Search: ExPipedrive.Search over /api/v2/itemSearch with cursor pages/stream and typed SearchResult
  • Deal, Person, and Organization Fields list/page/stream plus ExPipedrive.Fields for resolving custom-field hashes and labels
  • Leads / Notes: explicit API v1 shims with map-based create helpers and get/2, create/2, list/2 aliases
  • Webhooks: ExPipedrive.Webhooks subscription list/create/delete (API v1 management); Webhook.Event / Webhook.Handler inbound surface (optional Plug; Basic auth; package extract deferred)

Docs & tooling

  • Fake Pipedrive server fixtures for v2 resources used in tests
  • MVP README flows: stream open deals; create person then deal
  • CI matrix, ExDoc, Hex publish-on-release workflow

Changed

  • Package / OTP app / modules rebranded from LineDrive → ex_pipedrive / ExPipedrive
  • Core deps slimmed (Timex removed; Plug optional for webhooks only)
  • Silent OTP Application/Registry coupling removed

Migrating from LineDrive

  1. Depend on {:ex_pipedrive, "~> 0.1.0"} instead of :line_drive.
  2. Rename modules LineDrive.*ExPipedrive.*.
  3. Prefer ExPipedrive.client/2 (header token) and v2 helpers (Deals.stream/2, Deals.create/2, Persons.create/2, …) over legacy v1 list APIs.
  4. OAuth: persist ExPipedrive.Oauth.Token via your TokenStore implementation; build clients with Client.from_token/2 or from_token_store/4.
  5. Use ExPipedrive.Raw.request/4 for endpoints not yet wrapped.