Mark Customers via API


Automatically flag a contact as a paying customer in Boei whenever they pay in your billing system, so your deals pipeline and customer-only chatbot behavior stay in sync without manual work.

You call one endpoint from a webhook in your billing tool (Stripe, Paddle, Chargebee, your own backend, Zapier, n8n, Make, whatever fires on a successful payment). Boei flips the contact's status to customer and moves any open deals for that contact to your Won column.

How to get there: Go to Settings → API Keys in the top-right profile menu to generate a key. The endpoint is documented in the interactive API docs under Contacts → Mark Contact as Customer.

When to use this

  • You use a billing tool outside Boei (Stripe, Paddle, invoicing software) and want Boei's CRM to reflect who is actually paying.
  • You want deals to auto-close when payment lands, without an operator having to drag the card to Won.
  • You want the widget/chatbot to treat paying customers differently (e.g. skip upsell prompts, prioritise support routing).

If you only need this occasionally, the paste-a-list flow on the Deals page is simpler. Use the API when you want it to happen continuously and automatically.

Endpoint

POST https://app.boei.help/api/v1/contacts/mark-customer
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

{
  "email": "customer@example.com",
  "name": "Jane Doe"
}

email is required. name is optional and only used if Boei has to create the contact.

Response

{
  "success": true,
  "contact_id": 123,
  "created": false,
  "status_changed": true,
  "deals_won": 2
}

  • created: true if Boei had no contact for that email yet and created one.
  • status_changed: true if the status flipped this call. false if the contact was already a customer.
  • deals_won: number of open deals for this contact that moved to your Won column. Archived deals and deals already in Won are skipped.

The endpoint is idempotent, so it's safe to fire on every payment event. Repeat calls for the same email just return status_changed: false and don't create duplicate contacts.

Wiring it up

From Stripe

In your Stripe webhook handler for customer.subscription.created, invoice.paid, or checkout.session.completed:

curl -X POST https://app.boei.help/api/v1/contacts/mark-customer \
  -H "Authorization: Bearer $BOEI_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"email\": \"$CUSTOMER_EMAIL\", \"name\": \"$CUSTOMER_NAME\"}"

From Zapier / Make / n8n

Trigger: "New paying customer" (in Stripe, Chargebee, Shopify, etc.).
Action: Webhook → POST with the URL, headers, and body above. Map email and name from the trigger event.

From your own backend

Fire the request in the same code path that grants the customer access to your product after a successful charge.

Behavior details

  • Tenant scoping. The API key identifies your Boei account. The endpoint only reads and writes contacts and deals under that account. It cannot reach other accounts' data.
  • Won status. Boei uses the CRM status literally named Won under your account. If you renamed it, the endpoint still flips the contact's status but skips the deal update. Rename it back or add a Won status in Deals → Statuses to enable the auto-Won behavior.
  • Contact creation. If the email isn't in your contacts yet, a new contact is created with status = customer and source = api. This is the intended "upsert" behavior so a payment webhook works even for customers who never chatted with your bot.
  • Deal side-effect. Every open (non-archived) deal linked to the contact is moved to Won. If a specific deal should stay open, archive it or unlink it from the contact first.

Errors

  • 401 unauthorized: API key missing or invalid.
  • 403: your plan doesn't include API access. Upgrade or contact support.
  • 422: email was missing or not a valid email.
  • 429: rate limit hit. Wait a minute and retry.