Diese Anleitung ist auf Englisch verfügbar.
How to Add Local Marketing Functionality to Vertical SaaS
Add local marketing to a vertical SaaS by mapping existing customers to clients and locations, and shipping only the features your niche needs.
Auf einen Blick
- Was diese Anleitung leistet
- Embed listings, reviews and local SEO into a vertical SaaS, provisioned from the customer records you already have.
- Verwendete APIs
- post
/api/v1/clientsClient erstellen - post
/api/v1/locationsStandort erstellen - get
/api/v1/reviewsReviews auflisten - get
/api/v1/seo/keywordsRanking-Übersicht eines Standorts abrufen - post
/api/v1/postsBeitrag erstellen
- post
- Referenz
- ClientsLocationsReviews
- Voraussetzungen
- An API key with write access
- Customer records you can map to clients and locations
- Typische Anwendungsfälle
- A dental or restaurant SaaS adding a marketing tab
- A home-services platform managing customer listings
- Turning existing customer data into local marketing features
Vertical SaaS starts with an advantage a general platform never has: you already own the customer relationship and you already hold their business data. A dental practice, a restaurant, a plumbing franchise is already in your system with its name, address and hours. Adding local marketing is mostly a mapping exercise, then a decision about which features your niche actually cares about.
Map what you already have
Most vertical SaaS has a natural shape: one customer, one location, or one customer with a handful. That maps cleanly. Your customer becomes a client. Each of their sites becomes a location under it.
- Your customerAlready in your database with name, address, hours
- Client
POST /api/v1/clientsOne per customer, id stored on your record - Location(s)
POST /api/v1/locationsCreated from data you already hold - ConnectPrompt the owner to connect Google once
Because you already have the business details, provisioning can be silent. When a customer signs up, or when you backfill, create the client and the location from the fields you store, and the only thing that needs the owner is the one-time Google connection. The create-location recipe is the exact call.
# On signup: create the client, then the location, from data you already have
curl -X POST https://ai.synup.com/api/v1/clients \
-H "Authorization: Bearer $SYNUP_API_KEY" -H "Content-Type: application/json" \
-d '{ "businessName": "Grove Street Dental" }'
curl -X POST https://ai.synup.com/api/v1/locations \
-H "Authorization: Bearer $SYNUP_API_KEY" -H "Content-Type: application/json" \
-d '{
"clientId": "CLIENT_ID",
"name": "Grove Street Dental",
"countryIso": "US", "street": "88 Grove St", "city": "San Francisco",
"stateIso": "CA", "postalCode": "94105",
"phone": "+1 415 555 0142", "categoryName": "Dentist"
}'const API = "https://ai.synup.com/api/v1";
const headers = {
Authorization: `Bearer ${process.env.SYNUP_API_KEY}`,
"Content-Type": "application/json",
};
// Provision from your own customer record, on signup or backfill
async function provision(customer) {
const clientRes = await fetch(`${API}/clients`, {
method: "POST", headers, body: JSON.stringify({ businessName: customer.name }),
});
const clientId = (await clientRes.json()).data.clients[0].id;
const locRes = await fetch(`${API}/locations`, {
method: "POST", headers,
body: JSON.stringify({
clientId,
name: customer.name,
countryIso: customer.country,
street: customer.street, city: customer.city,
stateIso: customer.state, postalCode: customer.zip,
phone: customer.phone, categoryName: customer.category,
}),
});
const locationId = (await locRes.json()).data.locationId;
return { clientId, locationId }; // store both on your customer record
}import os, requests
API = "https://ai.synup.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['SYNUP_API_KEY']}", "Content-Type": "application/json"}
def provision(customer):
c = requests.post(f"{API}/clients", headers=HEADERS, timeout=30,
json={"businessName": customer["name"]})
client_id = c.json()["data"]["clients"][0]["id"]
loc = requests.post(f"{API}/locations", headers=HEADERS, timeout=30, json={
"clientId": client_id, "name": customer["name"],
"countryIso": customer["country"], "street": customer["street"],
"city": customer["city"], "stateIso": customer["state"],
"postalCode": customer["zip"], "phone": customer["phone"],
"categoryName": customer["category"],
})
return {"clientId": client_id, "locationId": loc.json()["data"]["locationId"]}Ship the features your niche needs, not all of them
A vertical does not need the whole surface. Pick the two or three features your customers actually use and leave the rest. Where to start depends on the niche, and your own read of your customers beats any generic list, but as a starting point:
- Home services and trades usually care most about reviews and about being found, so the review inbox
(
GET /api/v1/reviews) and rank tracking (GET /api/v1/seo/keywords) are the natural first two. - Restaurants and retail lean on the profile and posts: hours correct everywhere, plus offers and events
through
POST /api/v1/posts. - Healthcare and professional services tend to want accurate listings and review reputation and are wary of automation, so listings health and human-approved review replies fit them better than anything hands-off.
The point of a vertical product is opinionated defaults. You know your customers better than a general dashboard does, so choose the features and hide the rest rather than exposing every endpoint.
Next
If you grow into reselling this as its own branded product, that is the white-label platform guide. The full six-feature menu to choose from is the local marketing guide, and letting a model run part of it is the AI agent guide.