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
| Step | System Responsibility | What Happens |
| 1. Receive | Integration layer | A sale, order or provider event enters Evoxup. |
| 2. Verify | Provider adapter / verification policy | The transaction or webhook is validated using the provider's supported mechanism. |
| 3. Normalize | Integration engine | Provider-specific fields are converted into a common internal event. |
| 4. Identify | Product Mapping | The external product ID is looked up in the mapping table. |
| 5. Resolve | Core | The mapped EVO Product, plan or supported internal target is resolved. |
| 6. Fulfill | Core fulfillment | Membership, license and entitlements are created according to the destination policy. |
| 7. Record | Core transaction/logging | The 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
| Field | Purpose | Example |
| Provider | Identifies the commerce source. | Gumroad |
| External Product ID | Stable provider-side product identifier. | eikdRNgP7vmE7iJIgjlnjw== |
| External Variant ID | Optional variant or plan identifier when the provider exposes one. | Variant / option ID |
| Target Type | Defines what kind of internal object should receive the route. | EVO Product / supported target |
| Target ID | Identifies the exact internal destination. | EVO Product #123 |
| Inherited Plan | Optional relationship used when the destination product grants membership. | PRO Plan |
| Status | Controls 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 Variant | Mapped Destination | Result |
| FREE | FREE EVO Product | FREE entitlement |
| PRO | PRO EVO Product | PRO membership / entitlement |
| SUPER | SUPER EVO Product | SUPER membership / entitlement |
Do Not Confuse These
Product Mapping vs Product Sync
These two extensions can work together, but they solve different problems.
| Capability | Product Mapping | Product Sync |
| Determines internal destination | Yes | No |
| Stores provider product relationship | Yes | Reads catalog metadata |
| Updates product name | No | Yes |
| Updates provider price/status/URL | No | Yes |
| Controls fulfillment route | Yes | No |
| Can run on a schedule | Not its purpose | Yes, 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
| Condition | Expected Behavior | Administrator Action |
| Product discovered but unmapped | Do not silently grant an arbitrary product. | Create the intended mapping route. |
| Mapped destination deleted | Route should be treated as invalid/broken. | Remap to a valid internal target. |
| Provider changed product name | Mapping should still work if the external ID is unchanged. | Run Product Sync if display metadata needs refreshing. |
| Provider changed product ID | Existing route no longer matches the new ID. | Discover the new product and create/update the route. |
| Duplicate webhook received | Core 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.