Pre-Black Friday: 20% off, for as long as you stayEARLYBFon Solo and AgencyEnds Nov 28Start free

How-to guide

How to Find a Shopify Store Owner's Email Address (2026)

Filter owners by the Shopify tech detected on their store, reveal the address, and read its status before anything is sent.

Get your free API key →Free to start. No credit card. 1,000 records to spend whenever you like.

You find a Shopify store owner's email by filtering a data source for owners whose store runs Shopify, then revealing the address and reading its status. A name-pattern guess is the fallback, not the plan.

Store owner addresses come from four places. A data provider holds a work address it collected and checked. The store's contact page usually lists a shared inbox such as support@, which reaches a helpdesk, not the owner. A name pattern gives you a guess. A personal address sits in some records but suits business outreach poorly.

Only the first scales. This guide follows that order and uses the LeadOcean API. Every step has a request you can run.

TL;DR

  • It takes about 15 minutes to size the audience, find one owner's address and check its status.
  • The walkthrough spends about 4 records: up to 3 from the search and 1 from the reveal. Counts are free.
  • Send only to verified, catch_all_valid or catch_all. Anything you guessed gets verified first.

Prerequisites

  • A LeadOcean API key from app.leadocean.io. The free plan has 1,000 records, one-off, and no card.
  • The key in your shell as $LEADOCEAN_API_KEY.
  • curl and jq.
  • A target store domain. The examples use acme.com.
bash
export LEADOCEAN_API_KEY="paste-your-key-here"

Step 1: Size the Shopify store owner audience for free

Count the owners you can mail before you spend a record. Send count=true and limit=1 as query parameters. Arrays go comma-separated.

bash
curl -s -G https://api.leadocean.io/v1/people/search \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  --data-urlencode "seniority=owner,founder" \
  --data-urlencode "technologies=Shopify" \
  --data-urlencode "salesRegion=NORAM" \
  --data-urlencode "emailStatus=verified,catch_all_valid,catch_all" \
  --data-urlencode "count=true" \
  --data-urlencode "limit=1" | jq '.meta | {total, totalIsExact, countOnly}'

technologies matches what was detected on the company website, so it covers companies we crawled (about 7.8M), not every store. salesRegion takes NORAM, LATAM, EMEA or APAC. Swap in country=GB for one market. Add technologies=Klaviyo or another app to narrow the list.

Step 2: Find the owner at your target store

Search by company domain and seniority. The search returns a thin row with no address in it. The row carries a person_id and flags that say whether we hold an email.

bash
curl -s https://api.leadocean.io/v1/people/search \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domain": ["acme.com"],
    "seniority": ["owner", "founder"],
    "limit": 3
  }' | jq '.data[] | {person_id: .meta.source_ids.person_id, contact_data}'

Each person returned costs 1 record. Keep limit small. Store owners rarely carry the title "owner". You will see founder, CEO and co-founder, so seniority catches more than a title keyword does.

Step 3: Reveal the address

Send the person_id to enrich with reveal_email set to true. Enrich takes exactly one of linkedin_url, email, phone or person_id. There is no name plus domain lookup, which is why Step 2 comes first.

bash
curl -s https://api.leadocean.io/v1/people/enrich \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"person_id": "PERSON_ID_FROM_STEP_2", "reveal_email": true}' \
  | jq '.data.contact_data | {email_status, contact_emails}'

This costs 1 record. A person we hold nothing for is a 404 and costs nothing. GET /v2/people/email/work with the same person_id returns one current-employer address or null, at 1 record per call even when it finds nothing.

Step 4: Read the status before you send

The status says how far to trust the address. verified was tested. catch_all_valid means we confirmed the mailbox on a domain that accepts everything. catch_all means the domain accepts everything and the mailbox is unproven.

bash
curl -s https://api.leadocean.io/v1/people/enrich \
  -H "x-api-key: $LEADOCEAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"person_id": "PERSON_ID_FROM_STEP_2", "reveal_email": true}' \
  | jq -r '.data.contact_data
    | select(.email_status | IN("verified","catch_all_valid","catch_all"))
    | .contact_emails[0].email'

Empty output means the status failed the filter. LeadOcean gives no refund for bounced emails, so this check is your only protection. Treat catch_all as sendable at low volume, not as proof.

Step 5: Fall back to a name pattern

When the data holds no address, build candidates from the owner's name and the store's own domain, not the myshopify.com one. Small stores use short shapes. Pick the one you can confirm from a known address at the same store.

PatternExample for Jane Doe at Acme
firstjane@acme.com
first.lastjane.doe@acme.com
first initial, lastjdoe@acme.com
first initial dot lastj.doe@acme.com
bash
first="jane"; last="doe"; domain="acme.com"
printf '%s\n' "$first@$domain" "$first.$last@$domain" "${first:0:1}$last@$domain" "${first:0:1}.$last@$domain"

Never send to a candidate you have not verified. Run each one through an email verifier you trust first. A domain that accepts all mail cannot confirm a single mailbox, so a guess there stays a guess.

What you get

Step 1 is free. We ran it on 2026-10-21 for each sales region with leadocean_count_leads. The filters are seniority owner or founder with technology Shopify. The mailable column counts verified, catch_all_valid or catch_all addresses (the tool default). The other column is every match, any email state.

RegionMailable Shopify store ownersAll matches, any email stateExact
NORAM72,826195,229Yes
EMEA13,92555,896Yes
APAC9,25241,100Yes
LATAM1,5937,969Yes

NORAM alone spans 20,676 distinct companies. The gap between the two columns is the point: many owners sit in the data without a checked address, so the mailable list is the smaller, safer one. These are people whose employer site shows Shopify, so treat the count as a floor for the stores we crawled.

A revealed person comes back in the shape below. This is the response shape from the API reference, with placeholder values.

json
{
  "success": true,
  "data": {
    "profile_data": { "...": "name, title, company" },
    "contact_data": {
      "has_email": true,
      "email_status": "verified",
      "email_type": "work",
      "contact_emails": [
        { "email": "jane.doe@acme.com", "type": "work", "status": "verified" }
      ]
    }
  }
}

Troubleshooting

ErrorCauseFix
401The x-api-key header is missing, or the key is wrong or revoked.Copy a fresh key from the app and reload $LEADOCEAN_API_KEY.
402Your records are spent. On Free the 1,000 are a one-off allowance and do not reset.Check GET /v1/account, or move to a paid plan.
429You went above your plan's rate limit: 5 requests a second on Free, 200 on Agency.Wait the Retry-After seconds and retry.
Empty resultsA filter value is not an exact enum string, such as north america for salesRegion.Call leadocean_list_enum_values and pass the exact string, for example NORAM.
404 on enrichWe hold nothing for that person.Nothing was charged. Try another person_id or fall back to Step 5.
Export refusedOne export is capped at 50,000 rows a request and 500,000 rows a day.Split the job across requests and days, or narrow the filters.

FAQ

Is it legal to email a store owner you do not know?

Rules differ by country, and this guide is not legal advice. Check the law where your recipient sits and keep your message relevant to their business. Ask your own counsel about anything in doubt.

Why does the search not show the email?

Search returns a thin row with flags such as has_email and email_status. The address comes from enrich with reveal_email set, and that call costs 1 record.

How many store owners can I get on the free plan?

You have 1,000 records, one-off. Each owner costs about 2: 1 from search and 1 from the reveal. That is roughly 500 owners, minus any 404s that cost nothing.

Can I pull a whole region at once?

Bulk CSV export is not on Free. On a paid plan the Exports page in the app takes the same filters, shows the record price before you start, and gives you a CSV. POST /v1/exports does the same by API, up to 50,000 rows a request.

Why not use the store's contact form or support address?

A shared inbox such as support@ reaches a helpdesk and can carry the role status. It rarely reaches the owner. Use it only when no personal work address exists.

For the same recipe on other owners, see agency owners, small business owners and VPs of sales. More recipes live in the blog hub. Plans are on pricing.

Size your Shopify store owner list free, then pull verified addresses

Free to start. No credit card. 1,000 records to spend whenever you like.

Get your free API key →