AddThisFeature

Constant Contact List Sync

Put new leads on the right Constant Contact list with their consent recorded.

moderate Sales & Marketing Tools

What it adds

A background sync that creates or updates a Constant Contact contact and its list memberships whenever a lead is captured or its consent changes.

What your agent is told to do

5
  1. 1

    Find every place the app captures an email address with marketing intent — signup, waitlist, lead form, checkout opt-in — and treat each as a sync source whose destination list an operator configures. Where an event-forwarding brief is also applied to this app, that one owns behavioural events; this one owns contact identity, consent, and list membership.

  2. 2

    Match on the email address and update the existing contact rather than inserting a new one. Reuse the app's existing background-job system so the sync never runs inside the request that captured the lead.

  3. 3

    Carry the consent evidence the app already holds — the wording shown, the timestamp, the capture source, the request context — and preserve the permission status on every write. A sync must never upgrade a contact to subscribed as a side effect.

  4. 4

    Read the contact's current list memberships before writing, and send the union of those and the lists this sync intends to add. Do not send only the lists this feature owns: a full replacement silently strips memberships someone else added.

  5. 5

    Hold the account credential server-side and refresh it ahead of expiry. Do not place the token in client-visible code and do not call the provider from the browser, where anyone can read it and anyone can forge a lead.

Edge cases it handles

7
  • An address that already exists must update that contact rather than create a second one. Matching is case-insensitive and ignores surrounding whitespace.
  • Permission-to-send status and the evidence behind it must survive every update. A contact who unsubscribed at the provider must not be resubscribed because the app still holds them as an active lead.
  • A list deleted at the provider, or an account that has been disconnected, must fail the sync into a visible operator error with the affected leads retained, not drop them quietly.
  • Reading memberships before writing them means two syncs racing on the same contact can each clobber the other. Serialise per contact so an update cannot remove a list added a moment earlier.
  • A retried job must not trigger a second welcome message or automation series. Make each sync idempotent on the contact and apply only list changes that are genuinely new.
  • Rate limits and provider outages need bounded backoff, and a lead that exhausts its attempts must land in a queue an operator can inspect and replay.
  • An address the provider rejects as invalid or permanently bounced must be marked as such in the app rather than retried indefinitely.

Definition of done

9
  • Every marketing-intent capture point in the app syncs to an operator-configured list.
  • Syncing an address that already exists updates that contact instead of creating a duplicate.
  • Consent status and its evidence are preserved on every write, and no sync subscribes a contact who opted out.
  • List memberships added outside the app survive an update from the app.
  • A retried or duplicated job produces no second welcome message.
  • A deleted list or disconnected account surfaces as an operator-visible error with the affected leads queued for replay.
  • No provider credential is reachable from client-side code.
  • The feature matches the existing design system.
  • No existing functionality is broken.

Related features

How it works

  1. 1

    Copy the link

    Grab the Markdown instruction URL for this feature.

  2. 2

    Give it to your AI

    Paste it into Claude Code, Cursor, v0, Lovable — whatever you build with.

  3. 3

    It inspects, then implements

    Your agent reads your existing app first, then adds the feature to fit it.

Works with your stack

These instructions are written to adapt. They tell the agent to detect your framework, match your existing design system, and reuse what you already have — rather than assuming a particular stack.

Need it tighter than that? Customize the feature and tell it exactly what you're running.