Skip to main content

Communication & Deprecation Policy

This document describes how Swapcard communicates API changes to Content API and Analytics API consumers, and the lifecycle for deprecating and removing fields, queries, and mutations.


1. Scope

This policy applies to:

It covers any change that affects the public contract of these APIs: field removals, type changes, behavioral changes, query/mutation removals, and enum value changes.


2. Principles

  1. Backward compatibility by default — All schema changes are backward compatible. New fields, new optional arguments, and new types are non-breaking and can be shipped freely.
  2. No silent removals — A field or query will never be removed without going through the full deprecation lifecycle.
  3. Migration path required — Every deprecation includes a concrete alternative or migration instruction.
  4. Communicate early, communicate often — You will learn about deprecations through multiple channels and have ample time to migrate.

3. Change Categories

Non-Breaking Changes (no deprecation required)

  • Adding a new field to an existing type
  • Adding a new query or mutation
  • Adding a new optional argument to an existing query/mutation
  • Adding a new enum value
  • Adding a new type, union, or interface

These changes are documented in the changelog but do not require a deprecation notice or migration period.

Deprecations (standard lifecycle)

  • Marking a field, query, or mutation for future removal
  • Replacing a field with a new alternative (e.g., attendeeswithEvent.attendees)
  • Phasing out an enum value

These follow the Deprecation Lifecycle defined in Section 5.

Breaking Changes (require deprecation lifecycle)

  • Removing a field, query, or mutation
  • Changing a field's return type
  • Making a nullable field non-nullable (or vice versa for inputs)
  • Changing an enum value's meaning
  • Changing the behavior of a resolver in a way that would break existing consumers

Breaking changes are only allowed after the full deprecation lifecycle has been completed.


4. Communication Channels

Every API change is communicated through the following channels:

ChannelWhenWhat
ChangelogEvery releaseAll changes (additions, deprecations, removals) are documented in the relevant changelog: Content API Changelog or Analytics API Changelog
EmailDeprecation + remindersSent to all mailing list subscribers at each phase of the deprecation lifecycle
Schema directiveAt deprecationThe @deprecated(reason: "...") directive is added to the field in the GraphQL schema, visible in introspection and developer tooling

5. Deprecation Lifecycle

The standard deprecation lifecycle spans 12 months from announcement to removal.

PhaseTimelineTechnical ActionCommunication
AnnouncementDay 0@deprecated directive added to the field with migration instructions. Documented in changelog.Email to all mailing list subscribers with deprecation details and migration guide.
First reminderMonth 3No technical change.Reminder email highlighting the upcoming removal and migration instructions.
Second reminderMonth 6No technical change.Reminder email. If usage analytics are available, usage data may be included to help you assess urgency.
End of LifeMonth 12Field/query/mutation removed from the schema. Changelog updated.Final email confirming the removal, with a link to the migration guide.
info

Timeline extensions: If usage analytics show significant ongoing usage of a deprecated field at Month 6, Swapcard may extend the lifecycle beyond 12 months with additional reminders. Extensions are communicated in the changelog and via email.


6. Emergency Deprecation (Fast-Track)

In exceptional circumstances, a shorter deprecation period may apply:

ReasonMinimum NoticeProcess
Security vulnerability30 daysDirect outreach to known consumers + email to mailing list + changelog entry. Removal after 30 days.
Legal / compliance requirement30 daysSame as security. If the legal requirement mandates immediate removal, the field is removed immediately with post-hoc notification.
Critical bug in deprecated field30 daysIf a bug is found in an already-deprecated field and fixing it would require significant effort, removal may be accelerated to 30 days with direct outreach.
caution

Emergency deprecations are documented with a clear justification in the changelog.


7. Migration Requirements

Every deprecation includes the following:

  1. Deprecation reason — A clear @deprecated(reason: "...") message in the schema explaining why the field is being removed.
  2. Alternative — The replacement field, query, or approach. For example: "Use withEvent.attendees instead".
  3. Migration guide — A changelog entry (or linked document) with before/after code examples showing how to migrate.
  4. Timeline — The planned removal date (12 months from announcement unless fast-tracked).

Example deprecation message format:

@deprecated(reason: "Use withEvent.attendees instead. Will be removed on 2027-03-01.")

8. Summary

Change TypeDeprecation Required?Notice Period
New field / query / mutationNoNone (ship freely)
Field removal / type changeYes12 months
Security / legal removalYes (fast-track)30 days minimum
Enum value removalYes12 months
Behavioral changeYes12 months