All notable changes to this project will be documented in this file.
The internals of lib/request.ts have been rewritten on top of native fetch (no more https.request), and a new PipelinesClient has been added for the Pipelines API. The existing TrackClient / APIClient method surface is unchanged. Most users will not need to update any code; the breaking changes are documented below.
CustomerIORequestError.responsetype narrowed (TypeScript only). It is now aResponseLikeinterface ({ statusCode: number; headers: Record<string, string>; ok: boolean }) instead ofhttp.IncomingMessage. The runtime properties that the SDK has always populated (statusCode, responseheaders) are preserved. If your code readserr.response.rawHeadersorerr.response.socket, or usesinstanceof http.IncomingMessage, update it to read the lowercasederr.response.headersobject instead.- The
Regionconstructor now requires a thirdpipelinesUrlargument. Code that constructsRegiondirectly with the two-argument signature (new Region(trackUrl, apiUrl)) will fail to type-check and must be updated to pass an explicit Pipelines host. Code that only consumes the exportedRegionUSandRegionEUconstants is unaffected. - The underlying request mechanism now uses
fetch. If you were handling errors based oninstanceoforError.messageyou may need to update your handlers to use nativefetcherrors.
- Outbound header names are now lowercased on the wire. This is per the WHATWG fetch spec. The Customer.io API is case-insensitive, so this only matters if you grep your own outbound HTTP logs.
- TCP keepalive is enabled by default. undici's connection pool reuses sockets across calls. Performance improves under sustained load; file-descriptor usage profile shifts slightly.
User-Agentbumps fromCustomer.io Node Client/4.xtoCustomer.io Node Client/5.0.0.- Dependency updates (#196), (#207), (#208), (#209)
- Make
getCustomersByEmailquery safe (#193) - Resolve on any 2XX status code (#192)
- Automatic retries with exponential backoff and jitter, shared across
TrackClient,APIClient, andPipelinesClient. Transient network errors and the retryable status codes408,429,500,502,503,504,522,524are retried (default 3 attempts); other 4xx responses are not. ARetry-Afterheader is honored when present, and retried attempts carry anX-Retry-Countheader. Configure or disable via aretryoption on any client ({ maxRetries: 0 }to opt out). See the Retries section in the README. (#213) - New
PipelinesClientfor the Pipelines API. Providesidentify,track,page,screen,group,alias, andbatchmethods. Auto-fillsmessageId,timestamp, andcontext.libraryon every payload, and supports an optionaldefaultContextandstrictModeon the client. See the new Pipelines section in the README. (#204) Regionnow exposes apipelinesUrlfield, andRegionUS/RegionEUpoint atcdp.customer.ioandcdp-eu.customer.iorespectively. (#203)CIORequest.options()now merges custom headers supplied viadefaults.headers. Standard headers (Authorization,Content-Type,Content-Length,User-Agent) always win and cannot be clobbered. (#215)- Bun support. Bun (latest) is now part of the CI matrix alongside Node 22 / 24 / 26. Runtimes that implement standard
fetchshould work, though only Bun and Node are explicitly tested. (#197) - 307 and 308 redirects are now explicitly covered in the test suite (previously only 301/302 had direct test coverage).
- Live dogfood suite (
npm run test:live). Pre-release smoke test against a real workspace. Not part ofnpm test; gated onCIO_LIVE=1plus credentials. (#201) - v2 Batch method added to the
Trackclient (#194) - Fix
instanceofchecks for safety in cases of duplicate installs or cross-realm matching (#198)
lib/request.tsrewritten on top of nativefetchwithredirect: 'manual'andAbortSignal.timeout. The Authorization-strip rule on cross-host redirects, the timeout error message string, anderr.codeon network errors (ECONNREFUSED/ENOTFOUND/ECONNRESET) are all preserved. No runtime dependency on thehttpsmodule. (#200)nockupgraded to^14(the only version that intercepts undici'sfetch).- Omit
Content-Lengthheader on requests without a body (#199) - Convert ESLint config from CJS to ESM (#211)
- Dynamically create
lib/version.tsfile (#210)
- Fix redirect handler shadowing request body with response body (#185)
- Strip Authorization header on non-customer.io redirects (#186)
- URL-encode path parameters in APIClient (#187)
- BREAKING: Drop support for Node.js versions that have reached end-of-life. Supported versions now follow the Node.js release schedule — Current, Active LTS, and Maintenance LTS only (currently Node.js 22, 24, and 26). Added an
enginesfield topackage.json. (#180) - BREAKING: Fix
triggerBroadcastAPI path by removing erroneous/apiprefix, and rename theidparameter tobroadcastIdfor clarity (#179) - Bump third-party dependencies:
@types/node,@types/sinon,ava,js-yaml,lodash,minimatch,nyc,picomatch,pretty-quick,sinon(#167, #169, #177, #178, #181)
- Add
bodyproperty toSendEmailRequestWithTemplatetype definition (#172)
- Add timeout handling for HTTP requests (#173)
- Add support for sending transactional in-app messages (#174)
- Add support for sending transactional Inbox messages (#170)
- Add support for sending transactional SMS messages (#164)
- Explicitly initialize a variable to avoid build errors (#143)
- Add support for sending transactional push messages (#141)
- Updated transactional email request parameter
amp_bodytobody_ampfor consistency across APIs (#137)
- Handle redirect responses from the track and app apis (#135)
- Added
getAttributesmethod (#129)
- Pass query parameters for
getCustomersByEmailto prevent400responses from Customer.io (#132)
- Added
disable_css_preprocessingandlanguageoptional fields (#127)
- Add export methods to the api class (#120)
- Add customer lookup by email method to the api class (#124)
- Add unsuppress method to the track class (#123)
- Update
minimatch(dev only) (#121)
- Republish to npm since
3.3.5didn't include the correct changes (Context)
- Add extra device attributes to attributes object in
addDevice(#115)
- Re-publish to npm since
3.3.3didn't include the correct changes (Context)
- Use the track api url instead of the app api url for
mergeCustomers(#114)
- Add more files to the npm ignore file (#109)
- Attempt to re-publish to get a proper build before publishing
- Export
CustomerIORequestErrorin Typescript types (#108)
- Added support for use with gitpod (#101)
- Added support for invite-type anonymous event tracking (#106, #107)
- Export more types from
request.ts(#102)
- Fix instances of
customerio-noderunning without apackage.jsonalongside the code (#105)
- Add support for push metrics tracking endpoint (#98)
- Add
send_atto transactional message attributes (#97) - Set
User-Agentfor proper source attributes on activity logs (#96)
- Set
User-Agentfor property source attributes on activity logs (#93)
- Fixed types for the
fake_bccparameter for transactional emails (#92)
- Adding support for Merge Customers API
- Fix an issue with some instances of
HTTPS.requestin certain runtimes (#83)
- Fix a few issues in the README documentation (#73)
- Allow
subjectandbodyto be overridden independent offromfor transactional messages (#75)
- Fix an issue calculating the content length of multi-byte utf-8 string characters (#69)
-
(BREAKING) Remove the dependency on
request(#62)- We don't expect this to break many consumers of
customerio-node. Unless you were usingrequestspecific options, you don't need to make any changes.
- We don't expect this to break many consumers of
-
(BREAKING) Return an
Errorinstance for non-2XXstatus codes (#62)- We don't expect this to break many consumers of
customerio-node. Unless you were usinginstanceofto check the type of error returned from track or api methods, you don't need to make any changed.message,statusCode,response, andbodyare still accessible as properties on the error.
- We don't expect this to break many consumers of
-
(BREAKING)
trackAnonymousnow requires ananonymous_idand cannot trigger campaigns. If you previously used anonymous events to trigger campaigns, you can still do so directly through the API. We now refer to anonymous events that trigger campaigns as "invite events". -
(BREAKING) Restructure the package to have a single entry point, rather than three. This is more of a standard package structure, and is more future-proof. (#63)
-
Return a readable message when the server returns an array of errors instead of
Unknown error(#62)
- Fix exported typings for folks using
customerio-nodewith Typescript (#56)
- Upgrade
inifrom 1.3.5 to 1.3.8 (#36)
- Convert
customerio-nodeto Typescript (#49)
- (Breaking) Move triggerBroadcast method from Track to API class (#46)
- Support for the EU region
- Support for the Transactional API
addToSegmentandremoveFromSegmentmethods
- IDs in the URLs are now escaped.
- Improved validations for data that's passed in.
- Catch scenarios where a response body is unexpectedly
null(#25)
- Add missing API params to
triggerBroadcast(#19) - Further improve the
triggerBroadcastAPI call and catch additional params (#20) - Switch from Travis CI to Circle CI (#21)
- New API calls for manual segments (
addToSegment,removeFromSegment) (#16)
- New API call for adding and removing devices from push notifications (#14)
- Huge thanks to @jescalan for his work in modernizing the Javascript to es6 along with updating dependencies. (#13)
- README now has the correct Travis-CI badge
- README has standardized and expanded examples (#10)
- Fixed link in README to official Customer.io API docs
- Cleaned up .gitignore by removing unnecessary ignore statements
- This CHANGELOG file along with historical changes to provide better transparancy to changes made to the library
- New API call for API triggered broadcasts
- Added a test for the new call
- Added an example for the new call to README and examples/ dir
- An example config file for the practical examples
- Travis-CI builds now use currently maintained LTS versions of Node.JS (6, 8, 9)
- .gitkeep files no longer necessary to preserve directories
0.2.0 - 2015-07-22
- url.resolve() removed from API calls
0.1.0 - 2015-07-22
- Initial API client library
- Create Identify call
- Create Track call
- Create Track Page View call
- Create Customer Delete call
- Test suite for API calls
- HTTP Request middleware
- Create request handler with RSVP.js
- Create options method for unifying all request calls
- Create POST request
- Create PUT request
- Create DELETE request
- Test suite for middleware