Product Mapping for External Commerce — Evoxup :root{ --bg:#ffffff;--soft:#f6f8fc;--ink:#0b1220;--muted:#5c6a80;--line:#dfe6f2; --blue:#1769ff;--blue2:#0d4fc1;--blue3:#0b2d6f;--red:#d7263d;--dark:#07111f; --green:#16834c;--amber:#9c6a00;--shadow:0 18px 50px rgba(20,62,125,.10) } *{box-sizing:border-box} html{scroll-behavior:smooth} body{margin:0;font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;color:var(--ink);background:var(--bg);line-height:1.7} a{color:inherit;text-decoration:none} .container{width:min(1200px,calc(100% - 40px));margin:auto} h1,h2,h3,h4{line-height:1.13;margin:0 0 16px} h1{font-size:clamp(3rem,6vw,5.8rem);letter-spacing:-.055em} h2{font-size:clamp(2rem,4vw,3.7rem);letter-spacing:-.045em} h3{font-size:1.35rem} p{margin:0 0 18px;color:var(--muted)} .lead{font-size:clamp(1.08rem,1.6vw,1.32rem);max-width:880px} .eyebrow{display:inline-flex;align-items:center;gap:9px;font-size:.76rem;font-weight:900;letter-spacing:.13em;text-transform:uppercase;color:var(--blue)} .eyebrow:before{content:"";width:28px;height:2px;background:var(--red)} .btn{display:inline-flex;align-items:center;justify-content:center;min-height:48px;padding:0 20px;border-radius:12px;font-weight:850;border:1px solid transparent} .btn.primary{background:var(--blue);color:#fff}.btn.secondary{background:#fff;border-color:var(--line)} .badge{display:inline-flex;padding:5px 10px;border-radius:999px;font-size:.68rem;font-weight:900;background:#eaf1ff;color:var(--blue2)} header{position:sticky;top:0;z-index:20;background:rgba(255,255,255,.93);backdrop-filter:blur(16px);border-bottom:1px solid var(--line)} .nav{height:72px;display:flex;align-items:center;justify-content:space-between;gap:20px} .brand{display:flex;align-items:center;gap:10px;font-weight:900} .brandmark{width:34px;height:34px;border-radius:11px;background:linear-gradient(145deg,var(--blue),var(--blue3));position:relative} .brandmark:after{content:"";position:absolute;width:10px;height:10px;border-radius:50%;background:var(--red);right:-3px;bottom:4px;border:3px solid white} .navlinks{display:flex;gap:22px;font-size:.92rem;font-weight:750;color:#33445e} .navright{display:flex;gap:10px} .hero{padding:100px 0 70px;background: radial-gradient(circle at 84% 8%,rgba(23,105,255,.14),transparent 28%), linear-gradient(180deg,#fff,#f8fbff)} .hero-grid{display:grid;grid-template-columns:1.05fr .95fr;gap:54px;align-items:center} .actions{display:flex;gap:12px;flex-wrap:wrap;margin-top:26px} .map-visual{background:linear-gradient(150deg,#07111f,#102b60);border-radius:28px;padding:28px;color:#fff;box-shadow:0 30px 80px rgba(7,17,31,.24)} .map-visual p{color:#b8c8df} .map-row{display:grid;grid-template-columns:1fr 34px 1fr;gap:9px;align-items:center;margin:12px 0} .map-node{padding:14px;border:1px solid #27446f;border-radius:13px;background:#0d1e38;text-align:center} .map-arrow{text-align:center;font-weight:900;color:#8ca5ca} section{padding:90px 0}.soft{background:var(--soft)}.dark{background:linear-gradient(135deg,#07111f,#0a1e3c);color:#fff} .dark h2,.dark h3,.dark h4{color:#fff}.dark p{color:#aebdd2} .content-layout{display:grid;grid-template-columns:260px 1fr;gap:38px;align-items:start} .toc{position:sticky;top:95px;border:1px solid var(--line);border-radius:18px;background:#fff;padding:16px} .toc strong{display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;color:#8090a8;padding:7px 9px} .toc a{display:block;padding:9px 10px;border-radius:9px;color:#465872;font-weight:700;font-size:.88rem} .toc a:hover{background:#edf3ff;color:var(--blue)} .article{min-width:0} .article > section{padding:0 0 70px} .article h2{font-size:2.35rem} .article h3{margin-top:28px} .introbox{padding:24px;border:1px solid var(--line);border-radius:18px;background:#fff;box-shadow:0 8px 28px rgba(28,64,117,.04)} .diagram{padding:24px;border-radius:20px;background:#0a1526;color:#fff;margin:22px 0} .diagram-grid{display:grid;grid-template-columns:1fr 38px 1fr 38px 1fr;gap:8px;align-items:center} .dnode{padding:18px;border:1px solid #29466f;border-radius:14px;background:#0f213c;text-align:center} .dnode strong{display:block}.dnode small{color:#9bb0d0} .darrow{text-align:center;color:#8ea5c8;font-size:1.2rem;font-weight:900} .callout{padding:18px 20px;border-left:4px solid var(--blue);background:#f1f6ff;border-radius:10px;color:#42536d;margin:20px 0} .warn{border-left-color:var(--red);background:#fff3f5;color:#7d3340} .tablewrap{overflow:auto;border:1px solid var(--line);border-radius:18px;background:#fff;margin:20px 0} table{width:100%;border-collapse:collapse;min-width:860px} th,td{padding:14px 16px;border-bottom:1px solid #edf1f7;text-align:left;vertical-align:top} th{background:#f7f9fd;font-size:.77rem;text-transform:uppercase;letter-spacing:.05em;color:#40516a} td{color:#52627a;font-size:.93rem} .ok{color:var(--green);font-weight:850}.no{color:#a73445;font-weight:850} .scenario{border:1px solid var(--line);border-radius:20px;background:#fff;margin:22px 0;overflow:hidden} .scenario-head{padding:18px 22px;background:#f8faff;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;gap:15px;align-items:center} .scenario-body{padding:22px} .route-line{display:grid;grid-template-columns:1fr 40px 1fr 40px 1fr;gap:8px;align-items:center;margin:16px 0} .route{padding:14px;border:1px solid var(--line);border-radius:13px;background:#fff} .route strong{display:block}.route small{color:#7888a1} .why{display:grid;grid-template-columns:repeat(2,1fr);gap:18px} .why div{padding:22px;border:1px solid var(--line);border-radius:18px;background:#fff} .codebox{background:#0b1524;color:#d9e7ff;border-radius:14px;padding:18px;overflow:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.88rem} .status-flow{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-top:18px} .status{padding:20px;border-radius:17px;background:#0d1e36;border:1px solid #20395e} .status strong{display:block}.status small{color:#96a9c6} .faq details{border:1px solid var(--line);border-radius:14px;padding:17px 19px;background:#fff;margin-bottom:10px} .faq summary{font-weight:850;cursor:pointer}.faq p{margin:12px 0 0} .cta{padding:82px 0;background:linear-gradient(135deg,#07111f,#102b5c);color:#fff} .cta h2{color:#fff}.cta p{color:#bccbe0} footer{background:#050b14;color:#9fb0c8;padding:52px 0 25px} .footgrid{display:grid;grid-template-columns:1.4fr repeat(4,1fr);gap:28px} footer h4{color:#fff;margin:0 0 12px}footer a{display:block;margin:7px 0;font-size:.88rem} .footnote{border-top:1px solid #172238;margin-top:30px;padding-top:18px;font-size:.8rem;color:#75859e} @media(max-width:980px){ .navlinks{display:none}.hero-grid,.content-layout{grid-template-columns:1fr}.toc{position:static} .diagram-grid,.route-line{grid-template-columns:1fr}.darrow,.map-arrow{transform:rotate(90deg)}.why{grid-template-columns:1fr}.status-flow{grid-template-columns:repeat(2,1fr)}.footgrid{grid-template-columns:repeat(2,1fr)} } @media(max-width:640px){ .container{width:min(100% - 26px,1200px)}h1{font-size:3rem}section{padding:68px 0}.status-flow{grid-template-columns:1fr}.footgrid{grid-template-columns:1fr}.navright a:first-child{display:none}.map-row{grid-template-columns:1fr} } img,svg{display:block;max-width:100%} .brand-mark svg{width:23px;height:23px;color:#fff} .brand-mark{ width:38px;height:38px;border-radius:12px; background:linear-gradient(145deg,var(--blue),var(--teal)); display:grid;place-items:center;box-shadow:0 8px 24px rgba(18,84,244,.24); }
Product Mapping Solution

Connect External Products to the Right Internal Action.

Product Mapping is the routing layer between a commerce provider's product catalog and Evoxup's internal product, membership, licensing and entitlement model.

ROUTING LAYER

External Product ≠ Internal Product

The mapping tells Evoxup what an external product means inside your WordPress business logic.

Gumroad Product
→
EVO Product
Lemon Squeezy Variant
→
Membership Plan
WooCommerce Product
→
Internal Fulfillment
Definition

What Product Mapping Actually Does

Product Mapping answers one question: “When this exact external product is sold, what should Evoxup treat it as internally?”

It does not create the commercial transaction, verify the payment provider by itself, or synchronize catalog metadata. Its responsibility is routing.

External CommerceProvider product ID
→
Mapping RouteStable translation rule
→
Evoxup DestinationProduct / Plan / supported target
Key distinction: the provider owns its external product identifier. Evoxup owns the internal destination and the fulfillment policy attached to it.
Why It Exists

Why Mapping Is Needed Even When the Product Names Match

Product names are not stable identifiers. Two providers can use the same display name, one provider can rename a product, and a single provider can expose variants or multiple product IDs for what is logically one offer.

Without Mapping

Business logic must guess from product names, provider-specific fields or custom conditionals. That becomes fragile as soon as a catalog changes.

With Mapping

A durable route connects the external product ID to a stable EVO Product or membership destination. Provider metadata can change without rewriting fulfillment logic.

Processing Flow

How a Sale Uses Product Mapping

StepSystem ResponsibilityWhat Happens
1. ReceiveIntegration layerA sale, order or provider event enters Evoxup.
2. VerifyProvider adapter / verification policyThe transaction or webhook is validated using the provider's supported mechanism.
3. NormalizeIntegration engineProvider-specific fields are converted into a common internal event.
4. IdentifyProduct MappingThe external product ID is looked up in the mapping table.
5. ResolveCoreThe mapped EVO Product, plan or supported internal target is resolved.
6. FulfillCore fulfillmentMembership, license and entitlements are created according to the destination policy.
7. RecordCore transaction/loggingThe result is stored and duplicate processing is prevented.
Product Mapping does not decide whether the provider event is trustworthy. Verification happens before mapping. Mapping decides what the verified product means internally.
Route Anatomy

What a Mapping Route Contains

FieldPurposeExample
ProviderIdentifies the commerce source.Gumroad
External Product IDStable provider-side product identifier.eikdRNgP7vmE7iJIgjlnjw==
External Variant IDOptional variant or plan identifier when the provider exposes one.Variant / option ID
Target TypeDefines what kind of internal object should receive the route.EVO Product / supported target
Target IDIdentifies the exact internal destination.EVO Product #123
Inherited PlanOptional relationship used when the destination product grants membership.PRO Plan
StatusControls whether the route is active.Active
Real Scenarios

Examples of How Mapping Changes the Workflow

Scenario A — Gumroad sale grants membership + license External Commerce

A customer buys a Gumroad product. The provider transaction is verified, then the external product ID is mapped to an EVO Product that carries the membership and licensing policy.

Gumroad ProductExternal product ID
→
EVO ProductInternal commercial identity
→
Membership + LicenseFulfillment result
Scenario B — Two providers sell the same internal product Multi-Provider

Gumroad and another provider can each have their own external product IDs while both map to the same EVO Product.

Gumroad product A ─┐ ├──→ EVO Product #123 ───→ same fulfillment policy Provider B item 92 ─┘

The external catalogs remain different. The internal business object remains the same.

Scenario C — One provider product has multiple variants Variants

Variants can route to different internal destinations when the provider exposes a stable variant identifier.

External VariantMapped DestinationResult
FREEFREE EVO ProductFREE entitlement
PROPRO EVO ProductPRO membership / entitlement
SUPERSUPER EVO ProductSUPER membership / entitlement
Do Not Confuse These

Product Mapping vs Product Sync

These two extensions can work together, but they solve different problems.

CapabilityProduct MappingProduct Sync
Determines internal destinationYesNo
Stores provider product relationshipYesReads catalog metadata
Updates product nameNoYes
Updates provider price/status/URLNoYes
Controls fulfillment routeYesNo
Can run on a scheduleNot its purposeYes, where configured
Data Ownership

Why Mapping Data Belongs to Core

The mapping relationship affects actual sales fulfillment. That makes it business data, not merely user-interface state.

The Product Mapping extension can provide the professional interface for discovery, filters, editing and management, while Core remains responsible for storing and using the mapping data.

This design means uninstalling or reinstalling the Product Mapping management extension does not need to erase the underlying business routes used by Core.
Operational States

How to Read the Mapping Interface

DiscoveredProvider product has been found by discovery/sync.
MappedAn internal destination has been assigned.
UnmappedKnown provider product has no internal route yet.
Live RouteActive route currently available for fulfillment.
A discovered product is not automatically safe to fulfill. Discovery tells Evoxup that the item exists; mapping tells Evoxup what it should do with it.
Failure Handling

What Happens When a Route Is Missing or Wrong

ConditionExpected BehaviorAdministrator Action
Product discovered but unmappedDo not silently grant an arbitrary product.Create the intended mapping route.
Mapped destination deletedRoute should be treated as invalid/broken.Remap to a valid internal target.
Provider changed product nameMapping should still work if the external ID is unchanged.Run Product Sync if display metadata needs refreshing.
Provider changed product IDExisting route no longer matches the new ID.Discover the new product and create/update the route.
Duplicate webhook receivedCore duplicate protection should prevent repeated fulfillment.Review transaction history if needed.
Security Boundary

Mapping Is Not Verification

Product Mapping should only operate on a transaction after the integration layer has applied the provider's authenticity or transaction-verification policy.

Provider VerificationIs this event trustworthy?
→
Product MappingWhat does the product mean?
→
FulfillmentWhat access should be granted?
Never use a matching product ID as proof that the incoming transaction itself is authentic.
FAQ

Common Product Mapping Questions

Can two external products map to the same EVO Product?

Yes. That is one of the main benefits of a stable internal product model. Multiple provider-side items can route to the same internal destination when that reflects the business model.

Can one external product map to multiple membership plans?

The mapping should resolve to the appropriate internal destination, while the EVO Product itself can carry the plan relationships and bundle logic defined by the Core product model.

Does Product Mapping synchronize prices?

No. Provider metadata synchronization belongs to Product Sync. Product Mapping controls routing.

Does uninstalling the Product Mapping UI remove mappings?

The intended architecture keeps business mapping data in Core, so the management extension can be replaced or reinstalled without treating mappings as disposable UI state.

Should mapping happen before webhook verification?

No. Verification establishes trust in the event. Mapping determines the internal destination after that trust decision.

Stable Internal Routing

Let Providers Sell. Let Evoxup Decide What the Sale Means.

Use Product Mapping to isolate external catalogs from your internal product, membership and licensing architecture.